showinfo 和 showwarning 在 tkinter.messagebox 的背景中出现

showinfo and showwarning appearing in the background in tkinter.messagebox

我想使用 tkinter.messagebox 显示警告消息和信息消息。我创建并撤销 root,然后我调用 showwarningshowinfo。根 window 消失了,但是消息框消失了。它实际上进入后台,任务栏上没有按钮。访问它的唯一方法是 alt+tab

如果我注释掉 root.withdraw() 调用,根目录和消息框都会出现。

我做错了什么?

代码:

import tkinter as tk
from tkinter.messagebox import showinfo, showwarning

def create_database():
    root = tk.Tk()
    root.withdraw()
    if os.path.exists(create_url()):
        showwarning('Failure', 'You failed!')
    else:
        showinfo('Success!', 'Everything went fine')
    root.destroy()

这是因为 Flask 正在阻塞 tkinter,如 所述。解决方法是把tkinterwindow放在单独的进程中。因此,问题中的代码变为:

from multiprocessing import Process
from tkinter.messagebox import showinfo, showwarning

def show_warning_window():
    root = tk.Tk()
    root.withdraw()
    showwarning('File exists', 'The database file already exists!')
    root.destroy()


def show_info_window():
    root = tk.Tk()
    root.withdraw()
    showinfo('Success!', 'The database was created.')
    root.destroy()


def create_database():
    if os.path.exists(create_url()):
        p = Process(target=show_warning_window)
        p.start()
        p.join()
    else:
        engine = create_engine(create_uri(), echo=True)
        Base.metadata.create_all(engine)
        p = Process(target=show_info_window)
        p.start()
        p.join()

稍后编辑:要使其正常工作,重要的是服务器不应处于 开发 模式。 set_env 变量不应设置为 development