Печать сообщения консоли при нажатии QPushButton

Я новичок в Python, и я хочу сделать простой код для печати сообщения в консоли Python при нажатии QPushButton. Я разделил код на 2 .py файла (один для пользовательского интерфейса, а другой для основного приложения). Хотя это должно было быть очень просто, мне все же не удалось заставить его работать.

Я вполне уверен, что это ошибка новичка, но я не могу найти, что не так, когда я проверяю ответы из похожих постов или даже сравниваю с аналогичным кодом из других постов на этом форуме.

"Тест от основного!", "Тест от основного - 2-й раз!" и "Тест от редактирования!" на консоли появились строки печати, но я не знаю, почему две другие не вызываются при нажатии кнопки. Я предполагаю, что я делаю что-то не так с методом clicked.connect().

Спасибо вам всем большое.

Код файла следующий:

Код пользовательского интерфейса:

from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):

    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(850, 450)     

        self.pushButton_2 = QtGui.QPushButton(Dialog)
        self.pushButton_2.setGeometry(QtCore.QRect(100, 60, 251, 61))
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))

        self.pushButton_Selection = QtGui.QPushButton(Dialog)
        self.pushButton_Selection.setGeometry(QtCore.QRect(148, 250, 161, 61))
        self.pushButton_Selection.setObjectName(_fromUtf8("pushButton_Selection"))  

        self.retranslateUi(Dialog)        

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Communication", None))        
        self.pushButton_2.setText(_translate("Dialog", "Print Line", None))        
        self.pushButton_Selection.setText(_translate("Dialog", "Select sensor", None))        

        print "Test from edit!"

Основной код файла:

import sys
import PyQt4.QtCore as QtCore
import PyQt4.QtGui as QtGui

from EditTxt_ui import Ui_Dialog

print "Test from main!"

class MyForm(QtGui.QMainWindow, Ui_Dialog):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)
        self.ui.setupUi(self)

        self.pushButton_2.clicked.connect(self.print_LineEdit)
        self.pushButton_Selection.clicked.connect(self.print_Selection)

    print "Test from main - 2nd time!"

    def print_LineEdit(self):
        print "Print from LineEdit!"

    def print_Selection(self):                      
        print "Print Selection!"            

if __name__ == "__main__":  
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_Dialog()
    ui.setupUi(MainWindow)
    MainWindow.show()    
    sys.exit(app.exec_())

2 ответа

Решение

Две проблемы в вашем коде:

  • Вы не создаете экземпляр класса MyForm.

  • Кнопки создаются в классе Ui_Dialog, но вы пытаетесь получить к ним доступ из MyForm.

Если вы хотите получить доступ к кнопкам в MyForm, вам нужно создать экземпляр Ui_Dialog в MyForm, например так:

class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)

        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.ui.pushButton_2.clicked.connect(self.print_LineEdit)
        self.ui.pushButton_Selection.clicked.connect(self.print_Selection)

    def print_LineEdit(self):
        print "Print from LineEdit!"

    def print_Selection(self):                      
        print "Print Selection!"            

if __name__ == "__main__":  
    app = QtGui.QApplication(sys.argv)
    MainWindow = MyForm()
    MainWindow.show()    
    sys.exit(app.exec_())

Другим решением было бы поместить функции print_LineEdit и print_Selection в класс Ui_Dialog.

Но для действительно простого приложения, подобного этому, я бы поместил все в главном файле в один класс, например так:

import sys
import PyQt4.QtCore as QtCore
import PyQt4.QtGui as QtGui

class MyForm(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)

        self.pushButton_2=QtGui.QPushButton("Print Line")
        self.pushButton_Selection=QtGui.QPushButton("Select sensor")

        self.pushButton_2.clicked.connect(self.print_LineEdit)
        self.pushButton_Selection.clicked.connect(self.print_Selection)

        #layout
        vbox=QtGui.QVBoxLayout()
        vbox.addWidget(self.pushButton_2)
        vbox.addWidget(self.pushButton_Selection)
        self.setLayout(vbox)

    def print_LineEdit(self):
        print "Print from LineEdit!"

    def print_Selection(self):                      
        print "Print Selection!"            

if __name__ == "__main__":  
    app = QtGui.QApplication(sys.argv)
    MainWindow = MyForm()
    MainWindow.show()    
    sys.exit(app.exec_())

(Я не беспокоился о макете, но вы могли)

Вы получаете эту ошибку, потому что экземпляр MyForm нигде не объявлен в коде. Вы вызываете функцию в этом классе init, но класс не создан.

В этих случаях лучше создать функцию в классе Ui_Dialog, которая создает экземпляр класса по нажатию кнопки и вызывает функции в конструкторе, чтобы распечатать результаты.

Другие вопросы по тегам