我正在使用 Tkinter OptionMenu 创建一个顶级窗口。但是,我发现在创建窗口后,如果我稍微移动光标,焦点将返回到我的主屏幕(左侧的小屏幕),而不是新创建的顶层。
如果我使用 Button 而不是 OptionMenu 来执行相同的操作,新的顶级窗口将正确发送到前面。
这是产生错误的代码:
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_button()
self.create_dropdown()
def create_button(self):
self.button = tk.Button(self)
self.button["text"] = "Create Toplevel"
# this works correctly, new topmost sent to the top
self.button["command"] = self.create_toplevel
self.button.pack(side="top")
def create_dropdown(self):
self.current_dropdown_option = tk.StringVar(self.master)
self.current_dropdown_option.set("Choose an option")
# this doesn't work correctly, the new Toplevel is sent to the back
self.dropdown = tk.OptionMenu(self.master, self.current_dropdown_option,
"Option 1", command=self.create_toplevel_for_dropdown)
self.dropdown.pack(side="top")
def create_toplevel(self):
self.toplevel = tk.Toplevel(self.master)
self.toplevel.geometry("600x600")
def create_toplevel_for_dropdown(self, arg):
self.toplevel = tk.Toplevel(self.master)
self.toplevel.geometry("600x600")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
我尝试了https://stackoverflow.com/a/36191443/2860949的解决方案,但它不起作用。
在 macOS Catalina 10.15.5、来自 python.org 的 python 3.7.6 上进行了测试。
无论您在何处创建
Toplevel_name.focus_set()
,都可以使用此 Toplevel
方法。此方法适用于任何小部件,它将键盘焦点移动到特定小部件,这意味着发送到应用程序的所有键盘事件都将路由到该小部件。
有关基本小部件方法的完整列表,请参阅 https://effbot.org/tkinterbook/widget.htm。