Tkinter中如何禁止MessageBox弹出时点击boxShow窗口的按钮
解决Tkinter messagebox阻塞子窗口按钮的问题
你的问题核心在于:messagebox默认以主窗口root作为父窗口,所以只会阻塞主窗口,而你用Tk()创建的boxShow是另一个独立的根窗口,不会被阻塞。要实现messagebox打开时阻塞boxShow窗口的按钮,需要做两个关键修改:
- 用
Toplevel替代Tk()创建boxShow(一个Tk程序应该只有一个根窗口,其他窗口用Toplevel作为子窗口) - 调用
messagebox时指定父窗口为boxShow,让模态对话框绑定到这个子窗口
修改后的完整代码
from tkinter import * from tkinter import messagebox def showbox(parent): # 指定messagebox的父窗口为boxShow messagebox.showinfo("Title", "Random text", parent=parent) def show(): # 用Toplevel创建子窗口,依附于root boxShow = Toplevel(root) boxShow.geometry("800x250") # 把boxShow作为参数传给showbox Button(boxShow, text="messagebox", command=lambda: showbox(boxShow)).pack() root = Tk() root.title("Main Window") root.geometry("500x500") show_button = Button(root, text="Show popup", command=show) show_button.place(x=200, y=200) root.mainloop()
关键说明
- 用Toplevel创建子窗口:
Toplevel是依附于已有根窗口的子窗口,而Tk()会创建新的独立根窗口,这不符合Tkinter的设计规范,也会导致模态对话框无法正确阻塞它。 - 指定messagebox的parent参数:通过
parent=boxShow,让messagebox以boxShow为父窗口,此时对话框会成为boxShow的模态窗口,打开时boxShow上的所有控件都会被阻塞,无法点击。
内容的提问来源于stack exchange,提问作者Giannis Tsakas
相关产品推荐
相关产品推荐

