2014-04-19 34 views
0

我正試圖將程序從tkinter過渡到Kivy。當我到了一個使用messagebox.askyesno的部分時,我想我可以用一些按鈕創建一個彈出窗口,然後我就完成了。我遇到的問題是,雖然Kivy的彈出窗口和tkinter的消息框都是模態的,但當我在函數中調用messagebox.askyesno時,messagebox將暫停當前函數的所有執行,直到消息框被銷燬,而彈出窗口將允許函數完。我原來的計劃不得不Kivy等同於tkinter的消息框

flag = messagebox.askyesno(message='...',parent=self) 
if flag: 
    #Stuff if flag is true 
else: 
    #Stuff if flag is false 

然而,這不會有Kivy彈出工作,因爲彈出窗口將打開,程序將繼續執行。有沒有辦法停止執行,直到彈出窗口被銷燬,或以其他方式解決問題?

基本思想是雙人遊戲的準對話。在這裏,程序詢問一個玩家是否想要執行一個動作,比如移動一塊。如果玩家說「是」,那麼第二位玩家得到messagebox.askyesno作爲反擊。一個簡單的比喻就是推動一名壘球運動員從一壘到三壘。如果他想要推進跑步者,或者讓跑步者保持第二名,你將不得不問問進攻球隊。如果答案是肯定的,那麼該計劃將不得不詢問防守球隊是否想要屈居第三。它肯定有可能創建一個函數來處理askyesno的每個實例,並帶有適當的綁定,但似乎過多。

回答

2

我不太瞭解tkinter是怎麼做的,但是kivy需要一個稍微不同的心理模型。你不想在Python代碼之間停止和啓動eventloop,而是想要啓動彈出窗口,將你需要的任何狀態傳遞給它或存儲在其他地方,然後綁定彈出窗口的結果(例如,當用戶按下「完成」按鈕)一些新的功能,可以完成剩下的計算。

我可以提供一個例子,如果你喜歡,特別是如果你提供更多關於你想要做的事情的信息。

+0

您的評估是我曾經考慮的事情,如果這種情況只發生一次,那麼它是可行的。但是,我至少有10個askyesno實例,儘可能在每次發生時都這樣做,似乎是過度殺傷。 –

+0

爲什麼它會過度殺傷......你仍然只需要編寫一次代碼?也許你可以提供一個更完整的例子。 – inclement

+0

我已經編輯了一個,希望更清晰地說明我正在做什麼。雖然你的想法很有效,但我認爲必須要有一個比打破功能更清潔的解決方案,至少在我的情況下是10個,來利用彈出窗口。 –