![](/img/trans.png)
[英]How to write data to a file continuously without blocking main loop in Python
[英]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
中创建一个无模式的消息/对话框,但如前所述,我不太熟悉,快速搜索并没有产生任何简单的解决方案。
您正在使用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)
要使其连续运行,您将不得不使用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.