【问题标题】:Tkinter Messagebox causing Entry to disableTkinter 消息框导致条目禁用
【发布时间】:2015-04-29 04:11:25
【问题描述】:

所以我用 Tkinter 创建了一个简单的输入窗口,但是每当我显示 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 行时,我都可以在输入框中输入,但当它在那里时我不能。

【问题讨论】:

    标签: python tkinter messagebox tkinter-entry


    【解决方案1】:

    tkinter 消息框默认对话框是modal。这意味着你需要 在返回父应用程序之前关闭子窗口(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()
    

    【讨论】:

    • 我每次都关闭信息框,但条目被冻结,我添加了一个具有一些功能的按钮,并且在我关闭信息框后它可以正常工作。我试过按“x”并确定,但没有使输入框起作用。
    • 这可能是因为您在启动事件循环之前显示了 tkMessageBox。尝试使用回调,就像我编辑了要包含的答案一样。
    • 所以我添加了它并且它可以工作,但是我触发了 showinfo 框以在我的实际代码中的 if 语句上弹出,我无法在按下按钮时触发它。我是不是用错了信息框,它不应该像普通的“功能”一样被调用,就像我需要从按钮调用它才能正常工作一样?
    • 您能否编辑您的问题以在 if 语句中包含您的代码?
    • 你绝对可以在 if 语句中使用它
    【解决方案2】:

    我为此制定的解决方案是覆盖 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
    

    实际上,这就是我在编写测试期间处理我面临的许多问题的方式。我重写实用程序函数以添加日志记录或避免案例。

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2018-07-03
      • 2020-11-30
      • 1970-01-01
      相关资源
      最近更新 更多