在使用线程和tkinter模块的python中,停止线程并避免'RuntimeError'的最佳方法是什么?

问题描述 投票:3回答:1

我已经在网络上经历了多种解决方案,但是它们需要大量代码,一旦您扩大规模,这些代码可能会造成混淆。是否有一种简单的方法可以停止线程并避免使用RuntimeError: threads can only be started once,以便无限次调用该线程。这是我的代码的简单版本:

import tkinter
import time
import threading

def func():

    entry.config(state='disabled')
    label.configure(text="Standby for  seconds")
    time.sleep(3)
    sum = 0
    for i in range(int(entry.get())):
        time.sleep(0.5)
        sum = sum+i
        label.configure(text=str(sum))
    entry.config(state='normal')

mainwindow = tkinter.Tk()
mainwindow.title('Sum up to any number')

entry = tkinter.Entry(mainwindow)
entry.pack()
label = tkinter.Label(mainwindow, text = "Enter an integer",font=("Arial",33))
label.pack()

print(entry.get())

button = tkinter.Button(mainwindow, text="Press me", command=threading.Thread(target=func).start)
button.pack()
python multithreading tkinter python-multithreading software-design
1个回答
0
投票
import threading, time, tkinter, sys

class ImmortalThread(threading.Thread):
  def __init__(self, func):
    super().__init__(daemon=True)
    self.func = func
    self.do = tkinter.BooleanVar()
  def run(self):
    while True:
      if self.do.get():
        try:
          self.func()
          self.do.set(False)
        except:
          print("Exception on", self, ":", sys.exc_info())
          raise SystemExit()
      else:
        continue

def func():
  entry.config(state='disabled')
  label.configure(text="Standby for  seconds")
  time.sleep(3)
  sum = 0
  for i in range(int(entry.get())):
    time.sleep(0.5)
    sum = sum+i
    label.configure(text=str(sum))
  entry.config(state='normal')

mainwindow = tkinter.Tk()
mainwindow.title("Sum up to any number")

entry = tkinter.Entry(mainwindow)
entry.pack()
label = tkinter.Label(mainwindow, text="Enter an integer", font=("Arial", 33))
label.pack()

thread = ImmortalThread(func)
thread.start()
button = tkinter.Button(mainwindow, text="Press me", command=lambda: thread.do.set(True))
button.pack()

mainwindow.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.