gpt4 book ai didi

python - While 循环锁应用

转载 作者:行者123 更新时间:2023-11-30 21:49:58 24 4
gpt4 key购买 nike

我已经为我正在开发的一个应用程序苦恼了一段时间了。经过几个小时的尝试调试界面锁定且无法执行其他操作的问题后,我发现这是可怕的 While 循环。请参阅下面的示例并运行它。当您通过单击按钮启动 while 循环时,您无法在屏幕上执行任何其他操作。在这种情况下,它只是一个需要按下的简单警报按钮。

from Tkinter import *
import tkMessageBox

root = Tk()
root.geometry("450x250+300+300")
root.title("Raspberry PI Test")

def myloop():
count = 0
while (count < 500):
print 'The count is:', count
count = count + 1

print "Good bye!"

def mymessage():
tkMessageBox.showinfo(title="Alert", message="Hello World!")

buttonLoop = Button(root, text="Start Loop", command=myloop)
buttonLoop.place(x=5, y=15)

buttonMessage = Button(root, text="Start Loop", command=mymessage)
buttonMessage.place(x=85, y=15)


root.mainloop()

如何才能有一个需要运行到计数完成为止的循环,并且仍然能够在我的应用程序中执行其他任务?我还应该注意到,我已经使用线程尝试过同样的事情,但这并不重要。在您可以执行任何操作之前,UI 仍在等待 While 循环结束。

最佳答案

既然我更了解你想要什么(秒表),我会推荐 root.after 命令

from Tkinter import *
import tkMessageBox
import threading
import time
root = Tk()
root.geometry("450x250+300+300")
root.title("Raspberry PI Test")
print dir(root)
count = 0
def start_counter():
global count
count = 500
root.after(1,update_counter)
def update_counter():
global count
count -= 1
if count < 0:
count_complete()
else:
root.after(1,update_counter)

def count_complete():
print "DONE COUNTING!! ... I am now back in the main thread"
def mymessage():
tkMessageBox.showinfo(title="Alert", message="Hello World!")

buttonLoop = Button(root, text="Start Loop", command=myloop)
buttonLoop.place(x=5, y=15)

buttonMessage = Button(root, text="Start Loop", command=mymessage)
buttonMessage.place(x=85, y=15)


root.mainloop()

(原答案如下)

使用线程

from Tkinter import *
import tkMessageBox
import threading
import time
root = Tk()
root.geometry("450x250+300+300")
root.title("Raspberry PI Test")
print dir(root)
def myloop():
def run():
count = 0
while (count < 500) and root.wm_state():
print 'The count is:', count
count = count + 1
time.sleep(1)

root.after(1,count_complete)
thread = threading.Thread(target=run)
thread.start()
def count_complete():
print "DONE COUNTING!! ... I am now back in the main thread"
def mymessage():
tkMessageBox.showinfo(title="Alert", message="Hello World!")

buttonLoop = Button(root, text="Start Loop", command=myloop)
buttonLoop.place(x=5, y=15)

buttonMessage = Button(root, text="Start Loop", command=mymessage)
buttonMessage.place(x=85, y=15)


root.mainloop()

请注意,当您显示信息框时,该信息框将在 Windows api 级别阻塞,因此线程计数将等到该框关闭为止...为了解决这个问题,我认为您可以用多处理替换线程

关于python - While 循环锁应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28639228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com