@@ -30,10 +30,46 @@ def __init__(self, master, motors_name, motors_position_limit, motors_position):
3030 self .reset_motors_position ()
3131
3232 def create_widgets (self ):
33+ container = tk .Frame (self .master )
34+ container .pack (fill = tk .BOTH , expand = True )
35+
36+ canvas = tk .Canvas (container , borderwidth = 0 , highlightthickness = 0 )
37+ scrollbar = ttk .Scrollbar (container , orient = tk .VERTICAL , command = canvas .yview )
38+ canvas .configure (yscrollcommand = scrollbar .set )
39+
40+ scrollbar .pack (side = tk .RIGHT , fill = tk .Y )
41+ canvas .pack (side = tk .LEFT , fill = tk .BOTH , expand = True )
42+
43+ scrollable_frame = tk .Frame (canvas )
44+ window_id = canvas .create_window ((0 , 0 ), window = scrollable_frame , anchor = "nw" )
45+
46+ def on_frame_configure (event ):
47+ canvas .configure (scrollregion = canvas .bbox ("all" ))
48+
49+ def on_canvas_configure (event ):
50+ canvas .itemconfig (window_id , width = event .width )
51+
52+ scrollable_frame .bind ("<Configure>" , on_frame_configure )
53+ canvas .bind ("<Configure>" , on_canvas_configure )
54+
55+ def on_mousewheel (event ):
56+ if event .delta :
57+ canvas .yview_scroll (int (- 1 * (event .delta / 120 )), "units" )
58+
59+ def on_linux_scroll (event ):
60+ if event .num == 4 :
61+ canvas .yview_scroll (- 1 , "units" )
62+ elif event .num == 5 :
63+ canvas .yview_scroll (1 , "units" )
64+
65+ canvas .bind_all ("<MouseWheel>" , on_mousewheel )
66+ canvas .bind_all ("<Button-4>" , on_linux_scroll )
67+ canvas .bind_all ("<Button-5>" , on_linux_scroll )
68+
3369 for i_m , name in enumerate (self .motors_name ):
3470 self .update_joint_position (i_m , self .motors_default_position [i_m ])
3571 min_limit , max_limit = map (float , self .motors_position_limit [i_m ])
36- frame = tk .Frame (self . master )
72+ frame = tk .Frame (scrollable_frame )
3773 frame .pack (pady = 5 , padx = 10 , fill = tk .X )
3874
3975 tk .Label (frame , text = f"{ name } " , font = ("Arial" , 12 ), width = 20 ).pack (side = tk .LEFT )
@@ -62,7 +98,7 @@ def callback(event):
6298
6399 slider .bind ("<Motion>" , update_label ())
64100
65- tk .Button (self . master , text = "Reset" , font = ("Arial" , 12 ), command = self .reset_motors_position ).pack (pady = 20 )
101+ tk .Button (scrollable_frame , text = "Reset" , font = ("Arial" , 12 ), command = self .reset_motors_position ).pack (pady = 20 )
66102
67103 def update_joint_position (self , idx , val ):
68104 self .motors_position [idx ] = float (val )
0 commit comments