如何在while循环

时间:2016-05-31 20:03:56

标签: python qt pyqt pyside

感觉我应该能够设置一个运行AJAX的事件监听器来调用更新qlabel,但这似乎与QT无穷无尽。

基本上我正在尝试做的是更新QLabel中的文本。这发生在一个无限循环上,当单击一个按钮时会中断(AKA类似于包含标志的Slot)。这样做的原因是我实际上正在阅读一个由用户更新的文本文件。当用户保存文本文件时,内容将更新到QLabel上。当用户对文本感到满意时,他们会点击“发送”。然后它会将监听器和E-Mails的文本内容杀死到预定义的电子邮件地址。这是与工作相关的,因此用户故事已经有了很大的改变,但整体概念正是我想要的。

我尝试做一些事情,例如设置一个标志,并通过执行以下操作进行监听:

    while not self.flag_set:
        self.my_text = text_read_module.get_text(self)
        self.label_60.setText(self.my_text)
        QCoreApplication.processEvents()
        sleep(2)

我也尝试将其推入自己的进程,并在调用包含终止信号的按钮时终止

它们都无法在屏幕上显示任何内容,但我可以通过一些方便的花花公子打印声明来告诉它们正在运行

PS这是在Python中完成的,但希望它很容易为C ++用户做好准备

有关如何使这项工作的任何想法?谢谢!

1 个答案:

答案 0 :(得分:4)

Qt/PyQt中,触发回调的方法是Signal / Slot系统。通常,如果您需要连续执行某些操作,并偶尔根据该操作更新GUI,您将创建一个工作线程,使用Signals将更新发送回主线程。例如,您可以创建一个工作线程,该工作线程持续检查文件是否有更新,当它检测到更改时,它可以使用信号将数据发送回主线程。您的主线程GUI将侦听该信号并相应地更新GUI。

幸运的是,在您的情况下,Qt已经有一个名为QFileSystemWatcher的类,因此您无需手动创建带信号的单独线程。

class MyWidget(QtGui.QWidget):

    def __init__(self):
        super(MyWidget, self).__init__()
        self.label = QtGui.QLabel(self)
        self.watcher = QtCore.QFileSystemWatcher(self)
        self.watcher.addPath('/path/to/file')
        self.watcher.fileChanged.connect(self.updateLabel)

    def updateLabel(self, path):
        with open(path, 'r') as f:
            self.label.setText(f.read())