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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:44:55