我尝试使用开始按钮启动while循环,然后使用停止按钮停止它,但是我找不到可行的方法

时间:2019-03-30 21:22:34

标签: python python-3.x

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

2 个答案:

答案 0 :(得分:1)

您可能可以通过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()

答案 1 :(得分:0)

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将被冻结。循环将永远持续下去。

如何不冻结GUI

要停止循环,您需要threading。请参阅this question以了解原因(该问题用于python2.7,但原因相同)。
在您的情况下,应该足以在脚本的开头添加import threading并以这种方式编辑start()函数:

def start():
    start1()
    time.sleep(5)
    thr = threading.Thread(target=startini)
    thr.start()