Tôi có giao diện PySide (Qt) sinh ra nhiều luồng. Các chủ đề đôi khi cần cập nhật GUI. Tôi đã giải quyết vấn đề này theo cách sau:PySide: Cách dễ dàng hơn để cập nhật GUI từ một chủ đề khác
class Signaller(QtCore.QObject) :
my_signal = QtCore.Signal(QListWidgetItem, QIcon)
signaller = Signaller()
class MyThread(threading.Thread):
def __init__(self):
super(IconThread, self).__init__()
# ...
def run(self) :
# ...
# Need to update the GUI
signaller.my_signal.emit(self.item, icon)
#
# MAIN WINDOW
#
class Main(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
# ...
# Connect signals
signaller.my_signal.connect(self.my_handler)
@QtCore.Slot(QListWidgetItem, QIcon)
def my_handler(self, item, icon):
item.setIcon(icon)
def do_something(self, address):
# ...
# Start new thread
my_thread = MyThread(newItem)
my_thread.start()
# ...
Có cách nào dễ dàng hơn không? Tạo các tín hiệu, trình xử lý và kết nối chúng đòi hỏi một vài dòng mã.
Tại sao bạn không sử dụng 'QThread'? – Avaris
Nếu nó dễ dàng hơn với một 'QThread', tôi sẽ xem xét sử dụng một. Vấn đề là mã hiện có thường có xu hướng sử dụng 'threading.Thread'. – Petter
Tốt hơn, vì 'QThread' hỗ trợ tín hiệu. Bạn sẽ không cần lớp 'Signaller' của bạn. Nhưng về cơ bản, cách của bạn là con đường. Bạn cần tín hiệu và khe để giao tiếp giữa các luồng và GUI. – Avaris