【问题标题】:stoping infinite loop function using another button使用另一个按钮停止无限循环功能
【发布时间】:2023-01-30 23:04:44
【问题描述】:

我正在编写一个函数,在我决定停止它之前,它应该返回另外两个函数。也许我什至希望该功能运行 5 小时。我写了我的代码,除了一个问题,它运行完美:当我点击开始按钮时,按钮保持按下状态,我无法关闭无限循环。我想要一种方法来停止我的程序而无需进行按键中断或其他操作。我认为可以停止我的启动过程的按钮就可以了。

这是我的按钮:

self.dugme1 = Button(text="Start ", command=self.start, fg="black", bg="green", font="bold")
self.dugme1.place(relx=0.05, rely=0.65)

这是我的功能:

def greeting(self):
    print("hello")


def byee (self):
    print("bye")


def start(self):
    
    while True:
        self.greeting()
        self.byee()

当我单击按钮时,这些将在终端中无限运行,直到我使用键盘中断停止它们。有什么办法可以使用停止按钮等优雅的方式来停止它吗?

【问题讨论】:

    标签: python loops tkinter


    【解决方案1】:

    您可以在启动函数上使用线程。我相信您会在此处通过 Internet 找到有关此的更多信息。

    示例如下:

    import threading
    
    self.dugme1 = Button(text="Start ",
                         command=lambda e: threading.Thread(name='start', target=self.start, daemon=True).start(),
                         fg="black",
                         bg="green",
                         font="bold"
                         )
    

    那么您可以将启动功能设置为:

    def start(self):
        if self.start_running == False:
            self.start_running = True
            while self.start_running:
                self.greeting()
                self.byee()
    

    其中 self.start_running 是一个在程序开始时初始设置为 false 的变量(或者您可以在 start 函数中使用 try-except 块首先声明它)

    第一个 if 避免多次调用同一个按钮,多次调用该函数。

    您可以将变量self.start_running 设置为“false”以停止执行start 函数。

    我们希望线程为daemon,以便只要 main 终止,函数就会终止。 如果您不希望这些函数突然退出,请将 daemon=False 设置为 False,但请确保在程序退出之前发出 self.start_running=False 信号。

    【讨论】:

    • 请注意,按钮 command 选项的函数不需要参数,因此 command=lambda e: ... 将引发异常。它应该是command=lambda: ...
    【解决方案2】:

    您可以通过线程实现这一点。以下代码演示了无限运行进程的启动/停止按钮:

    import tkinter as tk
    import threading
    
    class App(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            self.stop_event = threading.Event()
            self.process = threading.Thread(target = self.start, args = (self.stop_event,))
            self.btn = tk.Button(self, text = "Start", command = self.start_cmd)
            self.btn.pack()
        def start_cmd(self):
            self.btn.config(text = "Stop", command = self.stop_cmd)
            self.process.start()
        def stop_cmd(self):
            self.stop_event.set()
            self.destroy()
        def start(self, stop_event):
            while not stop_event.is_set():
                self.greeting()
                self.byee()
        def greeting(self):
            print("hello")
        def byee(self):
            print("bye")
    
    app = App()
    app.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-01
      • 2015-03-18
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      相关资源
      最近更新 更多