我尝试使用开始按钮启动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循环并使用停止按钮停止但我无法找到一种有效的方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tkinter 在 while 循环中录制语音

打破一个while循环并重新启动代码

PHP while循环在按钮之间创建空间

在 C++ 中的线程内启动和停止循环

使用 Javascript/Jquery 停止 html 声音

检查 NoneType 的变量并中断 while 循环