关于pygame和tkinter窗口的那件事-线程
pygame與tkinter關(guān)于窗口的問(wèn)題
pygame和tkinter實(shí)際上都是一個(gè)可視化界面,在第一層父窗口上幾乎沒(méi)有區(qū)別,tkinter使用Tk()+mainloop()+按鍵對(duì)象+放置 而pygame使用set_mode+update+按鍵對(duì)象+按鍵對(duì)象屬性設(shè)置(一般是位置),但是關(guān)于使用子窗口是有明顯區(qū)別的。
tkinter創(chuàng)建子窗口時(shí)如果只是顯示,不對(duì)窗口操作(點(diǎn)擊按鈕,輸入等),則直接使用Tk()創(chuàng)建窗口即可。如一些數(shù)據(jù)展示窗口。但是如果需要對(duì)子窗口進(jìn)行操作eg:數(shù)據(jù)寫(xiě)入,按鈕+響應(yīng)等等,就需要使用到頂層子窗口Toplevel()。
從線程角度說(shuō)明他們的不同點(diǎn)
tkinter使用單線程,如果只是開(kāi)啟窗口顯示,不涉及對(duì)主線程的內(nèi)容修改,則可以開(kāi)啟多個(gè)這樣的子窗口(嚴(yán)格上說(shuō)這不是真正意義的子窗口,因?yàn)榕c主窗口沒(méi)有進(jìn)行數(shù)據(jù)關(guān)聯(lián),因?yàn)槭歉鞲筛鞯闹皇墙柚鞔翱诘暮瘮?shù)調(diào)用創(chuàng)建該窗口,算是一個(gè)額外的線程)。但是如果需要子窗口對(duì)主線程中的數(shù)據(jù)(也可能是我們導(dǎo)入的數(shù)據(jù))進(jìn)行修改,就需要用到Toplevel(相當(dāng)于一個(gè)額外的線程+主線程中的內(nèi)部類(lèi)),它可以修改主線程中的內(nèi)部數(shù)據(jù),傳遞參數(shù)等等。
概括:使用tkinter做圖形窗口時(shí),如果窗口涉及操作直接使用toplevel()。其他只需可視化的情況使用Tk()直接創(chuàng)建新窗口也是可行的。
實(shí)例說(shuō)明:
在做一個(gè)計(jì)算器的擴(kuò)展功能-貸款計(jì)算時(shí),遇到了這個(gè)問(wèn)題。
問(wèn)題描述:
在貸款計(jì)算之前,添加了一個(gè)純展示的子窗口(tk實(shí)現(xiàn))功能,打開(kāi)后父窗口可以正常運(yùn)行。然后使用了同樣的方法做了貸款窗口,因?yàn)檫^(guò)程中涉及到了窗口的輸入,對(duì)主線程中的數(shù)據(jù)進(jìn)行了修改,雖然父窗口正常運(yùn)行)但是子窗口報(bào)錯(cuò)了。
解決:
將貸款的實(shí)現(xiàn)窗口修改為tk.toplevel()
pygame也是單線程的,但是其沒(méi)有類(lèi)似tkinter中的toplevel,不能創(chuàng)建同時(shí)運(yùn)行的兩個(gè)窗口。創(chuàng)建子窗口(如:tkinter窗口)時(shí)pygame會(huì)暫停了父窗口任務(wù),將資源給了給剛創(chuàng)建的子窗口,在子窗口返還資源之前(關(guān)閉之前),父窗口會(huì)一直處于未響應(yīng)狀態(tài)(等待返還主線程的資源)。
實(shí)例說(shuō)明:
在做拼圖游戲的原圖顯示功能時(shí),發(fā)現(xiàn)了該問(wèn)題。當(dāng)顯示原圖(子窗口)時(shí),主窗口處于未響應(yīng)狀態(tài),關(guān)閉子窗口后,主窗口正常響應(yīng)。
建議:
盡量不要使用在pygame上建立多個(gè)窗口,因?yàn)樗荒芡瑫r(shí)運(yùn)行單個(gè)線程,創(chuàng)建很多的窗口也只能實(shí)現(xiàn)窗口并發(fā)操作,不能實(shí)現(xiàn)并行
總結(jié)
以上是生活随笔為你收集整理的关于pygame和tkinter窗口的那件事-线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: github文件上传全流程-新手入门系列
- 下一篇: Dp问题:奶牛的聚会