[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