Tkinter Messagebox 导致 Entry 被禁用

Tkinter Messagebox causing Entry to disable

所以我用 Tkinter 创建了一个简单的输入 window 但是每当我有一个 showinfo 显示时我无法在输入框中输入

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


root = tk.Tk()
root.title("hello world")
root.minsize(700,600)

abc = StringVar()
abc.set("abc")
Entry(root, bd = 1, width = 50, textvariable=abc).pack(side = TOP)
showinfo('info', 'hello')
root.mainloop() 

我不确定我的 Python (3.4) 或 tkinter 是否有问题,但每当我取出 showinfo 行时,我都可以在输入框中输入,但当它出现时我不能.

tkinter messagebox 默认对话框是modal。这意味着你需要 在 return 到父应用程序之前关闭子 window(tkinter 消息框)。

因此,您的 python 或 tkinter 没有任何问题;此行为是有意的。

在事件循环开始之前不显示 tkinter 消息框。试试这个:

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


 def callback():
     showinfo("info", "hello")

 root = tk.Tk()
 root.title("hello world")
 root.minsize(700,600)

 abc = StringVar()
 abc.set("abc")
 Entry(root, bd=1, width=50, textvariable=abc).pack(side=TOP)
 Button(root, text="OK", command=callback).pack()
 root.mainloop()

我为此制定的解决方案覆盖了 messagebox.showerror 所以例如我制定了

import logging
from tkinter import messagebox

                                                           
logging.basicConfig(                                            
    level=logging.DEBUG,                                        
    format='%(asctime)s [%(levelname)s] %(name)s "%(message)s"',
)                                                               
LOGGER = logging.getLogger(__name__)                            

def test_showerror(title, message):              
    LOGGER.debug(f'{title} Message -> {message}')

messagebox.showerror = test_showerror

实际上,这就是我处理在编写测试过程中遇到的许多问题的方式。我覆盖实用程序函数以添加日志记录或避免案例。