PyQT 从同一文件中的其他 类(Qthread) 访问 UI 元素
PyQT Accessing UI elements from other classes(Qthread) in same file
我看到过类似的问题,但我的情况并不顺利。我正在尝试从其他 class 访问 UI 元素,但是
我收到以下错误。 "worker_temp" 函数
中的错误
AttributeError: 'rack_temp' object has no attribute 'ui'
我试过的代码: - main.py
from PyQt5.uic.properties import QtWidgets
from master.ui_code.fast_charging_ui import Ui_Dialog
from PyQt5.QtWidgets import QMainWindow, QApplication, QDialog, QLabel, QMessageBox
from PyQt5.QtCore import QTimer, QObject, pyqtSignal, QRunnable, pyqtSlot, QThreadPool, QByteArray, QEventLoop, QThread
import sys
class MainWindow(QDialog):
def __init__(self,*args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.ui.unit_1.setCurrentIndex(0)
self.threadpool = QThreadPool()
self.test = rack_temp()
self.test.start()
def door_1_check(self):
print "door check"
class rack_temp(QThread):
def __init__(self, parent = None):
QThread.__init__(self, parent)
super(rack_temp, self).__init__(parent)
self.threadpool = QThreadPool()
self.dataCollectionTimer = QTimer()
self.dataCollectionTimer.moveToThread(self)
self.dataCollectionTimer.timeout.connect(self.worker_temp)
self.worker_temp()
def worker_temp(self):
print "test "
self.ui.unit_1.setCurrentIndex(2)
def run(self):
self.dataCollectionTimer.start(2000)
loop = QEventLoop()
loop.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
谁能告诉我为什么我不能从其他 class 继承元素?
提前致谢!
我找到了一个解决方案,它的 working.We 不能直接调用来自不同 thread.We 的 UI 元素,应该使用信号和槽机制,或者另一种方法是 QMetaObject.I尝试使用信号和插槽方法。Examples
class Rack_Temperature(QtCore.QThread):
slot1 = QtCore.pyqtSignal(list)
slot2 = QtCore.pyqtSignal(list)
def run(self):
while True:
try:
QtCore.QThread.msleep(3000)
self.slot1.emit("yourdata")
except Exception as err:
print err
class MainWindow(QDialog):
def __init__(self,*args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.myclass_temp = Rack_Temperature()
self.myclass_temp.start()
elf.myclass_temp.slot1.connect(self.test_method)
我看到过类似的问题,但我的情况并不顺利。我正在尝试从其他 class 访问 UI 元素,但是 我收到以下错误。 "worker_temp" 函数
中的错误AttributeError: 'rack_temp' object has no attribute 'ui'
我试过的代码: - main.py
from PyQt5.uic.properties import QtWidgets
from master.ui_code.fast_charging_ui import Ui_Dialog
from PyQt5.QtWidgets import QMainWindow, QApplication, QDialog, QLabel, QMessageBox
from PyQt5.QtCore import QTimer, QObject, pyqtSignal, QRunnable, pyqtSlot, QThreadPool, QByteArray, QEventLoop, QThread
import sys
class MainWindow(QDialog):
def __init__(self,*args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.ui.unit_1.setCurrentIndex(0)
self.threadpool = QThreadPool()
self.test = rack_temp()
self.test.start()
def door_1_check(self):
print "door check"
class rack_temp(QThread):
def __init__(self, parent = None):
QThread.__init__(self, parent)
super(rack_temp, self).__init__(parent)
self.threadpool = QThreadPool()
self.dataCollectionTimer = QTimer()
self.dataCollectionTimer.moveToThread(self)
self.dataCollectionTimer.timeout.connect(self.worker_temp)
self.worker_temp()
def worker_temp(self):
print "test "
self.ui.unit_1.setCurrentIndex(2)
def run(self):
self.dataCollectionTimer.start(2000)
loop = QEventLoop()
loop.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
谁能告诉我为什么我不能从其他 class 继承元素? 提前致谢!
我找到了一个解决方案,它的 working.We 不能直接调用来自不同 thread.We 的 UI 元素,应该使用信号和槽机制,或者另一种方法是 QMetaObject.I尝试使用信号和插槽方法。Examples
class Rack_Temperature(QtCore.QThread):
slot1 = QtCore.pyqtSignal(list)
slot2 = QtCore.pyqtSignal(list)
def run(self):
while True:
try:
QtCore.QThread.msleep(3000)
self.slot1.emit("yourdata")
except Exception as err:
print err
class MainWindow(QDialog):
def __init__(self,*args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.myclass_temp = Rack_Temperature()
self.myclass_temp.start()
elf.myclass_temp.slot1.connect(self.test_method)