為了實現乙個管理本地電子書的程式,搞了一段時間 gui,使用 wxpython。
實在難以適應和習慣,也搞不出什麼太好看的效果。
最不能忍受的是,多執行緒處理能力太弱。遂決定放棄 gui。
放棄之前,整理一點筆記。
gui 的核心都是基於事件程式設計,開啟乙個loop,不停的監聽事件。
監聽到事件以後,交給對應的 handler 來處理。
wx.frame 內新增各種控制項 widgets 控制樣式和具體的行為。
gui 中的視窗,除了wx.frame,還是wx.dialog, wx.dialog 多為 modal 模式。
modal 模式,即阻塞了別的視窗部件接收使用者事件,直到該模式對話方塊被關閉。
二者在使用和執行機制上,略有差別,參見 wxpython modal dialog 模式對話方塊
gui的操作必須發生在主線程或應用程式的主迴圈所處的地方中。
在乙個單獨的執行緒中執行gui操作,容易導致無法預知的程式崩潰,而且難以除錯。
基於技術方面的原因,
如許多unix的gui庫不是執行緒安全性的,以及在微軟windows下ui物件的建立問題,
wxpython沒有設計它自己的發生在多執行緒中的事件。
我們自己最好也不要嘗試。
後台首席執行官時間執行的程式,並在介面上顯示進度。
實現的原理如下圖:
在 main_thread 上建立子執行緒,用於首席執行官時間執行的程式。
子執行緒只負責給 main_thread(ui 執行緒)發訊息,而不關心 gui 的更新。
主線程響應子執行緒觸發的事件,不如,更新 ui。
最簡單的實現方式是,
子執行緒呼叫 wx.callafter(func, (args)) 註冊新事件,並將 func 註冊到新事件的處理控制代碼中。
新訊息執行時,func 在主線程中執行並更新ui。
也可以自定義事件,自定義處理控制代碼。
sizer 內可以直接 add(seizer), 像 add 其他控制項一樣。
最終需要把主 sizer setlayout 即可。
階段性總結
今天聽學長交流了一些人生的經驗,便有了一些感觸,加上對自己最近的學習狀態的總結,就寫一篇部落格給自己一點指示。最近渾渾噩噩的,有幾次考試也沒考好,考後也沒總結。晚自習本想刷一些題,複習一下,或是學習一點技術。看見其他同學在打擺,便動搖了。最後心中也只是徒留深深的罪惡感。所以我也是時候對自己的未來進行...
階段性總結
感覺上個星期還挺痛苦的,因為要練演算法,每個人都告訴我說演算法很重要很重要,但是演算法對我來說就像是一根很亂的神經,一觸就炸了,可我的驕傲還不允許我放棄。在leetcode上練習的時候是直接告訴用什麼方法,在寫藍橋杯演算法的時候就像是閱讀理解,經常讀不懂是什麼意思,要不就是理解錯誤,追根究底還是做的...
自考階段性總結
週六日這兩天的自學考試就這樣隨著落日再是告一段落,這是自己經歷的第三次自考。就著這一步走來的歷程著實令人緊張而又亢奮的,一次次的考試,乙個個課程的考試,讓我們朝著自考畢業證更進一步。總體而言,自學考試的經歷實在難稱完美。頓時轉折自己的學習需要不斷總結,需要針對這一屆的學習方法來個總結,思考這樣的學習...