gpt4 book ai didi

python - pyqt:如何在外部变量值更改时动态更新小部件属性?

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:21 26 4
gpt4 key购买 nike

我有 class Ui_MainWindow(object) 创建一个带有进度条的窗口和 class OtherClass(object) 包含局部 int 变量循环递增的方法.

如何将局部变量值变化与进度条值变化联系起来?

主界面.py

import sys
from PyQt4.uic.Compiler.qtproxies import QtGui
from PyQt4 import QtGui
from Ui_MainWindow import Ui_MainWindow

def main():

app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())



if __name__ == '__main__':
main()

Ui_MainWindow.py

from PyQt4 import QtCore, QtGui
from MainGui.OtherClass import OtherClass

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s

class Ui_MainWindow(object):

def myButtonSlot(self):
objVar=OtherClass()
objVar.method()

def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(389, 332)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))

self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.pushButton.clicked.connect(self.myButtonSlot)
self.verticalLayout.addWidget(self.pushButton)

self.progressBar = QtGui.QProgressBar(self.centralwidget)
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName(_fromUtf8("progressBar"))

self.verticalLayout.addWidget(self.progressBar)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 389, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "PushButton", None, QtGui.QApplication.UnicodeUTF8))

其他类.py

class OtherClass(object):  
def method(self):
for i in range(100): # i want to connect variable i to progress bar value
print i
for j in range(100500):
pass

最佳答案

您需要稍微重新组织一下代码。

首先,您应该永远不要编辑 pyuic 生成的 UI 模块中的代码。相反,将其导入您的主模块并在那里实现所有应用程序逻辑。

其次,您应该在主模块中创建一个主窗口类,并在其 __init__ 方法中进行所有设置。

解决将循环变量连接到进度条的问题的一种方法是使 OtherClass 成为 QObject 的子类并发出自定义信号:

from PyQt4 import QtCore

class OtherClass(QtCore.QObject):
valueUpdated = QtCore.pyqtSignal(int)

def method(self):
# i want to connect variable i to progress bar value
for i in range(100):
print i
self.valueUpdated.emit(i)
for j in range(100500):
pass

有了它,您可以将 pushButton 的设置及其插槽移动到“mainGUI.py”,并使用 pyuic 重新生成“Ui_MainWindow.py” >。然后将添加一个插槽来处理自定义 valueChanged 信号,这将更新进度条并处理任何未决的 GUI 事件。

所以“mainGUI.py”最终看起来像这样:

import sys
from PyQt4 import QtGui
from Ui_MainWindow import Ui_MainWindow
from OtherClass import OtherClass

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.pushButton.clicked.connect(self.myButtonSlot)
self.otherclass = OtherClass(self)
self.otherclass.valueUpdated.connect(self.handleValueUpdated)

def myButtonSlot(self):
self.otherclass.method()

def handleValueUpdated(self, value):
self.progressBar.setValue(value)
QtGui.qApp.processEvents()

def main():
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

if __name__ == '__main__':

main()

关于python - pyqt:如何在外部变量值更改时动态更新小部件属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20873259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com