在调用命令创建新的顶级后,Tkinter OptionMenu 重新聚焦于自身

问题描述 投票:0回答:1

我正在使用 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()

The picture has two tkinter windows, the OptionMenu is on the left window and is focused. The right window is unfocued due to the bug described

我尝试了https://stackoverflow.com/a/36191443/2860949的解决方案,但它不起作用。

在 macOS Catalina 10.15.5、来自 python.org 的 python 3.7.6 上进行了测试。

python tkinter
1个回答
0
投票

无论您在何处创建

Toplevel_name.focus_set()
,都可以使用此
Toplevel
方法。此方法适用于任何小部件,它将键盘焦点移动到特定小部件,这意味着发送到应用程序的所有键盘事件都将路由到该小部件。

有关基本小部件方法的完整列表,请参阅 https://effbot.org/tkinterbook/widget.htm

© www.soinside.com 2019 - 2024. All rights reserved.