我尝试使用开始按钮启动一个while循环,然后用停止按钮停止它,但我找不到工作的方法。
我在Python 3.7中使用tkinker
我试过了,但它不起作用
有人为我提供了一些修复程序或有用的提示。
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()
对 x 的引用
请看一下python命名空间是如何工作的。
在您的函数中,您显然打算引用您在函数之外创建的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 将被冻结。循环将永远持续下去。
如何不冻结图形用户界面
为了能够停止循环,您需要 threading
.请参阅此问题以了解原因(该问题适用于python2.7,但原因相同(.
在您的情况下,应该足以在脚本开头添加import threading
,并以这种方式编辑start()
函数:
def start():
start1()
time.sleep(5)
thr = threading.Thread(target=startini)
thr.start()