You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 11:45:04