python在上生成多个消息框

2024-06-11 22:36:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要我的程序产生多个消息框。 它们必须立刻以瀑布的形式繁殖。 (认为这是恶意行为的模仿)

我试着用Tkinter做这个:

import Tkinter
import tkMessageBox

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

但程序似乎要等待用户与每条消息的交互,然后才显示下一条消息,这并不完全是我所需要的 可选左上角有一个空表单。有什么办法摆脱它吗?在


Tags: 用户inimport程序消息表单fortkinter
2条回答

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

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

#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()

针对您对使用计数器的评论,请参阅以下代码:

^{pr2}$

更好的是这里有一个例子,它将项目放在列表中,这样我们就不需要计数器了。在

#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()

我的结论是: 使用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和vasilisg。他们的友好回应让我找到了一个有效的代码。在

相关问题 更多 >