我尝试使用开始按钮启动while循环并使用停止按钮停止但我无法找到一种有效的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我尝试使用开始按钮启动while循环并使用停止按钮停止但我无法找到一种有效的方法相关的知识,希望对你有一定的参考价值。
我尝试使用开始按钮启动while循环并使用停止按钮停止但我无法找到一种有效的方法。
我在Python 3.7中使用tkinter
我试过这个但是不行
有人给我一些修复或有用的提示。
import time
import sys
from tkinter import *
x = 1
fenster = Tk()
fenster.title("test")
fenster.geometry("600x300")
def start():
start1()
time.sleep(5)
startini()
def start1():
x = 0
def startini():
if x < 1:
while x < 1:
print(x)
timer.sleep(5)
elif x > 0:
print("stop")
btstart = Button(fenster, text="Start", command=start)
btstart.pack()
def stop():
stop1()
time.sleep(5)
startini()
def stop1():
x = 1
btstop = Button(fenster, text="Stop", command=stop)
btstop.pack()
mainloop()
答案
您可以使用after
获得所需的功能。你的问题是while循环阻止你的程序继续:
import time
import sys
from tkinter import *
x = 1
fenster = Tk()
fenster.title("test")
fenster.geometry("600x300")
def start():
global x
x= 0
myloop()
def myloop():
if x < 1:
print(x)
fenster.after(2000,myloop)
elif x > 0:
print("stop")
def stop():
global x
x=1
btstart = Button(fenster, text="Start", command=start)
btstart.pack()
btstop = Button(fenster, text="Stop", command=stop)
btstop.pack()
mainloop()
另一答案
Reference to x
请看看python namespaces是如何工作的。
在你的函数中,你明确打算引用你在函数之外创建的x
。在这种情况下,你需要声明它global.
例如:
def start1():
global x
x = 0
和:
def startini():
global x
if x < 1:
while x < 1:
print(x)
time.sleep(5)
elif x > 0:
print("stop")
等等你使用x
的所有功能。现在循环将起作用,但是你会发现在按下开始按钮后,你不能通过按下按钮停止它,因为GUI将被冻结。循环将永远持续下去。
How to not freeze the GUI
为了能够阻止循环,你需要threading
。请参阅this question以了解原因(该问题用于python2.7,但原因是相同的)。
在你的情况下,应该足以在脚本的开头添加import threading
,并以这种方式编辑start()
函数:
def start():
start1()
time.sleep(5)
thr = threading.Thread(target=startini)
thr.start()
以上是关于我尝试使用开始按钮启动while循环并使用停止按钮停止但我无法找到一种有效的方法的主要内容,如果未能解决你的问题,请参考以下文章