Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在while循环中更新QLabel_Python_Qt_Pyqt_Pyside - Fatal编程技术网

Python 如何在while循环中更新QLabel

Python 如何在while循环中更新QLabel,python,qt,pyqt,pyside,Python,Qt,Pyqt,Pyside,我觉得我应该能够设置一个事件监听器来运行一个类似AJAX的调用来更新qlabel,但这对于QT来说似乎非常复杂 基本上,我试图做的是更新QLabel中的文本。这发生在一个无限循环上,当点击一个按钮时循环中断(类似于包含标志的插槽)。这样做的原因是,我基本上是在动态地阅读一个文本文件,该文件由用户更新。当用户保存文本文件时,QLabel上的内容将更新。当用户对文本满意时,点击“发送”。然后,它杀死侦听器并将文本内容通过电子邮件发送到预定义的电子邮件地址。这是与工作相关的,所以用户故事已经发生了很大

我觉得我应该能够设置一个事件监听器来运行一个类似AJAX的调用来更新qlabel,但这对于QT来说似乎非常复杂

基本上,我试图做的是更新QLabel中的文本。这发生在一个无限循环上,当点击一个按钮时循环中断(类似于包含标志的插槽)。这样做的原因是,我基本上是在动态地阅读一个文本文件,该文件由用户更新。当用户保存文本文件时,QLabel上的内容将更新。当用户对文本满意时,点击“发送”。然后,它杀死侦听器并将文本内容通过电子邮件发送到预定义的电子邮件地址。这是与工作相关的,所以用户故事已经发生了很大的变化,但总体概念是我想要的

我试着做一些事情,比如设置一个标志,然后通过执行以下操作进行监听:

    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++用户


你知道怎么让它工作吗?谢谢

Qt/PyQt
中,触发回调的方法是信号/插槽系统。通常,如果您需要持续执行某些操作,并且偶尔根据该操作更新GUI,那么您将创建一个工作线程,使用
信号
将更新发送回主线程。例如,您可以创建一个工作线程,持续检查文件的更新,当它检测到更改时,可以使用信号将数据发送回主线程。主线程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())

Qt/PyQt
中,触发回调的方法是信号/插槽系统。通常,如果您需要持续执行某些操作,并且偶尔根据该操作更新GUI,那么您将创建一个工作线程,使用
信号
将更新发送回主线程。例如,您可以创建一个工作线程,持续检查文件的更新,当它检测到更改时,可以使用信号将数据发送回主线程。主线程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())

在主事件循环中调用
processEvents
的用例很少,从主线程调用
sleep
通常是个坏主意。与其不断地检查需要设置的文本,不如使用信号/插槽组合。我通常不是睡眠的支持者,我只是用它作为权宜之计,所以它不会每秒运行100多次。我当然更喜欢使用信号/插槽组合,在这个用户故事中我该怎么做?你不能让
text\u read\u模块
发出信号吗?它是非Qt库的一部分吗?如果你在一个单独的线程中,它将不起作用。更改诸如label.setText之类的GUI项目会在单独的线程中导致错误。解决这个问题的一种方法是让线程用文本设置一个变量,然后让计时器用变量定期更新标签文本。@HashSplat如果连接排队,则可以安全地跨线程发送信号(当连接到另一个线程中的插槽时,Qt会自动执行此操作)。我不确定PyQt如何处理线程间的短路信号,但大体上,你的说法是错误的。当然,跨线程对GUI对象的直接信号和普通函数调用是不好的。在主事件循环中调用
processEvents
的用例很少,从主线程调用
sleep
通常是不好的主意。与其不断地检查需要设置的文本,不如使用信号/插槽组合。我通常不是睡眠的支持者,我只是用它作为权宜之计,所以它不会每秒运行100多次。我当然更喜欢使用信号/插槽组合,在这个用户故事中我该怎么做?你不能让
text\u read\u模块
发出信号吗?它是非Qt库的一部分吗?如果你在一个单独的线程中,它将不起作用。更改诸如label.setText之类的GUI项目会在单独的线程中导致错误。解决这个问题的一种方法是让线程用文本设置一个变量,然后让计时器用变量定期更新标签文本。@HashSplat如果连接排队,则可以安全地跨线程发送信号(当连接到另一个线程中的插槽时,Qt会自动执行此操作)。我不确定PyQt如何处理线程间的短路信号,但大体上,你的说法是错误的。当然,跨线程对GUI对象的直接信号和普通函数调用是不好的。谢谢,这正是我想要的!谢谢,这正是我想要的!