Python Tkinter While 线程
Python Tkinter While Thread
好吧,我在 python 有点新手,而且我越来越难以在 Tkinter 中创建一个线程,正如你们都知道的那样,在 Tkinter 中使用 while 会使它没有响应并且脚本仍然 运行.
def scheduler():
def wait():
schedule.run_pending()
time.sleep(1)
return
Hours = ScheduleTest()
if len(Hours) == 0:
print("You need to write Hours, Example: 13:30,20:07")
if len(Hours) > 0:
print("Scheduled: ", str(Hours))
if len(Hours) == 1:
schedule.every().day.at(Hours[0]).do(Jumper)
print("Will jump 1 time")
elif len(Hours) == 2:
schedule.every().day.at(Hours[0]).do(Jumper)
schedule.every().day.at(Hours[1]).do(Jumper)
print("Will jump 2 times")
elif len(Hours) == 3:
schedule.every().day.at(Hours[0]).do(Jumper)
schedule.every().day.at(Hours[1]).do(Jumper)
schedule.every().day.at(Hours[2]).do(Jumper)
print("Will jump 3 times")
while True:
t = threading.Thread(target=wait)
t.start()
return
scheduler()
我试过这样做,但它仍然使 tkinter 没有响应
提前致谢。
什么时候使用after方法;在没有线程的情况下伪造
如评论中所述,在大多数情况下,您不需要线程化到 运行“假”while 循环。您可以使用 after()
方法来安排您的操作,使用 tkinter
的 mainloop
作为“衣架”来安排事情,就像您在 while 循环中一样。
这适用于您可以简单地抛出命令的所有情况,例如subprocess.Popen()
、更新小部件、显示消息等
它不当计划进程花费大量时间时,运行宁在主循环中工作。因此 time.sleep()
是一个无赖;它只会保存 mainloop
.
工作原理
然而,在该限制内,您可以 运行 复杂的任务,安排操作甚至设置 break
(-等价)条件。
只需创建一个函数,用 window.after(0, <function>)
启动它。在函数内部,(重新)使用 window.after(<time_in_milliseconds>, <function>)
.
安排函数
要应用类似中断的条件,只需路由进程(在函数内)不再被安排。
一个例子
最好用一个简化的例子来说明:
from tkinter import *
import time
class TestWhile:
def __init__(self):
self.window = Tk()
shape = Canvas(width=200, height=0).grid(column=0, row=0)
self.showtext = Label(text="Wait and see...")
self.showtext.grid(column=0, row=1)
fakebutton = Button(
text="Useless button"
)
fakebutton.grid(column=0, row=2)
# initiate fake while
self.window.after(0, self.fakewhile)
self.cycles = 0
self.window.minsize(width=200, height=50)
self.window.title("Test 123(4)")
self.window.mainloop()
def fakewhile(self):
# You can schedule anything in here
if self.cycles == 5:
self.showtext.configure(text="Five seconds passed")
elif self.cycles == 10:
self.showtext.configure(text="Ten seconds passed...")
elif self.cycles == 15:
self.showtext.configure(text="I quit...")
"""
If the fake while loop should only run a limited number of times,
add a counter
"""
self.cycles = self.cycles+1
"""
Since we do not use while, break will not work, but simply
"routing" the loop to not being scheduled is equivalent to "break":
"""
if self.cycles <= 15:
self.window.after(1000, self.fakewhile)
else:
# start over again
self.cycles = 0
self.window.after(1000, self.fakewhile)
# or: fakebreak, in that case, uncomment below and comment out the
# two lines above
# pass
TestWhile()
在上面的示例中,我们 运行 一个十五秒的预定进程。在循环 运行 秒时,函数 fakewhile()
.
及时执行了几个简单的任务
在这十五秒之后,我们可以重新开始或者“休息”。只需取消注释指定部分即可查看...
好吧,我在 python 有点新手,而且我越来越难以在 Tkinter 中创建一个线程,正如你们都知道的那样,在 Tkinter 中使用 while 会使它没有响应并且脚本仍然 运行.
def scheduler():
def wait():
schedule.run_pending()
time.sleep(1)
return
Hours = ScheduleTest()
if len(Hours) == 0:
print("You need to write Hours, Example: 13:30,20:07")
if len(Hours) > 0:
print("Scheduled: ", str(Hours))
if len(Hours) == 1:
schedule.every().day.at(Hours[0]).do(Jumper)
print("Will jump 1 time")
elif len(Hours) == 2:
schedule.every().day.at(Hours[0]).do(Jumper)
schedule.every().day.at(Hours[1]).do(Jumper)
print("Will jump 2 times")
elif len(Hours) == 3:
schedule.every().day.at(Hours[0]).do(Jumper)
schedule.every().day.at(Hours[1]).do(Jumper)
schedule.every().day.at(Hours[2]).do(Jumper)
print("Will jump 3 times")
while True:
t = threading.Thread(target=wait)
t.start()
return
scheduler()
我试过这样做,但它仍然使 tkinter 没有响应 提前致谢。
什么时候使用after方法;在没有线程的情况下伪造
如评论中所述,在大多数情况下,您不需要线程化到 运行“假”while 循环。您可以使用 after()
方法来安排您的操作,使用 tkinter
的 mainloop
作为“衣架”来安排事情,就像您在 while 循环中一样。
这适用于您可以简单地抛出命令的所有情况,例如subprocess.Popen()
、更新小部件、显示消息等
它不当计划进程花费大量时间时,运行宁在主循环中工作。因此 time.sleep()
是一个无赖;它只会保存 mainloop
.
工作原理
然而,在该限制内,您可以 运行 复杂的任务,安排操作甚至设置 break
(-等价)条件。
只需创建一个函数,用 window.after(0, <function>)
启动它。在函数内部,(重新)使用 window.after(<time_in_milliseconds>, <function>)
.
要应用类似中断的条件,只需路由进程(在函数内)不再被安排。
一个例子
最好用一个简化的例子来说明:
from tkinter import *
import time
class TestWhile:
def __init__(self):
self.window = Tk()
shape = Canvas(width=200, height=0).grid(column=0, row=0)
self.showtext = Label(text="Wait and see...")
self.showtext.grid(column=0, row=1)
fakebutton = Button(
text="Useless button"
)
fakebutton.grid(column=0, row=2)
# initiate fake while
self.window.after(0, self.fakewhile)
self.cycles = 0
self.window.minsize(width=200, height=50)
self.window.title("Test 123(4)")
self.window.mainloop()
def fakewhile(self):
# You can schedule anything in here
if self.cycles == 5:
self.showtext.configure(text="Five seconds passed")
elif self.cycles == 10:
self.showtext.configure(text="Ten seconds passed...")
elif self.cycles == 15:
self.showtext.configure(text="I quit...")
"""
If the fake while loop should only run a limited number of times,
add a counter
"""
self.cycles = self.cycles+1
"""
Since we do not use while, break will not work, but simply
"routing" the loop to not being scheduled is equivalent to "break":
"""
if self.cycles <= 15:
self.window.after(1000, self.fakewhile)
else:
# start over again
self.cycles = 0
self.window.after(1000, self.fakewhile)
# or: fakebreak, in that case, uncomment below and comment out the
# two lines above
# pass
TestWhile()
在上面的示例中,我们 运行 一个十五秒的预定进程。在循环 运行 秒时,函数 fakewhile()
.
在这十五秒之后,我们可以重新开始或者“休息”。只需取消注释指定部分即可查看...