33import os .path
44import re
55import shlex
6+ import sys
67import tkinter as tk
78import tkinter .filedialog
89import tkinter .ttk as ttk
910import winreg
11+ import argparse
1012from WinJobster import Process
1113import jsons
1214
@@ -20,6 +22,7 @@ def __init__(self, filename: str = 'apps_to_manage.txt'):
2022
2123 def load (self ):
2224 try :
25+ mkdir (self .filename )
2326 with open (self .filename , 'r' , encoding = 'utf-8-sig' ) as file :
2427 self ._paths = {path .strip () for path in file .readlines () if path }
2528 except OSError :
@@ -46,6 +49,13 @@ def paths(self, value: set[str]):
4649class Config :
4750 run_all_at_startup : bool = False
4851 kill_all_on_close : bool = False
52+ rules_path : str = 'apps_to_manage.txt'
53+
54+
55+ def mkdir (path ):
56+ dirname = os .path .dirname (path )
57+ if dirname and not (os .path .exists (dirname ) and os .path .isdir (dirname )):
58+ os .mkdir (dirname )
4959
5060
5161class ConfigStorage :
@@ -55,6 +65,7 @@ def __init__(self, filename: str = 'config.json'):
5565
5666 def load (self ):
5767 try :
68+ mkdir (self .filename )
5869 with open (self .filename , 'r' , encoding = 'utf-8-sig' ) as file :
5970 self .config = jsons .loads (file .read (), Config )
6071 except OSError :
@@ -125,10 +136,10 @@ def toggle(self):
125136
126137
127138class Model :
128- def __init__ (self ):
129- self ._paths_storage = PathsStorage ()
130- self ._config_storage = ConfigStorage ()
139+ def __init__ (self , args ):
140+ self ._config_storage = ConfigStorage (args .config )
131141 self ._config_storage .load ()
142+ self ._paths_storage = PathsStorage (self .settings .rules_path )
132143 self .paths : list = list (self ._paths_storage .paths )
133144 self ._processes = {path : ProcessModel (path ) for path in self .paths }
134145
@@ -338,12 +349,12 @@ def set_kill_on_close(self, value: bool):
338349
339350
340351class App (tk .Tk ):
341- def __init__ (self ):
352+ def __init__ (self , args ):
342353 super ().__init__ ()
343354 self .title ('Apps bulk start/stop' )
344355 self .geometry ('640x480' )
345356 self .apply_theme ()
346- model = Model ()
357+ model = Model (args )
347358 view = View (self )
348359 view .pack (fill = tk .X , padx = 8 , pady = 8 )
349360 controller = Controller (model , view )
@@ -358,8 +369,15 @@ def apply_theme(self):
358369 style .theme_use ('forest-dark' )
359370
360371
372+ def get_args ():
373+ parser = argparse .ArgumentParser (add_help = False )
374+ parser .add_argument ('--config' , '-c' , default = 'config.json' )
375+ return parser .parse_args (sys .argv [1 :])
376+
377+
361378def main ():
362- App ().mainloop ()
379+ args = get_args ()
380+ App (args ).mainloop ()
363381
364382
365383if __name__ == '__main__' :
0 commit comments