Windows下Python Tkinter打开对话框时主窗口抢占焦点如何解决
解决方案
该层级异常是Windows平台Tkinter的特有表现:系统原生文件对话框默认将主Tk窗口作为父级,触发时会自动把主窗口拉到最前,导致新建的Toplevel窗口被挡在主窗口后方。
你只需要在调用文件对话框时,显式指定parent参数为当前触发的Toplevel实例即可修复问题,不需要额外调用lift()或者设置topmost属性。
修改点说明
仅需要调整NewWindow类的open_dialog方法,添加parent=self参数:
def open_dialog(self): global path # 显式指定当前Toplevel为对话框父级 path = filedialog.askopenfilename(initialdir="/c", title="Choose File", parent=self)
完整可运行代码
import tkinter.ttk as ttk import tkinter as tk from tkinter import filedialog class MainWindow(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.title("main window") self.geometry('100x100') self.new_window_button = ttk.Button(self, text="open new window", command=self.open_new_window) self.new_window_button.pack() def open_new_window(self): NewWindow(self) class NewWindow(tk.Toplevel): def __init__(self, master, *args, **kwargs): tk.Toplevel.__init__(self, master, *args, **kwargs) self.title("new window") self.geometry('100x100') path = "" self.open_dialog_button = ttk.Button(self, text='open dialog', command=self.open_dialog) self.open_dialog_button.pack() def open_dialog(self): global path path = filedialog.askopenfilename(initialdir="/c", title="Choose File", parent=self) def main(): run = MainWindow() run.mainloop() if __name__ == '__main__': main()
效果确认
修改后触发文件对话框时,窗口层级从后到前为主窗口 → 新建Toplevel窗口 → 文件对话框,完全符合预期。
内容的提问来源于stack exchange,提问作者Naveh Elya
相关产品推荐
相关产品推荐

