tkinter:调用消息框后无法输入

tkinter: No input possible after messagebox is called

我想在我的程序开始时调用消息框(messagebox.showwarning)来通知用户一些事情。 当用户单击“确定”时,将打开一个 GUI。用户可以在那里进行输入。

问题: 显示警告后无法输入。没有警告 window 输入工作没有任何问题。

是否有用户可以提供输入的解决方案?

我在这里包含了一个代码片段:

import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.geometry('420x100')

# Input doesn't work after the messagebox
messagebox.showwarning("Warning", "Some Serious Warning.")

# Label
li = Label(root, text="Input 1")
li.grid(row=0, column=0)
li = Label(root, text="Input 2")
li.grid(row=0, column=2)
li = Label(root, text="Dropdown")
li.grid(row=1, column=0)
li = Label(root, text="Input 3")
li.grid(row=1, column=2)

# Input
url_text = StringVar()
e1 = Entry(root, textvariable=url_text)
e1.grid(row=0, column=1)

# Dropdown Menu
OptionList = [
    "1",
    "2",
    "3"
]
input1 = StringVar()
input1.set(OptionList[0])
e3 = tk.OptionMenu(root, input1, *OptionList)
e3.config(width=12, font=('Helvetica', 9))
e3.grid(row=1, column=1)

input2 = StringVar()
e2 = Entry(root, textvariable=input2)
e2.grid(row=0, column=3)

input3 = StringVar()
e4 = Entry(root, textvariable=input3)
e4.grid(row=1, column=3)

# Button
b1 = Button(root, text="Run", width=12)
b1.grid(row=2, column=1)

b2 = Button(root, text="Help", width=12)
b2.grid(row=2, column=2)

b3 = Button(root, text="Exit", width=12)
b3.grid(row=2, column=3, pady=(10, 10))

root.mainloop()

您需要在显示消息框之前调用 root.wait_visibility()root.update():

root.wait_visibility()  # or root.update()
messagebox.showwarning("Warning", "Some Serious Warning.")

或者显示消息框后使用foucs_force()获取焦点:

messagebox.showwarning("Warning", "Some Serious Warning.")
root.focus_force()

早些时候,当您同意消息框时,您的图形用户界面正在构建 window 由锁定您的标签的消息框创建。使用 class 方法修复了此问题,但需要手动关闭消息框创建的 window。 我建议不要使用消息框,而是创建一个标签或一个新的 window 作为错误框。

import tkinter as tk
from tkinter import *
from tkinter import messagebox

class app:
    def __init__(self):
        hi=messagebox.showwarning("Warning", "Some Serious Warning.")
    
        self.window=tk.Tk()
        self.window.geometry('420x100')

        # Label
        li = Label(self.window, text="Input 1")
        li.grid(row=0, column=0)
        li = Label(self.window, text="Input 2")
        li.grid(row=0, column=2)
        li = Label(self.window, text="Dropdown")
        li.grid(row=1, column=0)
        li = Label(self.window, text="Input 3")
        li.grid(row=1, column=2)

        # Input
        url_text = StringVar()
        e1 = Entry(self.window, textvariable=url_text)
        e1.grid(row=0, column=1)

        # Dropdown Menu
        OptionList = [
            "1",
            "2",
            "3"
        ]
        input1 = StringVar()
        input1.set(OptionList[0])
        e3 = tk.OptionMenu(self.window, input1, *OptionList)
        e3.config(width=12, font=('Helvetica', 9))
        e3.grid(row=1, column=1)

        input2 = StringVar()
        e2 = Entry(self.window, textvariable=input2)
        e2.grid(row=0, column=3)

        input3 = StringVar()
        e4 = Entry(self.window, textvariable=input3)
        e4.grid(row=1, column=3)

        # Button
        b1 = Button(self.window, text="Run", width=12)
        b1.grid(row=2, column=1)

        b2 = Button(self.window, text="Help", width=12)
        b2.grid(row=2, column=2)

        b3 = Button(self.window, text="Exit", width=12)
        b3.grid(row=2, column=3, pady=(10, 10))
    
game=app()
game.window.mainloop()