2013-10-14 73 views
1

System.Windows.Forms.Form.Show()(這個問題問得originally posted到Python-Tkinter的郵件列表)的Tkinter相當於非阻塞從.NET

我試圖複製一個無阻塞(或無模式)從Windows .NET應用程序使用Tkinter的窗口行爲。

我得到的應用程序顯示了一個響應某個事件的新窗口(可能是非GUI事件),並且執行繼續,顯示新窗口。

下面是相關代碼:

private void foo(object sender, EventArgs e) 
{ 
    Form1 f = new Form1(); 
    f.Show(); // displays a window and continues 
    Console.WriteLine("Form created"); 
} 

最重要的一點是調用.NET類System.Windows.Forms.Form/ControlShow() method

foo()函數可以從非GUI應用程序調用,作爲對某些信號的響應,甚至可以從C++應用程序調用。

重點是沒有明確的等待事件,窗口是無模式的。

我如何在Tkinter中實現類似的行爲? 是否有任何Tkinter慣用的方法來避免調用mainloop()wait_window()方法(它們都被阻塞)?

+0

可能相關:[Tkinter中的非阻塞信息對話框](http://stackoverflow.com/questions/11418625/non-blocking-info-dialog-in-tkinter) – sloth

+0

@DominicKexel是的,它似乎是你找到的問題非常相似,所以相關。我以前沒有找到它。我的問題雖然給重要的.NET引用期望的行爲的例子。對那些想要回答它的人可能會有所幫助。 – mloskot

回答

1

您可以通過創建Toplevel(假設您已經創建了根窗口)的實例來創建非模式彈出窗口。但是,您需要讓事件循環運行,因爲這是tkinter用於瞭解窗口何時需要重新繪製的機制。

+0

我明白了,所以它看起來Tkinter根窗口是必需的,因爲Tkinter事件循環是無論如何。從你的回答中得出了正確的結論嗎? – mloskot

+0

@mloskot:是的,一個根窗口是必需的,如果你沒有使用它的其他任何東西,你可以用它作爲你的對話而不是創建一個頂層。而且,是的,事件循環必須運行以使對話響應事件。 –

+0

明白了,謝謝。那麼我就把它當作答案。 – mloskot