B
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:у меня есть часть кода, которая должна выполнятся один раз при каждом включении потока
а здесь код, который выполняется
а здесь код, который выполняется
а здесь код, который выполняется
выход
orimport 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>>}
у меня есть часть кода, которая должна выполнятся один раз при каждом включении потока
а здесь код, который выполняется
а здесь код, который выполняется
выход
orimport 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
Method super().run()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