0

我正在使用 Qt 设计器使用 PyQt4。这是我第一次使用它,所以我只是想了解一些事情,但这让我很难过。

我遇到的问题是,一旦定义和创建了 UI 窗口,我尝试调用一个函数来更新 UI 元素,它会产生“未定义”错误。

但是,如果我将相同的代码放在最初定义元素的代码块中,它就可以正常工作。

我在下面写了一个例子来更清楚地说明我的意思。

问题是我需要调用以更新来自不同模块的液晶显示器编号,该模块包含单击按钮时调用的函数。

为了展示这一点,我在 qtdesigner 中制作了一个带有 lcdnumber (lcd1) 和一个按钮 (button1) 的表单,在文件“testui.py”中编译了代码,从而创建了“MainWindow”类。

在 a.py 中,我放了:

import testui as interface
import sys
import b
from PyQt4 import QtCore,  QtGui

ui= interface.Ui_MainWindow()

def updateui():
   for i in range(0, 100):
       ui.lcd1.setProperty("value", i)

if __name__ == "__main__":
   app = QtGui.QApplication(sys.argv)
   test = QtGui.QMainWindow()
   ui.setupUi(test)
   ui.lcd1.setProperty("value", 1)
   ui.button1.clicked.connect(b.updatelcd)
   test.show()
   app.exec_()

这将打开窗口,设置初始状态并将按钮连接到 b.py 中的函数。

在 b.py 中,我放了:

from a import updateui

def updatelcd():
   updateui()

当我单击按钮时,这会调用 a.py 中的函数,这会导致错误:

“模块没有属性 lcd1”

这让我困惑了一段时间,因为 ui.lcd1.setProperty 在循环中工作!

我正在做的事情一定有根本性的错误,但我无法解决。

任何想法表示赞赏

谢谢

4

1 回答 1

2

您正在做一种循环导入,这本身并不是一个好主意。

这里发生的是:
当您导入 a 时updateui,ui 变量不会被导入。
ui 变量可能是全局变量,但仅在您的模块中。
因此,当您调用从中导入的调用的函数updatelcd时,您会得到一个for,因为 ui 未初始化。bupdateuiaNameErrorlcd1

实际上,我不确定为什么它首先不抱怨 ui。可能是 python 导入了在 a 中定义了一个全局变量 ui 的知识。

您应该考虑如何在没有循环导入的情况下实现目标,而不仅仅是导入函数“updateui froma inb and includingb a ”。in

您不仅应该考虑拥有模块,还应该考虑拥有类。使其面向对象。那么你可以做什么:
1. 在你的 b 模块中创建一个类,它会按照你的模块现在所做的一切。
2. 创建一个以interface.Ui_MainWindow()为参数并存储它的构造函数。
3.在此您将能够执行您的updatelcd(无需使用a中定义的任何方法)
4.在您的a-module中创建b-class的实例。在这种情况下,您可以调用更新 lcd 的函数。

这就是您的 b 级代码的样子

class B:
  __init__(self, mainWindow):
    self.mainWindow = mainWindow

  def updatelcd(self):
    for i in range(0, 100):
      self.mainWindow.lcd1.setProperty("value", i)

所以模块 a 看起来像这样:

import testui as interface
import sys
import b
from PyQt4 import QtCore,  QtGui

ui= interface.Ui_MainWindow()
thing = b.B(ui) 

if __name__ == "__main__":
 app = QtGui.QApplication(sys.argv)
 test = QtGui.QMainWindow()
 ui.setupUi(test)
 ui.lcd1.setProperty("value", 1)
 ui.button1.clicked.connect(thing.updatelcd())
 test.show()
 app.exec_()
于 2013-05-29T19:36:07.987 回答