在 MacOs 下使用 pygt5 或 pyside2 的简单 QTimer 示例中,是啥导致了这种奇怪的 UI 行为?

Posted

技术标签:

【中文标题】在 MacOs 下使用 pygt5 或 pyside2 的简单 QTimer 示例中,是啥导致了这种奇怪的 UI 行为?【英文标题】:What is causing this weird UI behavior in simple QTimer example with pygt5 or pyside2 under MacOs?在 MacOs 下使用 pygt5 或 pyside2 的简单 QTimer 示例中,是什么导致了这种奇怪的 UI 行为? 【发布时间】:2020-08-17 20:45:16 【问题描述】:

我是 PyQt5 的新手。我从互联网上复制了一个简单的 QTimer 示例。它有点工作,但我得到了奇怪的工件,并且按钮禁用/启用功能无法正常工作。我尝试了一些简单的更改,但问题仍然存在。我不知道这是对执行模型的基本缺乏了解,还是 PyQt5 中的错误。我使用 PySide2 得到了完全相同的奇怪效果。代码如下:

import sys
from PySide2.QtWidgets import *
# from PyQt5.QtWidgets import *
from PySide2.QtCore import QTimer,QDateTime
# from PyQt5.QtCore import QTimer,QDateTime

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTimer example')

        self.listFile=QListWidget()
        self.label=QLabel('Label')
        self.startBtn=QPushButton('Start')
        self.endBtn=QPushButton('Stop')

        widget = QWidget()
        vlayout = QVBoxLayout()
        hlayout = QHBoxLayout()

        self.running = False
        self.endBtn.setEnabled(False)
        self.timer=QTimer()
        self.timer.timeout.connect(self.showTime)

        hlayout.addWidget(self.startBtn)
        hlayout.addWidget(self.endBtn)
        vlayout.addWidget(self.label)
        vlayout.addLayout(hlayout)

        self.startBtn.clicked.connect(self.start_timer)
        self.endBtn.clicked.connect(self.endTimer)

        widget.setLayout(vlayout)
        self.setCentralWidget(widget)

    def showTime(self):
        time=QDateTime.currentDateTime()
        timeDisplay=time.toString('yyyy-MM-dd hh:mm:ss dddd')
        self.label.setText(timeDisplay)


    def start_timer(self):
        self.startBtn.setEnabled(False)
        self.endBtn.setEnabled(True)
        self.timer.start(1000)

    def endTimer(self):
        self.startBtn.setEnabled(True)
        self.endBtn.setEnabled(False)
        self.timer.stop()

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

我在互联网上看到一些关于仅限于 MacOS 的类似问题的帖子,并谈论降级 PyQt5,这也是我尝试 PySide2 的原因之一

除了按钮禁用功能无法完全正常工作之外,我还看到了以下视觉伪影:

以下是相关版本:

Mac OS Catalina、Python 3.7、pyqt5 5.12.3、pyside2 5.13.2

【问题讨论】:

我没有重现 PyQt5 5.9.2 的问题 【参考方案1】:

事实证明,这是 PyQt5 中 Mac 特定错误的另一个示例,如下所述:

PyQt widget refresh behavior different when clicking button with mouse or keyboard

在代码中添加重绘调用可以解决问题。

令人担忧的是,这个明显的错误尚未修复,这让我想知道 MacOS 上的 pyq5 ....

【讨论】:

以上是关于在 MacOs 下使用 pygt5 或 pyside2 的简单 QTimer 示例中,是啥导致了这种奇怪的 UI 行为?的主要内容,如果未能解决你的问题,请参考以下文章

PySide 安装错误 - python 2.7 - QT5 - macOS Sierra

如何从任务栏菜单应用程序 Python/Pyside2 for MacOS 显示 Hello World 对话框

PySide2 QMainWindow()捆绑在PyInstaller中后无法呈现[重复]

在 Spyder 中看不到由 PySide2 创建的应用程序窗口

如何从具有 PySide2 GUI 的 python 脚本构建一个 mac os 应用程序?

PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用