[Tutor] Tkinter draw line segments
Peter Otten
__peter__ at web.de
Wed Mar 30 12:21:31 EDT 2022
On 30/03/2022 17:27, Peter Otten wrote:
> I'd go about it a bit differently. When you draw all segments separately
> you can remember them by their ids. To display the desired digits you
> can hide/display segments as needed. A complete example:
Shortly after hitting send I had a Eureka moment: use tags!
So here's the altered script:
import tkinter as tk
segments = [
(20, 20, 40, 20),
(44, 24, 44, 44),
(44, 48, 44, 68),
(20, 72, 40, 72),
(16, 48, 16, 68),
(16, 24, 16, 44),
(20, 46, 40, 46),
]
tags_list = [
'0235789',
'01234789',
'013456789',
'023568',
'0268',
'045689',
'2345689'
]
tags_list = [tuple(f"digit{d}" for d in s) for s in tags_list]
class Demo:
def __init__(self):
self.root = tk.Tk()
self.label = tk.Label(
self.root,
text="Hit digit key to display corresponding number"
)
self.label.pack()
self.canvas = tk.Canvas(self.root, width=100, height=100)
self.canvas.pack()
self.segment_ids = []
self.draw_segments()
for c in "0123456789":
self.root.bind(
c,
lambda event, tag=c: self.set_segments(tag)
)
def draw_segments(self):
for segment, tags in zip(segments, tags_list):
self.canvas.create_line(
segment, width=4, fill="green", tags=tags + ("all",)
)
def set_segments(self, tag):
self.canvas.itemconfigure("all", state=tk.HIDDEN)
self.canvas.itemconfigure(f"digit{tag}", state=tk.NORMAL)
def mainloop(self):
self.root.mainloop()
if __name__ == "__main__":
demo = Demo()
demo.mainloop()
More information about the Tutor
mailing list