Передача глобальных переменных в функцию в PyQt5 - PullRequest
1 голос
/ 23 февраля 2020

Я создаю приложение, которое требует ввода некоторых значений с экранной клавиатуры. У меня уже есть кнопки с номерами, вызывающими функцию, которая должна обновить номер, который я хотел бы использовать. Но каждый раз, когда нажимается кнопка, должна быть заполнена другая десятичная позиция. Поэтому мне нужны две глобальные переменные: одна для текущего числа и другая для текущей десятичной позиции. Но я не знаю, куда поместить определения этих двух переменных, чтобы они рассматривались как глобальные и могли использоваться внутри любой функции. Мой код выглядит следующим образом:

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

1 Ответ

2 голосов
/ 23 февраля 2020

Используйте глобальные переменные в качестве последней опции, так как злоупотребление ими вызывает проблемы, как указано в Почему глобальные переменные являются злыми? . В вашем случае достаточно, чтобы утилиты extract_pos и val были атрибутами класса:

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, *args, obj=None, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setupUi(self)

        <b>self.disp_pos = 1
        self.val = 0</b>

        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):
        <b>self.val += num * self.disp_pos
        self.disp_pos *= 10
        self.newPosDisplay.setText(str(self.val))</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...