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)
只需传入你想要引发的窗口作为参数,这应该可行.
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)
小智 30
在mainloop()之前添加以下行:
root.lift()
root.attributes('-topmost',True)
root.after_idle(root.attributes,'-topmost',False)
Run Code Online (Sandbox Code Playgroud)
它对我来说很完美.当窗口生成时,它会使窗口显示在前面,并且它不会始终位于前面.
小智 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)
归档时间: |
|
查看次数: |
50986 次 |
最近记录: |