Tkinter运行时弹出默认tk窗口,如何阻止该窗口打开?
解决Tkinter弹出默认空白窗口的问题
你的问题根源很明确:你在代码底部主动创建了主Tk窗口实例,但没有隐藏它。那个标题为"tk"的空白窗口就是你用root = Tk()创建的主窗口,你之前错误地去操作MessageBox里的Toplevel窗口,当然不会有效果。
解决步骤
找到代码底部的这段代码:
root = Tk() root.attributes('-alpha', 1.0)
把它改成:
root = Tk() root.withdraw() # 隐藏主Tk窗口
这样主窗口就会被隐藏,只会显示你自定义的MessageBox窗口。
为什么之前的方法无效?
你之前尝试在MessageBox的__init__里用root.attributes('-alpha', 0.0)或者root.withdraw(),但这里的root是Toplevel实例(你的自定义窗口),而那个空白窗口是主Tk实例,两者不是同一个对象,所以操作错了目标。
修改后的完整代码(关键部分已标注)
import tkinter import tkinter.ttk as ttk class MessageBox(object): def __init__(self, msg, b1, b2, parent, cbo, cboList): root = self.root = tkinter.Toplevel(parent) root.title('Auto Email') root.resizable(True, True) root.grab_set() # modal self.msg = str(msg) self.b1_return = True self.b2_return = False # if b1 or b2 is a tuple unpack into the button text & return value if isinstance(b1, tuple): b1, self.b1_return = b1 if isinstance(b2, tuple): b2, self.b2_return = b2 # main frame frm_1 = tkinter.Frame(root) frm_1.pack(ipadx=2, ipady=2) # the message message = tkinter.Label(frm_1, text=self.msg) if cbo: message.pack(padx=8, pady=8) else: message.pack(padx=8, pady=20) # if entry=True create and set focus if cbo: self.cbo = ttk.Combobox(frm_1, state="readonly", justify="center", values= cboList) self.cbo.pack() self.cbo.focus_set() self.cbo.current(0) # button frame frm_2 = tkinter.Frame(frm_1) frm_2.pack(padx=4, pady=4) # buttons btn_1 = tkinter.Button(frm_2, width=8, text=b1) btn_1['command'] = self.b1_action if cbo: btn_1.pack(side='left', padx=5) else: btn_1.pack(side='left', padx=10) if not cbo: btn_1.focus_set() btn_2 = tkinter.Button(frm_2, width=8, text=b2) btn_2['command'] = self.b2_action if cbo: btn_2.pack(side='left', padx=5) else: btn_2.pack(side='left', padx=10) # the enter button will trigger the focused button's action btn_1.bind('<KeyPress-Return>', func=self.b1_action) btn_2.bind('<KeyPress-Return>', func=self.b2_action) #Center on screen root.update_idletasks() window_height = 150 window_width = 300 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() x_cordinate = int((screen_width/2) - (window_width/2)) y_cordinate = int((screen_height/2) - (window_height/2)) root.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) root.protocol("WM_DELETE_WINDOW", self.close_mod) def b1_action(self, event=None): try: x = self.cbo.get() except AttributeError: self.returning = self.b1_return self.root.quit() else: if x: self.returning = x self.root.quit() def b2_action(self, event=None): self.returning = self.b2_return self.root.quit() def close_mod(self): # top right corner cross click: return value ;`x`; # we need to send it a value, otherwise there will be an exception when closing parent window self.returning = ";`x`;" self.root.quit() # from mbox import MessageBox from tkinter import * # 修改这里:隐藏主Tk窗口 root = Tk() root.withdraw() def mbox(msg, b1, b2, parent, cbo=False, cboList=[]): msgbox = MessageBox(msg, b1, b2, parent, cbo, cboList) msgbox.root.geometry('250x125') msgbox.root.mainloop() msgbox.root.destroy() return msgbox.returning prompt = {} # it will only show 2 buttons & 1 label if (cbo and cboList) aren't provided # click on 'x' will return ;`x`; prompt['answer'] = mbox('Do you want to go?', ('Go', 'go'), ('Cancel', 'cancel'), root) ans = prompt['answer'] #print(ans) if ans == 'go': # do stuff pass else: # do stuff pass
内容的提问来源于stack exchange,提问作者starchaser_77
相关产品推荐
相关产品推荐

