【问题标题】:How to prevent Tkinter root window from taking over focus?如何防止 Tkinter 根窗口接管焦点?
【发布时间】:2020-12-12 23:58:57
【问题描述】:

我正在编写一个程序,其中大部分用户交互发生在 Windows 命令行中,但是我将 Tkinter 用于一些文件和目录选择对话框。

当我通过单击 .py 文件启动程序时(在 IDLE 中不会出现问题),命令行启动并且当 Tk 根窗口被实例化时,即使我撤回它,它也会从命令行接管焦点. 此行为需要用户执行额外操作才能将注意力重新集中在命令行窗口上。

这里是一些重现问题的代码示例。

from tkinter import Tk
root_window = Tk()
root_window.withdraw()
name = input("Enter your name:\n")
print("Nice to meet you, " + name)

如何让 Windows 命令行保持焦点?

【问题讨论】:

  • 很奇怪,现在您的示例以预期的方式为我工作 - 即使,十分钟前,它显示了您报告的问题.我在中间尝试的唯一另一件事是为withdraw 调用添加延迟:root_window.after(1, lambda: root_window.withdraw())。延迟参数为零时,它似乎也能按预期工作,但现在我不确定究竟是什么改变了这种行为。
  • 你为什么在这里使用 tkinter?也许有办法从那里绕过
  • AFAIK tkinter 不能处理这个问题,你需要使用一个额外的库来跟踪它,比如 ctypes。但是为什么不使用条目呢? stackoverflow.com/q/30512267
  • 试着说 root.attributes('-topmost',False) 也一定要说 root.mainloop() 并告诉我
  • @Hans,我不知道怎么做,但 10 毫秒的延迟似乎对我有用。谢谢!

标签: python tkinter


【解决方案1】:

太奇怪了,现在你的例子以预期的方式为我工作 - 尽管 十分钟前,它显示了你报告的问题。我在两者之间尝试的唯一另一件事是为撤回调用添加延迟:

root_window.after(1, lambda: root_window.withdraw())

如果延迟参数为零,它似乎也能按预期工作,但现在我不确定究竟是什么改变了这种行为。

【讨论】:

  • 你不觉得1ms太快了吗?也许把它放慢到 1000 左右?
  • 嗯,它用 1ms 为我解决了问题; @hailsatyr 说这对他有用 10 毫秒 - 所以它可能会有所不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2016-04-09
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多