[Tutor] how can a value be retrieved from an event loop?
Alan Gauld
alan.gauld at yahoo.co.uk
Thu Nov 16 10:12:59 EST 2023
On 16/11/2023 13:45, Alan Gauld via Tutor wrote:
> OK, I took your code and tweaked it to do what I think you want.
> Note that you now set the initial angle by passing it to the
> constructor call.
I was sufficiently intrigued by this that I took another pass
and added a label to demonstrate how it could be used and
did the display conversion to degrees too. I hope that it's
helpful. I also tidied up the code some more.
import tkinter as tk
import math
class KNOB(tk.Canvas):
def __init__(
self,
parent,
size=100,
angle=0,
string_var = None
):
super().__init__(parent, width=size, height=size)
self.size = size
self.color1 = "#007DC8"
self.color2 = "#98D2D2"
self.angle = angle % (2 * math.pi) # keep within 0-2pi
self.str_var = string_var
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 = None # make a "dot" for first draw_dot to remove!
self.draw_dot()
self.bind("<Button-3>", self.turn_clockwise)
self.bind("<Button-1>", self.turn_counterwise)
def draw_dot(self):
self.delete(self.dot)
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,
)
if self.str_var:
self.str_var.set("%5.2f deg." % math.degrees(self.angle))
def turn_clockwise(self, event):
self.set_angle(self.angle + 0.1)
self.draw_dot()
def turn_counterwise(self, event):
self.set_angle(self.angle - 0.1)
self.draw_dot()
def set_angle(self,angle):
self.angle = angle % (2*math.pi) # keep within 0-2pi range
if __name__ == "__main__":
root = tk.Tk()
root.title("Knob test")
knob_angle = tk.StringVar()
knob_angle.set("0")
knob = KNOB(root, angle=15, string_var = knob_angle)
knob.pack(padx=20, pady=20)
lbl = tk.Label(root, textvariable=knob_angle)
lbl.pack()
root.mainloop()
--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos
More information about the Tutor
mailing list