import threading, tkinter, time class Window(tkinter.Tk): def __init__(self): tkinter.Tk.__init__(self) self.geometry('20x200') self.is_run = False tkinter.Button(text="start", command=lambda: self.is_run or threading.Thread(target=self.run).start()).pack() tkinter.Button(text="stop", command=self.stop).pack() def stop(self): self.is_run = False def run(self): self.is_run = True print('Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°') while self.is_run: print('Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ') time.sleep(1) print('Π²ΡΡ
ΠΎΠ΄') if __name__ == '__main__': Window().mainloop()
out:
Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΡΡ
ΠΎΠ΄
or
import threading, tkinter, time, queue class SThread(threading.Thread): '''worker ΠΏΠΎΡΠΎΠΊ''' def __init__(self): threading.Thread.__init__(self) self.queue = queue.Queue() self.setDaemon(True) self.start() def run(self): print('thread.run') while True: cmd = self.queue.get(timeout=10) print(cmd) if cmd is None: break cmd['out'] = cmd['target'](*cmd.get('args', ()), **cmd.get('kwargs', {})) self.queue.task_done() class Window(tkinter.Tk): def __init__(self): tkinter.Tk.__init__(self) self.geometry('20x200') self.is_run = False self.thread = SThread() tkinter.Button(text="start", command=lambda: self.is_run or self.thread.queue.put( dict(target=self.run))).pack() tkinter.Button(text="stop", command=self.stop).pack() def stop(self): self.is_run = False def run(self): print('Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°') self.is_run = True while self.is_run: print('Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ') time.sleep(1) print('Π²ΡΡ
ΠΎΠ΄') if __name__ == '__main__': Window().mainloop()
out:
thread.run {'target': <bound method Window.run of <__main__.Window object at 0x01F19710>>} Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΡΡ
ΠΎΠ΄
or
import threading, tkinter, time class Window(tkinter.Tk, threading.Thread): def __init__(self): tkinter.Tk.__init__(self) threading.Thread.__init__(self) self.wait = 1 self.setDaemon(True) self.start() self.geometry('20x200') tkinter.Button(text="start", command=self.Start).pack() tkinter.Button(text="stop", command=self.Stop).pack() def destroy(): self.wait = -1 time.sleep(1) self.destroy() self.protocol("WM_DELETE_WINDOW", destroy) def Stop(self): self.wait = 1 def Start(self): self.wait = 0 def run(self): print('thread.start') while self.wait >= 0: if self.wait: time.sleep(self.wait) else: self._target = self.work self._args = () self._kwargs = {} super().run() print('thread.stop') def work(self): print('Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°') while not self.wait: print('Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ') time.sleep(1) print('Π²ΡΡ
ΠΎΠ΄') if __name__ == '__main__': Window().mainloop()
out:
thread.start Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΡΡ
ΠΎΠ΄ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π° Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΡΡ
ΠΎΠ΄ thread.stop
Super (). Run () method
def run(self): """Method representing the thread's activity. You may override this method in a subclass. The standard run() method invokes the callable object passed to the object's constructor as the target argument, if any, with sequential and keyword arguments taken from the args and kwargs arguments, respectively. """ try: if self._target: self._target(*self._args, **self._kwargs) finally: # Avoid a refcycle if the thread is running a function with # an argument that has a member that points to the thread. del self._target, self._args, self._kwargs