2013-04-11 257 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() 
    ...