2012-05-02 87 views
0

我有一個程序,我只是添加了圖形,但我在運行我的主代碼和圖形時遇到了問題。基本上,我有這樣的事情:運行Python圖形和代碼

def mainFunction(): 
    while True: 
     run code in here 


root = Tk() 
board = Canvas(root, height=710, width=1000) 
board_image = PhotoImage(file="/path/example.jpg") 
photo = board.create_image(0,0, anchor=NW, image=board_image) 
board.pack() 

mainFunction 
root.mainloop() 

我只能運行要麼mainFunction或因爲哪一個我在代碼中第一次運行圖形是唯一運行。它不停下來讓下一個代碼運行。必須有一個簡單的方法來讓圖形和代碼並排運行。謝謝!

+0

「我不想要任何複雜的解決方案」沒有簡單的解決方案。 –

+0

聽起來不對。我的意思是我是一名初學者程序員,這是一個任務。我們還沒有學到任何關於多線程的知識。 – emagdnim

+0

沒關係,因爲多線程不是你如何做的。但它仍然很複雜。 –

回答

1

使用Tk.after_idle()註冊一個功能,該功能將執行所需的工作。繼續做一件事,直到所有的工作完成。

+0

謝謝,但我不確定Tk.after_idle()函數是如何工作的。你有關於它的任何文檔的資源嗎? – emagdnim

+0

您將可調用對象和任何參數傳遞給可調用對象。 –

0

一般而言,您不能在Tkinter應用程序中放置無限循環。爲什麼?它已經運行了一個無限循環:事件循環。您的代碼與此相當:

while <there are more events to service>: 
    while True: 
     <run code in here> 
    <get the next event> 
    <service the event> 

查看問題?您正在阻止代碼服務於事件,而事件是GUI的生命。

相反,您需要通過添加要在循環中運行的代碼來利用已運行的無限循環。您通過after(和after_idle)執行此操作。這會讓一個人放在隊列中。如果在處理該事件期間再次調用after_idle,則可以有效地設置在事件循環內運行的無限循環。

例如:

def do_one_iteration(self): 
    <run code in here> 
    self.after(100, self.do_one_iteration) 

然後,在某個地方你的主要邏輯,或響應按鈕,你叫do_one_iteration。它會對你以前的無限循環做一次迭代。當它完成時,它指示Tkinter在100毫秒後再次調用自己。當這段時間過去了,你的代碼就運行了,它會安排100毫秒的迭代,等等。你可以把時間間隔改變成任何你想要的;間隔越小,代碼運行速度越快,但您因事件而匱乏圖形用戶界面的可能性就越大。

請注意,這僅適用於<run code in here>運行速度相對較快的情況。運行時,GUI會凍結。如果它可以在幾百毫秒內完成一次迭代,那麼用戶永遠不會知道。如果需要一秒鐘或更多時間,它會很明顯。

注意:此示例假定您的主應用程序是從Tkinter小部件繼承的對象。如果不是這種情況,它仍然可以工作,你只需要刪除self參數。更好的解決方案是重構你的GUI來使用對象 - 這是一種更靈活的GUI實現方式。