请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

实例方法中只能通过self访问类变量才可以工作。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

sec = 0

class WorkThread(QThread):
    def __init__(self, parent=None):
        super(WorkThread, self).__init__(parent)
        self.timer = pyqtSignal()   # 每隔1秒发送一次信号
        self.end1 = pyqtSignal()     # 计数完成后发送一次信号

    # timer = pyqtSignal()  # 每隔1秒发送一次信号
    # end1 = pyqtSignal()     # 计数完成后发送一次信号
    def run(self):
        while True:
            self.sleep(1)  # 休眠1秒
            if sec == 5:
                self.end1.emit()   # 发送end信号
                break
            self.timer.emit()   # 发送timer信号

class Counter(QWidget):

    def __init__(self, parent=None):
        super(Counter, self).__init__(parent)

        self.setWindowTitle("使用线程类(QThread)编写计数器")
        self.resize(300, 120)

        layout = QVBoxLayout()
        self.lcdNumber = QLCDNumber()
        layout.addWidget(self.lcdNumber)

        button = QPushButton('开始计数')
        layout.addWidget(button)

        self.workThread = WorkThread()

        self.workThread.timer.connect(self.countTime)
        self.workThread.end1.connect(self.end1)
        button.clicked.connect(self.work)

        self.setLayout(layout)

    def countTime(self):
        global sec
        sec += 1
        self.lcdNumber.display(sec)

    def end1(self):
        QMessageBox.information(self,'消息','计数结束',QMessageBox.Ok)

    def work(self):
        self.workThread.start()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Counter()
    form.show()
    sys.exit(app.exec_())

老师:为什么我这里不可以把timer 和 end1定义成实例变量?运行报下面的错误:
Traceback (most recent call last):
File “C:/Users/u243216/Desktop/GUI/multithread/Counter.py”, line 83, in
form = Counter()
File “C:/Users/u243216/Desktop/GUI/multithread/Counter.py”, line 63, in init
self.workThread.timer.connect(self.countTime)
AttributeError: ‘PyQt5.QtCore.pyqtSignal’ object has no attribute ‘connect’

我这个代码只能把timer和end1定义成类变量,在实例方法run中通过访问实例变量的形式(self.timer/self.end1)的方式来访问类变量才可以运行正常。是不是和pyqt5的实现机制有关?

正在回答 回答被采纳积分+3

2回答

提问者 weixin_慕斯卡4281563 2020-09-17 20:34:20

不复杂。 self访问的实例变量如果不存在 就会到类变量里去找。 对吧?

但是 我这里只能定义成类变量,并且用self访问实例变量的形式去访问定义的类变量,干嘛一定要定义成类变量呢?

0 回复 有任何疑惑可以回复我~
提问者 weixin_慕斯卡4281563 2020-09-17 19:29:59

既然用self访问 就应该定义成实例变量啊!? 为何只能定义成类变量才能运行!
原码是C++, 看不到

0 回复 有任何疑惑可以回复我~
  • 7七月 #1
    这个代码过于复杂了,我觉得你应该写个很简单的类,测试下。
    self本身就是可以访问实例变量的呀
    回复 有任何疑惑可以回复我~ 2020-09-17 20:15:36
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信