16
16
from TkZero .Menu import Menu , MenuCascade , MenuCommand , MenuSeparator , \
17
17
MenuCheckbutton , MenuRadiobutton
18
18
from TkZero .Progressbar import Progressbar , ProgressModes
19
- from TkZero .Vector import Position
20
19
from TkZero .Scale import Scale
20
+ from TkZero .Vector import Position
21
21
22
22
from create_logger import create_logger
23
23
from picam import RemotePiCam
@@ -38,6 +38,16 @@ def __init__(self):
38
38
super ().__init__ ()
39
39
self .title = "Remote PiCam"
40
40
self .resizable (False , False )
41
+ theme_path = Path .cwd () / "sun-valley.tcl"
42
+ self .has_theme = theme_path .exists ()
43
+ if self .has_theme :
44
+ logger .info (f"Importing theme file { theme_path } " )
45
+ self .tk .call ("source" , str (theme_path .expanduser ().resolve ()))
46
+ self .tk .call ("set_theme" , "light" )
47
+ else :
48
+ logger .warning (f"{ theme_path } does not exist, unable to set "
49
+ f"theme!" )
50
+
41
51
self .create_gui ()
42
52
self .create_menu ()
43
53
self .on_close = self .close_window
@@ -77,9 +87,25 @@ def create_menu(self) -> None:
77
87
self .effect_var .trace_add ("write" , self .update_effect_status )
78
88
self .iso_var = tk .IntVar (self , value = 0 )
79
89
self .iso_var .trace_add ("write" , self .update_iso_status )
90
+ self .dark_mode_var = tk .BooleanVar (self , value = False )
91
+ self .dark_mode_var .trace_add ("write" , self .toggle_theme )
80
92
self .menu_bar = Menu (self , is_menubar = True , command = self .remake_menu )
81
93
self .remake_menu ()
82
94
95
+ def toggle_theme (self , * args ) -> None :
96
+ """
97
+ Toggle the theme between light and dark mode.
98
+
99
+ :return: None.
100
+ """
101
+ if self .has_theme :
102
+ if not self .dark_mode_var .get ():
103
+ logger .debug ("Switching to light mode" )
104
+ self .tk .call ("set_theme" , "light" )
105
+ else :
106
+ logger .debug ("Switching to dark mode" )
107
+ self .tk .call ("set_theme" , "dark" )
108
+
83
109
def remake_menu (self ) -> None :
84
110
"""
85
111
Remake the menus.
@@ -158,10 +184,23 @@ def remake_menu(self) -> None:
158
184
MenuCascade (label = "Control" , items = [
159
185
MenuCommand (label = "Open pan-tilt control panel" ,
160
186
underline = 14 ,
161
- enabled = self .cam .is_connected )
187
+ enabled = self .cam .is_connected ,
188
+ command = self .open_pan_tilt_control_panel )
189
+ ]),
190
+ MenuCascade (label = "View" , items = [
191
+ MenuCheckbutton (label = "Dark mode" ,
192
+ variable = self .dark_mode_var ,
193
+ enabled = self .has_theme )
162
194
])
163
195
]
164
196
197
+ def open_pan_tilt_control_panel (self ) -> None :
198
+ """
199
+ Open the pan-tilt control panel.
200
+
201
+ :return: None.
202
+ """
203
+
165
204
def set_saturation (self ) -> None :
166
205
"""
167
206
Set the saturation of the stream.
@@ -387,7 +426,7 @@ def set_resolution(self) -> None:
387
426
new_res_frame = Frame (self .res_window )
388
427
new_res_frame .grid (row = 0 , column = 0 , columnspan = 2 )
389
428
new_res_lbl = Label (new_res_frame , text = "New resolution: " )
390
- new_res_lbl .grid (row = 0 , column = 0 , padx = 1 , pady = 1 , sticky = tk .NW )
429
+ new_res_lbl .grid (row = 0 , column = 0 , padx = 1 , pady = 1 , sticky = tk .W )
391
430
resolutions = self .cam .settings ["resolution" ]["available" ]
392
431
self .new_res_combobox = Combobox (new_res_frame , values = resolutions ,
393
432
width = 30 )
0 commit comments