[英]Threading in GTK3 python
我正在 Python 中構建一個 GTK GUI,我需要從數據庫中獲取一些需要很長時間的數據,因此 GUI 凍結。
所以我現在使用線程在“后台”運行刷新:
Thread(target=self.updateOrderList).start()
我有 GUI class 和所有相關的方法來操作 GUI。 我的解決方案在 80% 的時間里都能正常工作,但是當它不工作時 GTK 崩潰並輸出:
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python3.6: ../../src/xcb_io.c:165: dequeue_pending_request:
其他時候效果很好,數據被加載並刷新了 gui。
編輯:有時我會收到此錯誤:
Gdk-Message: 11:13:42.848: main.py: Fatal IO error 11 (Die Ressource ist zur Zeit nicht verfügbar) on X server :0
有時我多次單擊刷新按鈕並且它可以工作,但有時它不會。
我的 main.py 看起來像這樣:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject
import gui
GObject.threads_init()
# start gui
gui.Gui()
Gtk.main()
有什么想法嗎?
馬庫斯
好吧,GTK3 不是線程安全的。 所以我改變了程序邏輯——在一個新線程中執行請求,並且只在 GUI 線程中處理 GUI 操作。 所以這意味着我必須向事件循環發出“請求完成”信號:
創建一個新信號並注冊它:
GObject.signal_new("my-custom-signal", self.window, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT,
(GObject.TYPE_PYOBJECT,))
self.window.connect("my-custom-signal", self.updateOrderListCallback)
所以當我點擊一個按鈕時,啟動一個線程:
Thread(target=self.updateOrderListThread).start()
在那個線程中,進行計算,然后發出信號:
self.window.emit("my-custom-signal", None)
因此,在計算/請求/完成任何操作之后將調用回調並且它可以工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.