如何让Tkinter窗口跳到前面?

nat*_*han 49 python focus tkinter

如何让Tkinter应用程序跳到前面?目前,窗口出现在我所有其他窗口后面,并没有得到焦点.

我应该打电话给我一些方法吗?

D K*_*D K 67

当您说"我的其他窗口"时,假设您的意思是您的应用程序窗口,您可以lift()在Toplevel或Tk上使用该方法:

root.lift()
Run Code Online (Sandbox Code Playgroud)

如果您希望窗口保持在所有其他窗口之上,请使用:

root.attributes("-topmost", True)
Run Code Online (Sandbox Code Playgroud)

root你的Toplevel或Tk 在哪里?别忘了-面前"topmost"!

要使其成为临时,请在以下后禁用最顶层:

def raise_above_all(window):
    window.attributes('-topmost', 1)
    window.attributes('-topmost', 0)
Run Code Online (Sandbox Code Playgroud)

只需传入你想要引发的窗口作为参数,这应该可行.

  • 试过Mac 10.9上的.lift()不起作用. (5认同)
  • 我的意思是:windows.attributes(1)确实带到了前面,但是(0)似乎没有禁用它.它实际上将它发送到后面. (3认同)
  • 确保在 root.mainloop() 之前添加这个! (2认同)

use*_*ame 31

如果您在Mac上执行此操作,请使用AppleEvents将重点放在Python上.例如:

import os

os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''')
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,它需要在`root = tk.Tk()`之后和`root.mainloop()`之前发生.另外,对于我的anaconda安装,它必须是小写的`process"python"`. (5认同)
  • 需要在root.mainloop()之前发生 (3认同)
  • 缺点是:它将所有python Tk进程移动到前台,这可能不是预期的. (2认同)

小智 30

在mainloop()之前添加以下行:

root.lift()
root.attributes('-topmost',True)
root.after_idle(root.attributes,'-topmost',False)
Run Code Online (Sandbox Code Playgroud)

它对我来说很完美.当窗口生成时,它会使窗口显示在前面,并且它不会始终位于前面.

  • 我正在运行10.11这是唯一对我有用的答案. (4认同)

小智 5

关于Mac,我注意到可能存在一个问题,即如果有多个python GUI运行,每个进程都将命名为"Python",而AppleScript将倾向于将错误的一个提升到前面.这是我的解决方案.我们的想法是在加载Tkinter之前和之后获取正在运行的进程ID列表.(请注意,这些是AppleScript进程ID,它们似乎与它们的posix对应物无关.去图.)那么奇怪的人将是你的,你将那个移到最前面.(我不认为最后的循环是必要的,但是如果你只是得到ID为procID的每个进程,AppleScript显然会返回一个由name标识的对象,当然这是非唯一的"Python",所以除非有我遗漏的东西,否则我们会回到原点.)

import Tkinter, subprocess
def applescript(script):
    return subprocess.check_output(['/usr/bin/osascript', '-e', script])
def procidset():
    return set(applescript(
        'tell app "System Events" to return id of every process whose name is "Python"'
        ).replace(',','').split())
idset = procidset()
root = Tkinter.Tk()
procid = iter(procidset() - idset).next()
applescript('''
    tell app "System Events"
        repeat with proc in every process whose name is "Python"
            if id of proc is ''' + procid + ''' then
                set frontmost of proc to true
                exit repeat
            end if
        end repeat
    end tell''')
Run Code Online (Sandbox Code Playgroud)