PyQt4如何将按钮信号发送到Python中的另一个类?

时间:2016-05-15 05:37:53

标签: python user-interface pyqt4

我需要你的建议和帮助我的代码。

我正在制作一个GUI程序。基本上该程序执行以下操作:

  1. 从用户
  2. 获取输入
  3. 当按下某个按钮时,程序将检索所有输入并将其保存在数据库中
  4. 该程序进行计算。
  5. 显示输出
  6. 这是程序的简单版本,计算器程序: simple GUI program, calculator

    如图所示,它需要来自用户的4个输入,(1)var1的任何整数,(2)var2的任何整数,(3)运算符(加法或减法)和(4)单击按钮。

    GUI是使用QtDesigner设计的。

    这是我的代码:

    import sys
    import sqlite3
    from PyQt4 import QtCore, QtGui
    from testgui import Ui_MainWindow
    
    class ShowAndInput(QtGui.QMainWindow):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
    
            #connect to the database
            self.connect_to_db()
    
            #create table in the database
            self.create_table()
    
            #add items to the comboBox
            self.add_items()
    
            #calculate button to start calculating, gives signal to the next class Calculate
            self.ui.pushButton_3.clicked.connect(self.calculate)
    
            #close button to close the window
            QtCore.QObject.connect(self.ui.pushButton,QtCore.SIGNAL("clicked()"), quit)
    
            self.conn.close()
    
        def connect_to_db(self):
            self.conn = sqlite3.connect('testguidb.sqlite3')
            self.cur = self.conn.cursor()
    
        def create_table(self):
            self.cur.execute('''CREATE TABLE IF NOT EXISTS Input (var1 INTEGER, var2 INTEGER)''')
            self.conn.commit()
    
        def add_items(self):
            lst = ['addition', 'subtraction']
            self.ui.comboBox.clear()
            self.ui.comboBox.addItems(lst)
    
        def calculate(self):
            calculate = Calculate(self)
            calculate.exec_()
    

    因此,第一个类的目的是显示GUI并从用户那里获取输入。如果用户单击名为“Calculate”的按钮,它应该连接到名为“Calculate”的新类。

    这是我的Calculate类的代码:

    class Calculate(QtGui.QMainWindow):
        def __init__(self, parent = None):
            QtGui.QWidget.__init__(parent)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
    
            #validator to validate that the input is integer or digit
    
            #connect to database
            self.connect_to_db()
    
            #get the input values and store them in the database
            self.get_the_values()
    
            #print the output
            PrintOutcome()
    
        def connect_to_db(self):
            self.conn = sqlite3.connect('testguidb.sqlite3')
            self.cur = self.conn.cursor()
    
        def get_the_values(self):
            dicti = {}
            dicti['var1'] = self.ui.lineEdit.text()
            dicti['var2'] = self.ui.lineEdit_2.text()
            for key, val in sorted(dicti.items()):
                key = str(key)
                val = int(val)
                self.cur.execute('INSERT OR IGNORE INTO Input (?) VALUES (?)',(key,val))
                self.conn.commit()
    

    在这个类的最后,它调用另一个名为'PrintOutcome'的类来打印QTextBrowser中的结果。这是代码的最后一部分:

    class PrintOutcome(QtGui.QMainWindow):
        def __init__(self, parent = None):
            QtGui.QWidget.__init__(parent)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
    
            #connect to database
            self.connect_to_db()
    
            #get the value of the combobox
            self.get_combox()       
    
            #print the output
            if self.operator == 'addition': self.print_add()
            elif self.operator == 'subtraction': self.print_sub()
    
        def connect_to_db(self):
            self.conn = sqlite3.connect('testguidb.sqlite3')
            self.cur = self.conn.cursor()
    
        def get_combox(self):
            self.operator = str(self.ui.comboBox.currentText())
    
        def print_add(self):
            dicti={}
            for i in range(2):
                i = i + 1
                dicti['var{0}'.format(i)] = self.cur.execute('SELECT var{0} FROM Input'.format(i))
                dicti['var{0}'.format(i)] = int(self.cur.fetchone()[0])
                text = str(dicti['var{0}'.format(i)])
                self.ui.textBrowser.append(text)
            result = dicti['var1'] + dicti['var2']
            textsep = '-'*25+'(+)'      
            text = str(result)      
            self.ui.textBrowser.append(text)
            self.ui.textBrowser.append(text)
    
        def print_sub(self):
            dicti={}
            for i in range(2):
                i = i + 1
                dicti['var{0}'.format(i)] = self.cur.execute('SELECT var{0} FROM Input'.format(i))
                dicti['var{0}'.format(i)] = int(self.cur.fetchone()[0])
                text = str(dicti['var{0}'.format(i)])
                self.ui.textBrowser.append(text)
            result = dicti['var1'] + dicti['var2']
            textsep = '-'*25+'(-)'      
            text = str(result)      
            self.ui.textBrowser.append(text)
            self.ui.textBrowser.append(text)
    
    if __name__=='__main__':
        app = QtGui.QApplication(sys.argv)
        myapp = ShowAndInput()
        myapp.show()
        sys.exit(app.exec_())
    

    当我跑步时,一切都很好。但是当我按下计算按钮时,它返回了一条错误消息。 everything is fine when I run it

    Get an error message when I click the calculate button

    以下是错误消息:RuntimeError:从未调用过计算类型的超类 init ()。

    任何回应都将不胜感激。非常感谢。

    此致

    阿诺德

0 个答案:

没有答案