【问题标题】:Passing global variables to function in PyQt5将全局变量传递给 PyQt5 中的函数
【发布时间】:2020-02-23 16:13:06
【问题描述】:

我正在创建应用程序,这需要从屏幕键盘输入一些值。我已经有带有数字的按钮调用该函数,它应该更新我想使用的数字。但每次按下按钮时,都应填写不同的小数位。所以我需要两个全局变量:一个用于当前数字,另一个用于当前小数位。但是我不知道这两个变量的定义放在哪里,所以它们被认为是全局变量,可以在任何函数内部使用。我的代码如下所示:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QFileDialog, QMessageBox
from PyQt5.QtCore import QTimer
from mainwindow import Ui_MainWindow


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
   def __init__(self, *args, obj=None, **kwargs):
      super(MainWindow, self).__init__(*args, **kwargs)
      self.setupUi(self)
      self.kpadBtn0.clicked.connect(lambda:self.setValue(0))
      self.kpadBtn1.clicked.connect(lambda:self.setValue(1))
      self.kpadBtn2.clicked.connect(lambda:self.setValue(2))
      self.kpadBtn3.clicked.connect(lambda:self.setValue(3))
      self.kpadBtn4.clicked.connect(lambda:self.setValue(4))
      self.kpadBtn5.clicked.connect(lambda:self.setValue(5))
      self.kpadBtn6.clicked.connect(lambda:self.setValue(6))
      self.kpadBtn7.clicked.connect(lambda:self.setValue(7))
      self.kpadBtn8.clicked.connect(lambda:self.setValue(8))
      self.kpadBtn9.clicked.connect(lambda:self.setValue(9))

   disp_pos=1  #here it does not work
   val=0

   def setValue(self,num):
      val+=num*disp_pos   #it should be usable here
      disp_pos*=10
      self.newPosDisplay.setText(str(val))

app = QtWidgets.QApplication(sys.argv)

window = MainWindow()
window.show()
app.exec()

当我按下按钮时,会显示以下错误:

NameError: name 'val' is not defined

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    使用全局变量作为最后的选择,因为滥用它们会带来问题,如Why are global variables evil? 所示。在您的情况下, dispos_pos 和 val 是该类的属性就足够了:

    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self, *args, obj=None, **kwargs):
            super(MainWindow, self).__init__(*args, **kwargs)
            self.setupUi(self)
    
            self.disp_pos = 1
            self.val = 0
    
            self.kpadBtn0.clicked.connect(lambda: self.setValue(0))
            self.kpadBtn1.clicked.connect(lambda: self.setValue(1))
            self.kpadBtn2.clicked.connect(lambda: self.setValue(2))
            self.kpadBtn3.clicked.connect(lambda: self.setValue(3))
            self.kpadBtn4.clicked.connect(lambda: self.setValue(4))
            self.kpadBtn5.clicked.connect(lambda: self.setValue(5))
            self.kpadBtn6.clicked.connect(lambda: self.setValue(6))
            self.kpadBtn7.clicked.connect(lambda: self.setValue(7))
            self.kpadBtn8.clicked.connect(lambda: self.setValue(8))
            self.kpadBtn9.clicked.connect(lambda: self.setValue(9))
    
        def setValue(self, num):
            self.val += num * self.disp_pos
            self.disp_pos *= 10
            self.newPosDisplay.setText(str(self.val))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2017-07-06
      相关资源
      最近更新 更多