我尝试使用开始按钮启动一个 while 循环并使用停止按钮停止它,但我找不到工作的方法



我尝试使用开始按钮启动一个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()

最新更新