[Tutor] how can a value be retrieved from an event loop?

Phil phillor9 at gmail.com
Thu Nov 16 03:38:32 EST 2023


Thank for reading this.

This knob class does what it's supposed to do but I cannot see how to 
retrieve the angle or set the angle from an instance of the class. The 
angle can be retrieved and printed from within the event loop but not 
outside the loop.

I've found a similar class that does return a value to an instance of 
the class but it's vastly more complicated than what I've presented here 
and even though it's similar I cannot fathom how it works.

Is there a simple fix or is there a major flaw in the design?

import tkinter as tk
import math


class KNOB(tk.Canvas):
     def __init__(
         self,
         parent,
         size=100
     ):
         super().__init__(parent, width=size, height=size)

         self.size = size
         self.color1 = "#007DC8"
         self.color2 = "#98D2D2"
         self.angle = 0

         self.border = self.create_oval(
             0.1 * size,
             0.1 * size,
             0.9 * size,
             0.9 * size,
             outline=self.color1,
             width=3,
             fill=self.color2,
         )

         self.dot = self.create_oval(
             0.45 * size,
             0.20 * size,
             0.55 * size,
             0.30 * size,
             outline=self.color1,
             width=3,
         )

         self.bind("<Button-3>", self.turn_clockwise)
         self.bind("<Button-1>", self.turn_counterwise)

     def turn_clockwise(self, event):
         self.delete(self.dot)
         self.angle = self.angle + 0.1
         centerX = 0.5 * self.size + (0.25 * self.size * 
math.sin(self.angle))
         centerY = 0.5 * self.size - (0.25 * self.size * 
math.cos(self.angle))
         self.dot = self.create_oval(
             (centerX - 0.05 * self.size),
             (centerY - 0.05 * self.size),
             (centerX + 0.05 * self.size),
             (centerY + 0.05 * self.size),
             outline=self.color1,
             width=3,
         )
         #print(self.angle)
         #return self.angle

     def turn_counterwise(self, event):
         self.delete(self.dot)
         self.angle = self.angle - 0.1
         centerX = 0.5 * self.size + (0.25 * self.size * 
math.sin(self.angle))
         centerY = 0.5 * self.size - (0.25 * self.size * 
math.cos(self.angle))
         self.dot = self.create_oval(
             (centerX - 0.05 * self.size),
             (centerY - 0.05 * self.size),
             (centerX + 0.05 * self.size),
             (centerY + 0.05 * self.size),
             outline=self.color1,
             width=3,
         )
         #print(self.get_angle())

     def get_angle(self):
         print("get_angle called")
         return self.angle

     def set_angle(self, angle):
         self.angle = angle

if __name__ == "__main__":
     root = tk.Tk()
     root.title("Knob test")

     knob = KNOB(root)
     knob.pack(padx=20, pady=20)

     print(knob.get_angle()) # this returns 0  once but the angle value 
is not updated here

     knob.set_angle(15) # this sets the angle but only once the mouse 
button is pressed

     root.mainloop()

-- 

Regards,
Phil



More information about the Tutor mailing list