import
threading
import
time
import
tkinter as tk
from
dataclasses
import
dataclass, field
btn_state
=
{
True
:
"normal"
,
False
:
"disabled"
}
@dataclass
class
Task:
sleep_duration:
float
=
field(default
=
0.5
)
_run_loop:
bool
=
field(default
=
False
, init
=
False
)
def
start(
self
)
-
>
None
:
self
._run_loop
=
True
for
number
in
range
(
1
,
31
):
if
not
self
._run_loop:
return
print
(
f
"Loop index = {number}"
)
time.sleep(
self
.sleep_duration)
self
._run_loop
=
False
def
stop(
self
)
-
>
None
:
self
._run_loop
=
False
def
threading_start(
self
)
-
>
None
:
thread
=
threading.Thread(target
=
self
.start)
thread.start()
@property
def
running(
self
)
-
>
bool
:
return
self
._run_loop
class
TaskFrame(tk.Frame):
def
__init__(
self
,
*
args,
*
*
kwargs):
super
().__init__(
*
args,
*
kwargs)
self
.task
=
Task()
self
._create_contrls()
self
._create_layout()
self
._create_binds()
self
._update_btn_states()
def
_create_contrls(
self
)
-
>
None
:
self
.btn_start
=
tk.Button(master
=
self
, text
=
"START"
, padx
=
53
, pady
=
20
)
self
.btn_stop
=
tk.Button(master
=
self
, text
=
"STOP"
, padx
=
44
, pady
=
20
)
def
_create_layout(
self
)
-
>
None
:
self
.btn_start.grid(columnspan
=
1
, row
=
1
, column
=
0
, padx
=
2
, pady
=
2
)
self
.btn_stop.grid(row
=
2
, column
=
0
, padx
=
2
, pady
=
2
)
def
_create_binds(
self
)
-
>
None
:
self
.btn_start.bind(
"<Button-1>"
,
self
._on_btn_start)
self
.btn_stop.bind(
"<Button-1>"
,
self
._on_btn_stop)
def
_on_btn_start(
self
, event: tk.Event)
-
>
None
:
if
self
.task.running:
return
self
.task.threading_start()
def
_on_btn_stop(
self
, event: tk.Event)
-
>
None
:
if
not
self
.task.running:
return
self
.task.stop()
def
_update_btn_states(
self
)
-
>
None
:
self
.btn_start.configure(state
=
btn_state[
not
self
.task.running])
self
.btn_stop.configure(state
=
btn_state[
self
.task.running])
self
.after(
500
,
self
._update_btn_states)
def
main():
app
=
tk.Tk()
app.title(
"Loop Terminate"
)
main_frame
=
TaskFrame(app)
main_frame.pack()
app.mainloop()
if
__name__
=
=
"__main__"
:
main()