首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tkinter中的按钮开始/停止循环

使用tkinter中的按钮开始/停止循环
EN

Stack Overflow用户
提问于 2020-11-29 05:44:00
回答 1查看 49关注 0票数 2

通过使用两个不同的按钮,我试图启动和停止一个基于while循环的进程,该循环扫描整个模式(在本例中实际上只是计数)。在下面的代码中,我试图简化和概括我正在处理的实际项目中发生的更复杂的过程。正如您通过运行代码所看到的,您可以通过按play按钮来开始计数;但是,当您按下stop按钮时,该过程并不会立即停止。我以前曾设法让它按预期工作,但在用面向对象的方法重写代码时,什么都不能正常工作了。目前,我不能理解问题是出在while循环构造中,还是在以错误的方式处理线程。任何建议都是非常欢迎和感谢的!

代码语言:javascript
复制
from tkinter import *
import threading
import time

class gui:

    def __init__(self, window):

        #play button
        self.play_frame = Frame (master = window, relief = FLAT, borderwidth = 1)
        self.play_frame.grid (row = 0, column = 0, padx = 1, pady = 1)
        self.play_button = Button (self.play_frame, text = "play", fg = "blue", command = lambda: self.play(1))
        self.play_button.pack()
        #stop button
        self.stop_frame = Frame (master = window, relief = FLAT, borderwidth = 1)
        self.stop_frame.grid (row = 0, column = 2, padx = 1, pady = 1)
        self.stop_button = Button (self.stop_frame, text = "stop", fg = "red", command = lambda: self.play(0))
        self.stop_button.pack()

    def process(self, trig):
        self.trig = trig

        while True:
            if self.trig == 1:

                for i in range (10):
                    time.sleep(0.5)
                    print (i)


            elif self.trig == 0:
                print ("stopped...")
                break

    def play(self, switch):


        self.switch = int(switch)
        t1 = threading.Thread (target = self.process, args = [self.switch], daemon = True)
        t1.start()
        

root = Tk()

app = gui(root)
root.mainloop()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-29 06:42:07

只需创建一个单独的线程,该线程接收何时开始和停止倒计时的信号

代码语言:javascript
复制
from tkinter import *
import threading
import time


should_run = False
class a:
    def __init__(self):
        while True:
            if should_run:
                for i in range(10):
                    if not should_run:
                        print('Stopped...')
                        break
                    if should_run:
                        time.sleep(0.5)
                        print(i)

t1 = threading.Thread(target=a,daemon=True)
t1.start()

class gui:

    def __init__(self, window):

        # play button
        self.play_frame = Frame(master=window, relief=FLAT, borderwidth=1)
        self.play_frame.grid(row=0, column=0, padx=1, pady=1)
        self.play_button = Button(self.play_frame, text="play", fg="blue", command=lambda: self.play(True))
        self.play_button.pack()
        # stop button
        self.stop_frame = Frame(master=window, relief=FLAT, borderwidth=1)
        self.stop_frame.grid(row=0, column=2, padx=1, pady=1)
        self.stop_button = Button(self.stop_frame, text="stop", fg="red", command=lambda: self.play(False))
        self.stop_button.pack()


    def play(self, switch):
        global should_run
        should_run = switch



root = Tk()

app = gui(root)
root.mainloop()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65054759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档