有没有一种方法可以实时更新tkinter消息框?

时间:2020-10-03 07:23:54

标签: python-3.x tkinter

我正在尝试制作一个GUI(使用tkinter)以使用测试用例检查代码。就像在Hackerrank,SPOJ,CodeForces等竞争性编程网站中看到的一样。

现在,我已经设法以某种方式在终端中打印出代码失败的测试案例以及代码通过的代码。

但是要注意的是,我想在tkinter消息框中做同样的事情。

我的代码循环运行,因此它检查每个测试用例,然后立即打印出结果,而不是将所有结果存储在列表中并在最后检查它们。

所以我希望我的Messagebox也做同样的事情,即每次评估一个测试用例时都进行更新,并显示该测试用例是否通过了?

是否可以实施?

2 个答案:

答案 0 :(得分:3)

如果您的意思是tkinter随附的消息框模块,则否。但是,您可以使用Toplevel小部件轻松制作自己的消息框,而这些消息框可以执行您想要的任何事情。

答案 1 :(得分:2)

正如Novel在他的回答中建议的那样,创建从messagebox继承的tk.Toplevel,这是一个(不是最好的)工作解决方案,将满足您描述的目的。

它继承自tk.Toplevel类。

我的消息框文档:D

我实现了一种名为updateInfo()的方法,可以简单地用于更新消息以及窗口标题。

请注意,窗口的大小,字体,颜色始终是可自定义的,因此可以随意添加。 这是实现:

import tkinter as tk

class MyCrazyBox(tk.Toplevel):
    def __init__(self, title='', message=''):
        tk.Toplevel.__init__(self)
        self.geometry('400x200+200+100') # Must change these accordingly
        self.title(title)
        # set the options according to your needs.
        self.messageLabel = tk.Label(self, text=message,
                                     bg='#fff', fg='#000', font=('roboto', 25))
        self.messageLabel.pack(expand=True, fill=tk.BOTH)

    def updateInfo(self, title='', message=''):
        self.title(title)
        self.messageLabel.configure(text=message)


# To create a new message box just create an instance of the class MyCrazyBox

titlemessage的默认值为''-一个空字符串-如果创建am instance时未提供。

下面所有这些示例都将根据类messagebox创建一个MyCrazyBox

# 1. MyCrazyBox('Info', 'Loading....') # both title and message provided
# 2. MyCrazyBox(title='test', message='Just a check') 
# 3. BoxVariable = MyCrazyBox('warning', 'Wrong credentials')
# 4. MyCrazyBox('Just the title')
# 5. MyCrazyBox(message='Where is the title, you freak?')

一旦创建了一个框,就可以使用同一框来通过.updateInfo()方法根据需要多次更新信息。

重要提示::如果要使用assign方法,则需要将MyCrazyBox实例variable .updateInfo()

喜欢

aBox = MyCrazyBox('Info', 'Loading....')
root.after(4000, lambda: aBox.updateInfo('Info', 'Still Running the test case'))
root.after(5554, lambda: aBox.updateInfo('Congrats', 'Test case Passed'))
# added delay to simulate some process happening

简单地说 aBox.updateInfo('Test', 'Just checking')将使用提供的参数更新该框。 argument的性质与class instance的创建相同。

完整示例

import tkinter as tk

class MyCrazyBox(tk.Toplevel):
    def __init__(self, title='', message=''):
        tk.Toplevel.__init__(self)
        self.geometry('400x200+200+100') # Must change these accordingly
        self.title(title)
        # set the options according to your needs.
        self.messageLabel = tk.Label(self, text=message,
                                     bg='#fff', fg='#000', font=('roboto', 25))
        self.messageLabel.pack(expand=True, fill=tk.BOTH)

    def updateInfo(self, title='', message=''):
        self.title(title)
        self.messageLabel.configure(text=message)
        
def dosomething():
    aBox = MyCrazyBox('Info', 'Running test case 1..')
    root.after(5000, lambda: aBox.updateInfo('Congrats', 'Test case 1 Passed.'))
    # just to simulate a delay of 5 sec in checking test case
    
root = tk.Tk()
tk.Button(root, text='Do something', command=dosomething).pack()
root.mainloop()