Tkinter点击MessageBox的OK按钮后如何让次级窗口不隐藏并保持激活
问题原因
默认情况下Tkinter的
messagebox未指定父控件时,会自动将程序启动的主Tk()实例作为父级,关闭消息框后焦点会自动回到父级主窗口,尺寸和主窗口接近的次级Toplevel窗口就会被主窗口完全遮挡,看起来像隐藏到了任务栏底部。
解决方法
核心修改逻辑
给所有弹窗指定父控件为次级窗口,关闭弹窗后焦点就会自动回到次级窗口,不会跳转回主窗口。
- 第一步:让
insert()函数可以访问到次级窗口的实例,这里以全局变量方案为例,修改次级窗口生成代码:
from aaa import bbb # 声明全局变量存储次级窗口实例 secondary_root = None def form_secondary(): global secondary_root secondary_root = tk.Toplevel() secondary_root.title("secondary") secondary_root.geometry("1920x1080+0+0") secondary_root.config(bg="white") secondary_root.state("normal") # 可选补充:让次级窗口始终显示在主窗口上方,不会被主窗口遮挡 # secondary_root.transient(window)
- 第二步:修改
insert()函数,给messagebox添加parent参数,可选添加强制聚焦代码兜底:
def insert(): if aaaa() == "" or bbbb.get() =="" or cccc.get() == "" or ddddd.get() == "" or eeee.get() == "" or fffff.get() == "": # 指定父控件为次级窗口 messagebox.showerror("存在空字段,请填写所有内容", parent=secondary_root) return db.insert(aaaa.get(), bbbb.get(), cccc.get(), ddddd.get(), eeee.get, fffff.get()) # 指定父控件为次级窗口 messagebox.showinfo("记录插入成功", parent=secondary_root) # 可选补充:强制拉回焦点到次级窗口,双重保障不会被主窗口遮挡 secondary_root.focus_force() clearAll() dispalyAll()
内容的提问来源于stack exchange,提问作者user17503353
相关产品推荐
相关产品推荐

