2013-04-18 81 views
2

我试图做一个Toplevel的构件,在屏幕上(我希望如此,如果你按输入上的活动窗口,它退出窗口。我已经有钥匙绑定窗口小部件,但我似乎无法让窗口成为​​我电脑上的主窗口,我正在使用Notepad ++运行我的程序(我有一个用于此特定程序的快捷方式,因为我将使用它很多)做一个Tkinter的Toplevel的积极

这里是我的代码:

def main(): 
    root = Tk(className = ' Module Opener') 
    app = GetFileName(root) 
    root.rowconfigure(0, weight = 1) 
    root.columnconfigure(0, weight = 1) 
    root.bind('<Return>', (lambda e, b=app.goButton: b.invoke())) 
    root.mainloop() 
    f, pythonType = app.fileName, app.pythonType 
    if f[-3:] != '.py': f += '.py' 
    moduleFile = getFilePath(f, pythonType) 
    if not moduleFile is None: 
     subprocess.call([r"C:\Program Files\Notepad++\notepad++.exe", moduleFile]) 
    else: 
     root.withdraw() 
     finalRoot = Toplevel(root) 
     finalRoot.grab_set() # I thought this would make it active 
     finalApp = FileNotExist(finalRoot, f) 
     finalRoot.rowconfigure(0, weight = 1) 
     finalRoot.columnconfigure(0, weight = 1) 
     finalRoot.bind('<Return>', (lambda e, b=finalApp.okButton: b.invoke())) 
     finalRoot.mainloop() 

我想它,以便它打开时,如果我按输入,它执行我的命令;不过,我必须先点击窗口才能激活,然后才能正常工作。

我试着如finalRoot.lift()finalRoot.focus_set()finalRoot.grab_set()/finalRoot.grab_set_global()(我看到another question这些方法)不同的东西,finalRoot.focus()

第一个窗口Tk()在程序启动时处于活动状态。但是,Toplevel()不是。我也尝试制作两个Tk()(摧毁root,然后创建finalRoot作为新的Tk()实例),但这种方式并不奏效。我怎样才能做到这一点?谢谢!

回答

1

我有同样的问题,并尝试了一切,我可以找到。 不幸的是,答案是它取决于你的操作系统。我的窗口自动聚焦在我的旧Mac上,但不在OSX Lion上。您列出的一些命令也取决于操作系统。

+0

我的操作系统是Windows 7(专业)。我认为会有一种方法,但不要猜测... –

0
root.call('wm', 'attributes', '.', '-topmost', True) 
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False) 
root.focus_force() 
+0

我也测试过这个,但它不起作用(OSX 10.9.2)。我现在最好的 - 但不适用于每个人 - 是''self.root.wm_attributes(“ - topmost”,1)'' – JulienD

+0

@muraveill可能依赖于平台,我的操作系统是Ubuntu 12.04。 – metaphy

3

......不过,我已经使其成为活跃在窗口中单击第一,然后它的作品。

我刚刚遇到了这个问题,而我在研究解决方案时,发现了这个线程。我正在使用Windows 7专业版。我所做的只是呼叫grab_set()focus()它解决了我的问题。你已经有finalRoot.grab_set(),只需添加:

finalRoot.focus() 

它的工作在我的情况。

1

我试过上面的解决方案,发现focus_force()独自在Windows Vista/Python 3.3上工作。在创建Toplevel窗口时,也可能包含takefocus=True方法。

0

没有以上建议为我工作在Mac OS埃尔卡皮坦,但这:

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