繁体   English   中英

在循环中连续创建弹出窗口而不阻塞代码

[英]Create popups continuously in a loop without blocking the code

我的程序流式传输数据,我想在满足条件时创建一个显示一些文本的弹出窗口。 我尝试创建一个简单的 tkinter window 和 ctypes window,但两者似乎都阻止了我的代码,阻止它继续运行,直到 Z05B8C74CBD9702FBF4 关闭为止。 如何在例如循环中创建简单的弹出 window 功能?

到目前为止,我所拥有的就是这种结构。

import tkinter as tk
for i in range(11):
    if i%5 == 0:  # Any condition
        popup = tk.Tk()
        label = ttk.Label(popup, text='hi', font=('Verdana', 12))
        label.pack(side='top', padx=10, pady=10)
        popup.mainloop()

import ctypes
for i in range(11):
    if i%5 == 0:  # Any condition
        popup = ctypes.windll.user32.MessageBoxW
        popup(None, 'hi', 'title', 0)

但是,在这两种情况下,循环都不会继续,直到我关闭弹出窗口。

不太熟悉ctypes ,但对于tkinter ,UI 将始终在mainloop期间阻塞您的主代码。

如果你只是实例化你的Tk()而不调用mainloop并使用 function after ,你可以稍微绕过它:

import tkinter as tk
from tkinter.messagebox import showinfo

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

for i in range(10):
    if i in (5, 8):
        root.after(ms=1, func=lambda x=i: showinfo('Message!', f'Stopped at {x}'))

# ... do something here

root.after将消息框排入队列以在 1 毫秒 ( ms=1 ) 后显示。

更好的方法可能是在ctypes中创建一个无模式的消息/对话框,但如前所述,我不太熟悉,快速搜索并没有产生任何简单的解决方案。

案例 1 - Tkinter:

您正在使用mainloop()这与真正的 while 循环没有什么不同。 您可以通过删除它使其连续运行。

import tkinter as tk
from tkinter import ttk

for i in range(11):
    if i%5 == 0:  # Any condition
        popup = tk.Tk()
        label = ttk.Label(popup, text='hi', font=('Verdana', 12))
        label.pack(side='top', padx=10, pady=10)

案例 2 - Ctypes:

要使其连续运行,您将不得不使用threading

import ctypes, threading

for i in range(11):
    if i%5 == 0:  # Any condition
        popup = ctypes.windll.user32.MessageBoxW
        threading.Thread(target = lambda :popup(None, 'hi', 'title', 0)).start()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM