python一次生成多个消息框

时间:2018-02-28 15:20:46

标签: python tkinter

我需要我的程序来生成多个消息框。 它们必须立即以级联方式生成。 (把它想象成恶意活动的模仿)

我尝试使用Tkinter:

import Tkinter
import tkMessageBox

for i in range(0,5):
    tkMessageBox.showerror("", "oops")

但似乎程序在显示下一个之前等待用户与每条消息的交互,这不是我需要的 并且可选左上角有一个空表格。任何摆脱它的想法?

2 个答案:

答案 0 :(得分:0)

解决方案可能是在这里使用TopLevel()。这将允许弹出所有窗口,您也可以设置客户消息框样式。

这是一个简单的示例,它将同时打开所有窗口,同时隐藏根窗口。下面将所有窗口堆叠在一起,你可以移动它们。如果您愿意,还可以提供一些跟踪变量来打开不同位置的每个窗口。

#For python 3 imports:
import tkinter as tk
from tkinter import ttk
# for python 2 imports:
# import Tkinter as tk
# import ttk

root = tk.Tk()
root.withdraw()

for i in range(0,5):
    x = tk.Toplevel(root)
    x.title("Error Box!")
    x.geometry("150x75+0+0")
    x.resizable(False, False)
    ttk.Label(x, text = "oops").pack()
    ttk.Button(x, text = " OK ", command = x.destroy).pack(side=tk.BOTTOM)

root.mainloop()

在回复您对使用计数器的评论时,请参阅以下代码:

#For python 3 imports:
import tkinter as tk
from tkinter import ttk
# for python 2 imports:
# import Tkinter as tk
# import ttk

root = tk.Tk()
root.withdraw()
counter = 0

def close_window(top_window):
    global counter
    top_window.destroy()
    counter -= 1
    if counter == 0:
        print("destroying root window")
        root.destroy()

for i in range(0,5):
    counter += 1
    x = tk.Toplevel(root)
    x.title("Error Box!")
    x.geometry("150x75+0+0")
    x.resizable(False, False)
    ttk.Label(x, text="oops").pack()
    ttk.Button(x, text=" OK ", command=lambda tw=x: close_window(tw)).pack(side=tk.BOTTOM)
    # this protocol() method is used to re-rout the window close event to a customer function.
    # this will allow us to keep our counter and close windows as needed.
    x.protocol("WM_DELETE_WINDOW", lambda tw=x: close_window(tw))

root.mainloop()

更好的是,这是一个将项目放在列表中的示例,因此我们不需要计数器。

#For python 3 imports:
import tkinter as tk
from tkinter import ttk
# for python 2 imports:
# import Tkinter as tk
# import ttk

root = tk.Tk()
root.withdraw()

list_of_windows = []

def close_window(tw):
    i = list_of_windows.index(tw)
    list_of_windows[i].destroy()
    del list_of_windows[i]
    if len(list_of_windows) == 0:
        root.destroy()
        print("root destroyed!")

for i in range(0,5):
    x = tk.Toplevel(root)
    x.title("Error Box!")
    x.geometry("150x75+0+0")
    x.resizable(False, False)
    ttk.Label(x, text="oops").pack()
    ttk.Button(x, text=" OK ", command=lambda tw=x: close_window(tw)).pack(side=tk.BOTTOM)
    x.protocol("WM_DELETE_WINDOW", lambda tw=x: close_window(tw))
    list_of_windows.append(x)

root.mainloop()

答案 1 :(得分:-1)

我的结论: 使用tk消息框不是最好的方法, 因为消息框是模态的,并且没有直接的方法来改变它。 所以我只是得到一个形状像消息框的形式,并产生了理想的数量。 结束以下代码:

from Tkinter import *

di = {}

for i in range(5):
    di[i] = Tk()
    offset = 300 + i*10
    di[i].geometry('150x50+'+str(offset)+'+'+str(offset))
    di[i].title('')
    di[i].resizable(False, False)
    la = Label(di[i],text = 'oops').pack()
    button = Button(di[i], text = 'OK', command=di[i].destroy).pack()

di[0].mainloop()    

它很好地满足了我的需求。感谢Nae和Vasilis G.的回应,让我得到了一份有效的代码。