2015-05-21 2 views
1

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

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

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

Танк у вас всех очень много.

код файла выглядит следующим образом:

Код UI:

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_()) 

ответ

0

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

  • Вы не создаете экземпляр класса 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_()) 

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

1

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

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

Смежные вопросы