#python #pyqt5
#python #pyqt5
Вопрос:
я новичок в PyQt, но у меня есть проблема, которую я не могу решить. Я пытаюсь получить текст из второго окна и установить его в поле, поэтому, когда я закрываю второе окно, я могу распечатать его из первого главного окна, но моя кнопка «AnotherWindow» не запускает событие, и я действительно не знаю почему? Вот код. Кто-нибудь может меня направить? Спасибо
class AnotherWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(1200, 600)
self.text = "basetext"
self.layoutf = QFormLayout()
self.buttonf = QPushButton("get text")
self.buttonf.clicked.connect(lambda: self.getText)
self.line = QLineEdit()
self.layoutf.addRow(self.buttonf,self.line)
self.widgetf = QWidget()
self.widgetf.setLayout(self.layoutf)
self.setCentralWidget(self.widgetf)
def getText(self):
print(self.line.text)
self.text = self.line.text
self.close()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.w = None # No external window yet.
self.mainLayout = QGridLayout()
self.button = QPushButton("Push for Window")
self.button.clicked.connect(self.show_new_window)
self.button1 = QPushButton("Push ")
self.button1.clicked.connect(self.printFromSecondWindow)
self.mainLayout.addWidget(self.button,0,0)
self.mainLayout.addWidget(self.button1, 0, 1)
self.widget = QWidget()
self.widget.setLayout(self.mainLayout)
self.setCentralWidget(self.widget)
def show_new_window(self):
if self.w is None:
self.w = AnotherWindow()
self.w.show()
else:
self.w.close() # Close window.
self.w = None # Discard reference.
def printFromSecondWindow(self):
print(self.w.text)
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
Комментарии:
1. Я не совсем уверен, правильно ли я вас понимаю, но если вы хотите напечатать текст из lineEdit, например, в консоль или где-то еще, перейдите
print(self.line.text)
def getText
вprint(self.line.text())
функцию.
Ответ №1:
Проблема в self.buttonf.clicked.connect(...)
том, что . Этот вызов присоединяет функцию к действию «нажал» на кнопку. Функция вызывается без параметров, и возврат просто отбрасывается. В вашем случае lambda: self.get_text
это функция, которая ничего не делает, кроме как возвращает адрес self.get_text
метода. Поскольку get_text
не требует никаких дополнительных параметров, вы можете привязать его непосредственно к этому слоту.
self.buttonf.clicked.connect(self.get_text)
Позже у вас также есть ошибка, из-за которой вам нужно вызвать текстовый метод. С этими двумя изменениями рабочая программа
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *
class AnotherWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(1200, 600)
self.text = "basetext"
self.layoutf = QFormLayout()
self.buttonf = QPushButton("get text")
self.buttonf.clicked.connect(self.getText)
self.line = QLineEdit()
self.layoutf.addRow(self.buttonf,self.line)
self.widgetf = QWidget()
self.widgetf.setLayout(self.layoutf)
self.setCentralWidget(self.widgetf)
def getText(self):
print("the info", self.line.text())
self.text = self.line.text()
self.close()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.w = None # No external window yet.
self.mainLayout = QGridLayout()
self.button = QPushButton("Push for Window")
self.button.clicked.connect(self.show_new_window)
self.button1 = QPushButton("Push ")
self.button1.clicked.connect(self.printFromSecondWindow)
self.mainLayout.addWidget(self.button,0,0)
self.mainLayout.addWidget(self.button1, 0, 1)
self.widget = QWidget()
self.widget.setLayout(self.mainLayout)
self.setCentralWidget(self.widget)
def show_new_window(self):
if self.w is None:
self.w = AnotherWindow()
self.w.show()
else:
self.w.close() # Close window.
self.w = None # Discard reference.
def printFromSecondWindow(self):
print(self.w.text)
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
Комментарии:
1. Большое вам спасибо за объяснение, теперь я понимаю
2. @vannie92 если ответ полезен, пожалуйста, поддержите его (щелкните стрелку вверх). И если оно отвечает на ваш вопрос, примите его (установите флажок).
Ответ №2:
- Создайте экземпляр второго окна один раз в конструкторе главного окна.
self.w = AnotherWindow (self)
- При создании экземпляра второго окна
self.w = AnotherWindow (self)
—self
передается как родительский, так что, когда главное окно закрывается, второе окно также закрывается. - Чтобы получить текст из виджета QLineEdit — применить
QString text() const
, подробнее https://doc.qt.io/qt-5/qlineedit.html#text-prop - Вы не показали метод
printFromSecondWindow
, в котором, как я понимаю, вы хотели показать, что вы намеревались.
Попробуйте:
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *
class AnotherWindow(QMainWindow):
def __init__(self, parent=None):
super(AnotherWindow, self).__init__(parent)
self.widgetf = QWidget()
self.setCentralWidget(self.widgetf)
# self.resize(1200, 600)
self.text = "basetext"
self.layoutf = QFormLayout(self.widgetf)
self.buttonf = QPushButton("get text")
# self.buttonf.clicked.connect(lambda: self.getText) # ??? lambda
self.buttonf.clicked.connect(self.getText)
self.line = QLineEdit()
self.layoutf.addRow(self.buttonf,self.line)
def getText(self):
print(self.line.text()) # ! .text()
self.text = self.line.text() # ! .text()
self.close()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.widget = QWidget()
self.setCentralWidget(self.widget)
# ? self.w = None # No external window yet.
self.button = QPushButton("Push for Window")
self.button.clicked.connect(self.show_new_window)
self.button1 = QPushButton("Push ")
self.button1.clicked.connect(self.printFromSecondWindow)
self.mainLayout = QGridLayout(self.widget)
self.mainLayout.addWidget(self.button, 0, 0)
self.mainLayout.addWidget(self.button1, 0, 1)
self.w = AnotherWindow(self) #
def show_new_window(self):
# if self.w is None:
# self.w = AnotherWindow()
self.w.show() # !
# else:
# self.w.close() # Close window.
# self.w = None # Discard reference.
def printFromSecondWindow(self): #
print(self.w.text)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Комментарии:
1. Большое вам спасибо, Ник, это работает. Я не уверен, правильно ли я это понимаю, но проблема заключалась в том, что я должен был установить родительский элемент второго окна на основной?
2. @vannie92 Я добавил некоторые пояснения к своему ответу