2024-04-20 07:32:52 发布
网友
我正在编写一个带有GUI的多线程Python程序,其中有几个模块通过更改文本和背景颜色来“接触”GUI。我目前正在使用PyGTK,并且发现GUI有时会“安静地”崩溃(没有错误消息;程序只是终止),有时还会遇到分段错误。在
This site注意到GTK并不是完全线程安全的,PyGTK多线程编程很棘手。是否有更好的pythongui框架来支持不太可能产生问题的多线程程序?在
如果您正在从线程更新GUI,您可能需要使用gobject.idle_add()以便稍后在循环中调用GUI update函数,大多数GUI框架(如Qt)要求您添加一个回调,该回调将在主循环空闲时调用。GTK还支持通过使用gtk.gdk.lock上下文管理器或围绕GUI调用调用gtk.gdk.threads_enter和{}从线程调用GUI函数。在
gobject.idle_add()
gtk.gdk.lock
gtk.gdk.threads_enter
所以你要么这样做:
gobject.idle_add(lambda: window.whatever(arg1, arg2))
或者你会:
哦,我绝对推荐PyQt4。一开始,我并没有得到所有这些SIGNAL和EMIT的废话,但是现在我已经用它制作了一个程序,QThread模块非常有用。在
SIGNAL
EMIT
QThread
至于稳定性,我从来没有出过车祸。即使在我调试半功能代码时,QT也没有任何问题。每当我单击一个带有无效信号槽的按钮时,它就会向控制台窗口抛出一个错误。在
另一方面,GTK只是偶尔出现故障,没有任何错误。只是你的描述和友好的Segmentation Fault。这就是我觉得PyQt是一种工作乐趣的原因之一。当你遇到错误时,你就知道出了什么问题。在
Segmentation Fault
我很确定这是个人的喜好,但还有一个优点是Mac、Linux和Windows上的原生图形用户界面。Windows上的GTK+(别误会。我用的是Ubuntu)只是有一种X-org的感觉,这让我很不安。在
祝你好运!在
为了让PyQt更有吸引力,下面是我的图书装订应用程序的摘录(有点混乱):
class Binder(QtCore.QThread): ''' Class for binding the actual book ''' def __init__(self, parent = None): super(Binder, self).__init__(parent) def initialize(self, pages, options, outfile): self.pages = pages self.options = options self.outFile = outfile self.book = organizer.Book() self.enc = Encoder(self.options) self.ocr = ocr.OCR(self.options) self.connect(self.enc, QtCore.SIGNAL('updateProgress(int, int)'), self.updateProgress) def updateProgress(self, percent, item): self.emit(QtCore.SIGNAL('updateProgress(int, QString)'), int(percent), 'Binding the book...') self.emit(QtCore.SIGNAL('updateBackground(int, QColor)'), int(item), QtGui.QColor(170, 255, 170, 120)) if int(percent) == 100: time.sleep(0.5) self.emit(QtCore.SIGNAL('finishedBinding')) def run(self): self.die = False for page in self.pages: self.add_file(page, 'page') if not self.die: self.analyze() if not self.die: self.book.get_dpi() if self.options['ocr'] and not self.die: self.get_ocr() if not self.die: self.enc.initialize(self.book, self.outFile) self.enc.start()
如果您正在从线程更新GUI,您可能需要使用}从线程调用GUI函数。在
gobject.idle_add()
以便稍后在循环中调用GUI update函数,大多数GUI框架(如Qt)要求您添加一个回调,该回调将在主循环空闲时调用。GTK还支持通过使用gtk.gdk.lock
上下文管理器或围绕GUI调用调用gtk.gdk.threads_enter
和{所以你要么这样做:
或者你会:
^{pr2}$哦,我绝对推荐PyQt4。一开始,我并没有得到所有这些
SIGNAL
和EMIT
的废话,但是现在我已经用它制作了一个程序,QThread
模块非常有用。在至于稳定性,我从来没有出过车祸。即使在我调试半功能代码时,QT也没有任何问题。每当我单击一个带有无效信号槽的按钮时,它就会向控制台窗口抛出一个错误。在
另一方面,GTK只是偶尔出现故障,没有任何错误。只是你的描述和友好的
Segmentation Fault
。这就是我觉得PyQt是一种工作乐趣的原因之一。当你遇到错误时,你就知道出了什么问题。在我很确定这是个人的喜好,但还有一个优点是Mac、Linux和Windows上的原生图形用户界面。Windows上的GTK+(别误会。我用的是Ubuntu)只是有一种X-org的感觉,这让我很不安。在
祝你好运!在
为了让PyQt更有吸引力,下面是我的图书装订应用程序的摘录(有点混乱):
相关问题 更多 >
编程相关推荐