我在GUI编程方面经验不多,但我正在用PyQt编写GUI应用程序。使用此应用程序,用户可以打开二进制文件并使用它进行一些编辑。
当文件打开时,我会做一些需要一段时间(约15秒)的处理。因此,当用户选择文件并按文件打开对话框中的“打开”按钮时,GUI将被冻结。什么是实现更好用户体验的最佳方式?
由于
答案 0 :(得分:2)
在背景中加载,通过状态栏中的Gauge显示进度。
为此,您可以使用QThread启动加载。您的线程类可以如下所示(假设parent
将具有属性progress
):
QtFileLoader(QtCore.QThread):
def __init__(self,parent=None, filepath=None):
QtCore.QThread.__init__(self,parent)
self.data = None
self.filepath = filepath
def run(self):
""" load data in parts and update the progess par """
chunksize = 1000
filesize = ... # TODO: get length of file
n_parts = int(filesize/chunksize) + 1
with open(self.filepath, 'rb') as f:
for i in range(n_parts):
self.data += f.read(chunksize)
self.parent.progress = i
讨论是否使用QThread
或trheading.Thread
的问题here
编辑(根据@Nathan的提示):
在parent
上,计时器功能应该检查每个100毫秒self.parent.progress的值并相应地设置进度条。这样,进度条就可以在GUI的主线程中设置。
答案 1 :(得分:2)
您需要定期要求应用程序处理事件队列中待处理的事件。您可以通过调用QApplication实例的processEvents()方法来执行此操作。如果您可以通过调用processEvents(),GUI和进度条来散布您的计算,那么它们将自行更新。请注意,这与不与使GUI响应相同。
要在执行加载时使GUI响应,您需要将加载操作拆分为后台线程。虽然后台线程可以发出跨越线程边界的信号,但您无法从后台线程执行GUI操作。关于多线程PyQt编程的Here is an article。
答案 2 :(得分:1)
您正在寻找一些方法来在与GUI主循环不同的线程中完成工作 您可以查看here开始
作为wxpython和pyQt的主要gui框架具有运行长时间运行的应用程序而不冻结gui的方法。我个人更喜欢直接使用python线程模块