将焦点设置在 Tkinter 窗口上(取决于平台?)

发布于 2024-11-09 05:46:23 字数 128 浏览 0 评论 0原文

我有一个 Tkinter 程序,运行它的方式如下: python myWindow.py 启动它一切正常,但窗口位于我用来启动它的终端后面。

有没有办法让它抓住焦点并成为前台应用程序?这取决于平台吗?

I have a Tkinter program and running it like: python myWindow.py starts it all right, but the window is behind the terminal that I use to start it.

Is there a way to make it grab the focus and be the foreground application? Does it depend on the platform?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

極樂鬼 2024-11-16 05:46:23

这可能是您的特定窗口管理器的一个功能。要尝试的一件事是让您的应用在创建所有小部件后在启动时调用 focus_force

This might be a feature of your particular window manager. One thing to try is for your app to call focus_force at startup, after all the widgets have been created.

酒绊 2024-11-16 05:46:23

您在脚本末尾尝试过这个吗?

root.iconify()
root.update()
root.deiconify()

root.mainloop()

Have you tried this at the end of your script ?

root.iconify()
root.update()
root.deiconify()

root.mainloop()
情归归情 2024-11-16 05:46:23

这在某种程度上是网上找到的各种其他方法的组合,适用于 OS X 10.11 和在 venv 中运行的 Python 3.5.1,并且也应该适用于其他平台。在 OS X 上,它还通过进程 ID 而不是应用程序名称来定位应用程序。

from tkinter import Tk
import os
import subprocess
import platform


def raise_app(root: Tk):
    root.attributes("-topmost", True)
    if platform.system() == 'Darwin':
        tmpl = 'tell application "System Events" to set frontmost of every process whose unix id is {} to true'
        script = tmpl.format(os.getpid())
        output = subprocess.check_call(['/usr/bin/osascript', '-e', script])
    root.after(0, lambda: root.attributes("-topmost", False))

您可以在 mainloop() 调用之前调用它,如下所示:

raise_app(root)
root.mainloop()

Somewhat of a combination of various other methods found online, this works on OS X 10.11, and Python 3.5.1 running in a venv, and should work on other platforms too. On OS X, it also targets the app by process id rather than app name.

from tkinter import Tk
import os
import subprocess
import platform


def raise_app(root: Tk):
    root.attributes("-topmost", True)
    if platform.system() == 'Darwin':
        tmpl = 'tell application "System Events" to set frontmost of every process whose unix id is {} to true'
        script = tmpl.format(os.getpid())
        output = subprocess.check_call(['/usr/bin/osascript', '-e', script])
    root.after(0, lambda: root.attributes("-topmost", False))

You call it right before the mainloop() call, like so:

raise_app(root)
root.mainloop()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文