Нажатие кнопки PyQt на Python не вызовет событие

#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:

  1. Создайте экземпляр второго окна один раз в конструкторе главного окна. self.w = AnotherWindow (self)
  2. При создании экземпляра второго окна self.w = AnotherWindow (self) self передается как родительский, так что, когда главное окно закрывается, второе окно также закрывается.
  3. Чтобы получить текст из виджета QLineEdit — применить QString text() const , подробнее https://doc.qt.io/qt-5/qlineedit.html#text-prop
  4. Вы не показали метод 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 Я добавил некоторые пояснения к своему ответу