【问题标题】:How do I pass extra arguments to PyQt GUI functions?如何将额外的参数传递给 PyQt GUI 函数?
【发布时间】:2018-01-02 00:23:58
【问题描述】:

我正在尝试使用一些图形小部件为我的孩子构建一个简单的 1x1 练习工具。如下图所示,“新问题”按钮在内部生成 2 个随机数并将其显示在文本字段中。用户必须在 = 旁边提供结果。使用“检查结果”,我想要一个条件指令:

  1. 如果结果正确,则打印“正确!结果是...”并将背景颜色更改为绿色。
  2. 如果结果错误,打印“...”并将背景颜色更改为红色

现在,问题是:我在连接到“新问题”按钮的函数中生成随机数。如果我点击“检查结果”,这些数字将不会传递给“检查结果”按钮。如果没有类定义,我通常通过返回传递值,但是,在这里使用类 self 它不起作用。

  • 问题1:解决此问题的最佳方法是什么?
  • 问题2:我不知道如何更改这些文本字段的颜色。

非常感谢任何帮助!

目前我得到的代码是:

from PyQt4 import QtGui
import sys
import random
import numpy as np
import new_design6  # translated from Qt designer (not relevant for this question)

class ExampleApp(QtGui.QMainWindow,new_design6.Ui_MainWindow):


    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)
        self.exit_app.clicked.connect(self.exit_application)
        self.get_new_problem.clicked.connect(self.generate_new_problem)
        self.check_result.clicked.connect(self.check_problem_result)


    def generate_new_problem(self):
        # clear each field 
        self.show_problem.clear()
        self.input_result.clear()
        self.show_result.clear()

        u = int(np.random.randint(0,11,1))
        v = int(np.random.randint(0,11,1))
        w = str(u) + " x " + str(v)

        self.show_problem.setReadOnly(True)
        self.show_problem.setPlainText(w)
        # how to pass my random numbers ?
        return(u,v) #*---> Problem line1* 


    def check_problem_result(self,u,v): #*---> Problem line1* 
        input_result_number=self.input_result.toPlainText()
        result=int(input_result_number)

        # here I'd like to have a conditional question to check if result is correkt or wrong
        if (result == u*v):
            result_string="Correct! Result is:  " + str(result)
            self.show_result.setPlainText(result_string)
        else: 
            result_string="Wrong! Result is:  " + str(result) + "Try another one"


    def exit_application(self):
        self.close()

def main():
    app = QtGui.QApplication(sys.argv)
    form = ExampleApp()
    form.show()
    app.exec_()

if __name__=='__main__':
    main()

【问题讨论】:

    标签: python python-2.7 pyqt pyqt4


    【解决方案1】:

    一种适当的方法是创建一个管理操作的类:

    class Operation:
        def __init__(self):
            self.params = []
    
        def setParams(self, params):
            self.params = params
    
        def process(self):
            # processing
            u, v = self.params
            result = u*v
            return result 
    
        def toString(self):
            return "{}x{}".format(*self.params)
    

    然后创建一个此类对象作为小部件的属性并处理逻辑,因为它是可以在类的整个范围内访问的属性。

    要更改颜色,我使用小部件的 QPalette,如下代码所示:

    class ExampleApp(QtGui.QMainWindow,new_design6.Ui_MainWindow):
        def __init__(self):
            super(self.__class__, self).__init__()
            self.setupUi(self)
            self.exit_app.clicked.connect(self.close)
            self.get_new_problem.clicked.connect(self.generate_new_problem)
            self.check_result.clicked.connect(self.check_problem_result)
            self.operation = Operation()
            self.show_problem.setReadOnly(True)
    
        def generate_new_problem(self):
            self.show_problem.clear()
            self.input_result.clear()
            self.show_result.clear()
            pal = self.show_result.palette()
            pal.setColor(QtGui.QPalette.Base, QtCore.Qt.white)
            self.show_result.setPalette(pal)
            u = int(np.random.randint(0,11,1))
            v = int(np.random.randint(0,11,1))
            params = u, v
            self.operation.setParams(params)        
            self.show_problem.setPlainText(self.operation.toString())
    
        def check_problem_result(self):
            input_result_number = self.input_result.toPlainText()
            result = int(input_result_number)
            pal = self.show_result.palette()
            if self.operation.process() == result:
                result_string="Correct! Result is:  {}".format(result)
                pal.setColor(QtGui.QPalette.Base, QtCore.Qt.green)
            else: 
                result_string="Wrong! Result is: {} Try another one".format(result)
                pal.setColor(QtGui.QPalette.Base, QtCore.Qt.red)
            self.show_result.setPlainText(result_string)
            self.show_result.setPalette(pal)
    

    【讨论】:

    • 感谢您的建议。我刚刚添加了您的代码并运行它。它只调用了 GUI,但是,当我按下“新问题”按钮时,它杀死了内核而没有任何信息。以下层次结构是否正确? --> 'class ExampleApp' def def def def 先出现,然后我添加了 'class Object' 因为它是这些小部件的属性?
    • @cyclomen 分享您的完整项目,通过 Dropbox 或类似工具查看问题所在。
    • 没问题,没什么特别的 - 见这里“new_design6.py”:drive.google.com/file/d/1O9-XELAGsPlov2s18M6mjdmS71JzbMQD/… 和 main2.py:drive.google.com/file/d/1oN-0iazJgG_ABgOKwzzsWrfX2jwn6bz1/…
    • @cyclomen 错误很简单,需要导入QtCore,修改from PyQt4 import QtGuifrom PyQt4 import QtGui, QtCore
    • 太好了,感激不尽!
    猜你喜欢
    • 2013-07-24
    • 2016-02-16
    • 2021-02-27
    • 1970-01-01
    • 2016-06-08
    • 2017-04-09
    相关资源
    最近更新 更多