2013-04-11 258 views
3

我目前正在寫一個win32gui python27應用程序(我正在運行win7)。我想知道是否有可能從我的mainloop()創建一個新窗口並將焦點放在它上面,可能是通過停止主循環並停用根窗口。在一種僞代碼示例:如何讓窗口專注於Tkinter中的新Toplevel()窗口?

root=Tk() 
#put in some widgets, such as statusbars, tkfileDialog widgets etc... 
O=Toplevel() 
OptionMenu(O) #wait for user to make his choices; btw: OptionMenu is a class... 
tkFileDialog.askdirectory(...) #THEN interpret this line 

基本上,我想達到什麼樣的最tkfiledialog和tksimpledialog小部件的事:
要從主窗口偷焦點(而不只是控制檯焦點,wm焦點),並恢復主循環,直到所有內容都完成爲止,例如,OptionMenu已解決。我希望我可以讓你的目標明確,我幾周前剛剛開始了Tkinter編程,可能會混淆和曲解背後的一些概念......
就是這樣,夥計們!

回答

8

您正在尋找的概念被稱爲「搶」。 Tkinter支持幾種方法。例如,要在頂層設置本地抓取,您可以使用my_window.grab_set()。本地抓取是這個窗口抓取應用中所有其他窗口的焦點,但僅限於您的應用。

你也可以做一個全局抓取,除了你的特定窗口外,它可以有效地凍結你的整個顯示。這是非常危險的,因爲如果您的代碼中存在錯誤,您可以輕鬆地將自己鎖定在自己的計算機外面。

抓取做不是取消激活主循環功能。這必須在您的窗口中運行以處理事件。它只是將所有事件重定向到抓取的窗口。

欲瞭解更多信息,請閱讀grab_set等搶命令在這裏:http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.grab_set-method

0

的上述建議沒有爲我工作,在Mac OS埃爾卡皮坦。但根據這些提示,這確實:

class Window(Tk.Toplevel): 
    ... 
    def setActive(self): 
     self.lift() 
     self.focus_force() 
     self.grab_set() 
     self.grab_release() 
    ...