def __init__(self, root, frame): self.root = root self.frame = Frame(frame) # Create the toolbar as a frame self.frame.columnconfigure(0, weight=1) self.frame.columnconfigure(1, weight=1) self.frame.rowconfigure(0, weight=1) self.frame.rowconfigure(1, weight=1) self.frame.grid_rowconfigure(1, minsize=70) self.img1 = Image.open("icons/open-folder.png").convert('RGBA') self.useImg1 = ImageTk.PhotoImage(self.img1) self.path = os.path.dirname(__file__) #self.style = ttk.Style() #self.style.configure('Treeview', rowheight=40) self.tree = CheckboxTreeview(self.frame) #self.tree.pack(expand=YES, fill=BOTH) self.tree.heading("#0", text="Ficheiros") self.dir = self.tree.insert('', 'end', text=self.path, open=True) self.Subs(self.path, self.dir) self.tree.grid(row=0, column=0, columnspan=2, padx=4, pady=4, sticky=ALL) Button(self.frame, image=self.useImg1, width=70, height=70, command=self.browse_button).grid(row=2, column=1, padx=4, pady=4, sticky=E) self.frame.pack(side=TOP, fill=BOTH)
def __init__(self, parent): """ parent: the tkinter parent view to use for this window construction. """ self.parent = parent self.app = tk.Toplevel(parent) self.app.title("Scripts Manager") self.app.resizable(True, True) self.rvalue = None appFrame = ttk.Frame(self.app) #PANED PART self.paned = tk.PanedWindow(appFrame, height=300) #RIGHT PANE : TAble self.viewframe = ttk.Frame(self.paned) self.file_tree = CheckboxTreeview(self.viewframe) self.file_tree['columns'] = ('name', 'category') self.file_tree.heading('#0', text='Name') self.file_tree.column("#0", stretch=tk.YES, minwidth=300, width=300) self.file_tree.heading('#1', text='Category') self.file_tree.column("#1", stretch=tk.YES, minwidth=300, width=300) self.file_tree.pack(fill=tk.BOTH, expand=True) btn_pane = ttk.Frame(self.viewframe) self.execute_icone = tk.PhotoImage(file = Utils.getIcon("execute.png")) btn_execute = ttk.Button(btn_pane, text="Execute", image=self.execute_icone, command=self.executedSelectedScripts, tooltip="Execute all selected scripts", style="Toolbutton") btn_execute.pack(side=tk.RIGHT, padx=3, pady=5) self.open_folder_icone = tk.PhotoImage(file = Utils.getIcon("folder.png")) btn_openPathForUser = ttk.Button(btn_pane, text="Execute", image=self.open_folder_icone, command=self.openPathForUser, tooltip="Open scripts folder", style="Toolbutton") btn_openPathForUser.pack(side=tk.RIGHT, padx=3, pady=5) btn_pane.pack(fill=tk.X, side=tk.BOTTOM, anchor=tk.E) #LEFT PANE : Treeview self.frameTw = ttk.Frame(self.paned) self.treevw = ttk.Treeview(self.frameTw) self.treevw.pack() scbVSel = ttk.Scrollbar(self.frameTw, orient=tk.VERTICAL, command=self.treevw.yview) self.treevw.configure(yscrollcommand=scbVSel.set) self.treevw.grid(row=0, column=0, sticky=tk.NSEW) scbVSel.grid(row=0, column=1, sticky=tk.NS) self.treevw.grid(row=0, column=0, sticky=tk.NSEW) scbVSel.grid(row=0, column=1, sticky=tk.NS) self.paned.add(self.frameTw) self.paned.add(self.viewframe) self.paned.pack(fill=tk.BOTH, expand=1) self.frameTw.rowconfigure(0, weight=1) # Weight 1 sur un layout grid, sans ça le composant ne changera pas de taille en cas de resize self.frameTw.columnconfigure(0, weight=1) # Weight 1 sur un layout grid, sans ça le composant ne changera pas de taille en cas de resize appFrame.pack(fill=tk.BOTH, ipady=10, ipadx=10, expand=True) self.treevw.bind("<<TreeviewSelect>>", self.onTreeviewSelect) try: self.app.wait_visibility() self.app.focus_force() self.app.lift() except tk.TclError: pass self.refreshUI()
def __init__(self, master, client, database, strategy_frame, **kwargs): """ :param master: master widget :param client: network.strategy.client.StrategyClient :param database: results.strategies.StrategyDataBase :param strategy_frame: frames.strategy.StrategyFrame :param kwargs: SnapToplevel keyword arguments """ resizable = kwargs.pop("resizable", False) self._client = client self._database = database self._frame = strategy_frame Parent.__init__(self, master, **kwargs) self.wm_title("GSF Parser: Strategy Sharing") self.wm_resizable(resizable, resizable) # Configure the Treeview self.tree = CheckboxTreeview(master=self, height=16) self.tree.column("#0", width=200) self.tree.heading("#0", text="Strategy") self.tree.config(show=("headings", "tree")) self.scroll_bar = ttk.Scrollbar(self, orient=tk.VERTICAL, command=self.tree.yview) self.tree.config(yscrollcommand=self.scroll_bar.set) self.update_strategy_tree() self.share_button = ttk.Button(self, text="Share Strategies", command=self.share_strategies) self.grid_widgets()
class LeftPanel: def __init__(self, root, frame): self.root = root self.frame = Frame(frame) # Create the toolbar as a frame self.frame.columnconfigure(0, weight=1) self.frame.columnconfigure(1, weight=1) self.frame.rowconfigure(0, weight=1) self.frame.rowconfigure(1, weight=1) self.frame.grid_rowconfigure(1, minsize=70) self.img1 = Image.open("icons/open-folder.png").convert('RGBA') self.useImg1 = ImageTk.PhotoImage(self.img1) self.path = os.path.dirname(__file__) #self.style = ttk.Style() #self.style.configure('Treeview', rowheight=40) self.tree = CheckboxTreeview(self.frame) #self.tree.pack(expand=YES, fill=BOTH) self.tree.heading("#0", text="Ficheiros") self.dir = self.tree.insert('', 'end', text=self.path, open=True) self.Subs(self.path, self.dir) self.tree.grid(row=0, column=0, columnspan=2, padx=4, pady=4, sticky=ALL) Button(self.frame, image=self.useImg1, width=70, height=70, command=self.browse_button).grid(row=2, column=1, padx=4, pady=4, sticky=E) self.frame.pack(side=TOP, fill=BOTH) def Subs(self, path, parent): for p in os.listdir(path): abspath = os.path.join(path, p) parent_element = self.tree.insert(parent, 'end', text=p, open=True) if os.path.isdir(abspath): self.Subs(abspath, parent_element) def browse_button(self): self.path = tkFileDialog.askdirectory() def set_dir(self): sourcePath = str(self.path) os.chdir(sourcePath)
def generate_tree(self): root = tk.Tk() tree = CheckboxTreeview(root) #root.withdraw() visited = {ID: False for ID in self.id_to_name} for parent in self.dict: if visited[parent] == False: visited[parent] = True tree.insert("", "end", parent, text=self.get_name_from_id(parent)) self.generate_tree_dfs(parent, visited, tree) def callback(): print(tree.get_checked()) expanded = False btn_text = tk.StringVar() def expand_collapse(expanded): if expanded == False: expanded = True tree.expand_all() btn_text.set("Collapse All") else: expanded = False tree.collapse_all() btn_text.set("Expand All") submit = tk.Button(root, text="Submit", command=callback) exp_col_b = tk.Button(root, textvariable=btn_text, command=expand_collapse(expanded)) root.geometry('500x500') #root.resizeable() exp_col_b.pack() tree.pack(fill=tk.BOTH) submit.pack() root.mainloop()
class StrategyShareToplevel(Parent): """ Toplevel to display a list of strategy with checkboxes to allow selecting which should be shared. """ def __init__(self, master, client, database, strategy_frame, **kwargs): """ :param master: master widget :param client: network.strategy.client.StrategyClient :param database: results.strategies.StrategyDataBase :param strategy_frame: frames.strategy.StrategyFrame :param kwargs: SnapToplevel keyword arguments """ resizable = kwargs.pop("resizable", False) self._client = client self._database = database self._frame = strategy_frame Parent.__init__(self, master, **kwargs) self.wm_title("GSF Parser: Strategy Sharing") self.wm_resizable(resizable, resizable) # Configure the Treeview self.tree = CheckboxTreeview(master=self, height=16) self.tree.column("#0", width=200) self.tree.heading("#0", text="Strategy") self.tree.config(show=("headings", "tree")) self.scroll_bar = ttk.Scrollbar(self, orient=tk.VERTICAL, command=self.tree.yview) self.tree.config(yscrollcommand=self.scroll_bar.set) self.update_strategy_tree() self.share_button = ttk.Button(self, text="Share Strategies", command=self.share_strategies) self.grid_widgets() def grid_widgets(self): self.tree.grid(row=1, column=1, sticky="nswe", padx=5, pady=5) self.scroll_bar.grid(row=1, column=2, sticky="ns", padx=(0, 5), pady=5) self.share_button.grid(row=2, column=1, columnspan=2, sticky="nswe", padx=5, pady=(0, 5)) def share_strategies(self): for strategy in self.strategies_to_share: self._client.send_strategy(strategy) messagebox.showinfo("Info", "Selected Strategies sent.") def update_strategy_tree(self): self.tree.delete(*self.tree.get_children("")) for strategy in sorted(self._database.keys()): self.tree.insert("", tk.END, iid=strategy, text=strategy) @property def strategies_to_share(self): for strategy in self.tree.get_checked(): yield self._database[strategy]
from ttkwidgets import CheckboxTreeview import tkinter as tk import tkinter.ttk as ttk root = tk.Tk() root.geometry('600x600') root.title("Checkbox example") f1 = tk.Frame(root, width=595, height=595, background='blue', bd=1) f1.grid(row=0, column=0) checkingFrame = tk.Frame(f1, width=590, height=590, background='yellow', bd=1) checkingFrame.grid(row=0, column=0, padx=5, pady=5) canvas_tree = tk.Canvas(checkingFrame, bg='white') canvas_tree.grid(row=0, column=0) main_tree = CheckboxTreeview(canvas_tree, show='tree') main_tree.column("#0", width=500, minwidth=600, stretch=True) main_tree.configure(height=10) main_tree.insert("", "end", "1", text="1" + '2') main_tree.insert("1", "end", "11", text="11") main_tree.insert("1", "end", "12", text="Anantha" + "kumar" + 'Kondra' + 'Anantha Kumar Kondra') main_tree.insert("11", "end", "111", text="Anantha" + "kumar" + 'Kondra' + 'Anantha Kumar Kondra') main_tree.insert("", "end",
from ttkwidgets import CheckboxTreeview import tkinter as tk import tkinter.ttk as ttk root = tk.Tk() root.geometry('500x500') root.title("Checkbox example") f1 = tk.Frame(root, width=490, height=490) f1.grid() can = tk.Canvas(f1, width=500) tree = CheckboxTreeview(can, show='tree') tree.column('#0', minwidth=350, stretch=True, width=300) tree.insert("", "end", "1", text="1" + '2') tree.insert("1", "end", "11", text="11") tree.insert("1", "end", "12", text="Anantha" + "kumar" + 'Kondra' + 'Anantha Kumar Kondra') tree.insert("11", "end", "111", text="Anantha" + "kumar" + 'Kondra' + 'Anantha Kumar Kondra') tree.insert("", "end", "2", text="Anantha" + "kumar" + 'Kondra' + 'Anantha Kumar Kondra') tree.grid() xscrol = ttk.Scrollbar(can, orient=tk.HORIZONTAL, command=tree.xview)
class ScriptManager: """ Open the scripts window manager """ folder_icon = None def __init__(self, parent): """ parent: the tkinter parent view to use for this window construction. """ self.parent = parent self.app = tk.Toplevel(parent) self.app.title("Scripts Manager") self.app.resizable(True, True) self.rvalue = None appFrame = ttk.Frame(self.app) #PANED PART self.paned = tk.PanedWindow(appFrame, height=300) #RIGHT PANE : TAble self.viewframe = ttk.Frame(self.paned) self.file_tree = CheckboxTreeview(self.viewframe) self.file_tree['columns'] = ('name', 'category') self.file_tree.heading('#0', text='Name') self.file_tree.column("#0", stretch=tk.YES, minwidth=300, width=300) self.file_tree.heading('#1', text='Category') self.file_tree.column("#1", stretch=tk.YES, minwidth=300, width=300) self.file_tree.pack(fill=tk.BOTH, expand=True) btn_pane = ttk.Frame(self.viewframe) self.execute_icone = tk.PhotoImage(file = Utils.getIcon("execute.png")) btn_execute = ttk.Button(btn_pane, text="Execute", image=self.execute_icone, command=self.executedSelectedScripts, tooltip="Execute all selected scripts", style="Toolbutton") btn_execute.pack(side=tk.RIGHT, padx=3, pady=5) self.open_folder_icone = tk.PhotoImage(file = Utils.getIcon("folder.png")) btn_openPathForUser = ttk.Button(btn_pane, text="Execute", image=self.open_folder_icone, command=self.openPathForUser, tooltip="Open scripts folder", style="Toolbutton") btn_openPathForUser.pack(side=tk.RIGHT, padx=3, pady=5) btn_pane.pack(fill=tk.X, side=tk.BOTTOM, anchor=tk.E) #LEFT PANE : Treeview self.frameTw = ttk.Frame(self.paned) self.treevw = ttk.Treeview(self.frameTw) self.treevw.pack() scbVSel = ttk.Scrollbar(self.frameTw, orient=tk.VERTICAL, command=self.treevw.yview) self.treevw.configure(yscrollcommand=scbVSel.set) self.treevw.grid(row=0, column=0, sticky=tk.NSEW) scbVSel.grid(row=0, column=1, sticky=tk.NS) self.treevw.grid(row=0, column=0, sticky=tk.NSEW) scbVSel.grid(row=0, column=1, sticky=tk.NS) self.paned.add(self.frameTw) self.paned.add(self.viewframe) self.paned.pack(fill=tk.BOTH, expand=1) self.frameTw.rowconfigure(0, weight=1) # Weight 1 sur un layout grid, sans ça le composant ne changera pas de taille en cas de resize self.frameTw.columnconfigure(0, weight=1) # Weight 1 sur un layout grid, sans ça le composant ne changera pas de taille en cas de resize appFrame.pack(fill=tk.BOTH, ipady=10, ipadx=10, expand=True) self.treevw.bind("<<TreeviewSelect>>", self.onTreeviewSelect) try: self.app.wait_visibility() self.app.focus_force() self.app.lift() except tk.TclError: pass self.refreshUI() def refreshUI(self): for widget in self.treevw.winfo_children(): widget.destroy() script_dir = self.getScriptsDir() if self.__class__.folder_icon is None: self.__class__.folder_icon = ImageTk.PhotoImage(Image.open(Utils.getIcon("folder.png"))) parent = self.treevw.insert("", "end", " ", text="Scripts", image=self.__class__.folder_icon, open=True) self.treevw.focus(parent) self.treevw.selection_set(parent) for root, subFolders, files in os.walk(script_dir): root_name = root.replace(script_dir, "") for folder in subFolders: if folder.startswith("__") or folder.endswith("__"): continue folder_iid = os.path.join(root_name, folder) parent_node = parent if root_name == "" else root_name self.treevw.insert(parent_node, "end", folder_iid, text=folder, image=self.__class__.folder_icon) self.openScriptFolderView() def getScriptsDir(self): return os.path.join(Utils.getMainDir(), "scripts/") def onTreeviewSelect(self, _event=None): selec = self.treevw.selection() if len(selec) == 0: return None item = selec[0] self.openScriptFolderView(str(item)) def openScriptFolderView(self, script_folder=""): full_script_path = os.path.join(self.getScriptsDir(), script_folder.strip()) script_shown = set() self.file_tree.delete(*self.file_tree.get_children()) for root, _, files in os.walk(full_script_path): for file in files: filepath = root + '/' + file if file.endswith(".py"): script_shown.add(filepath) scripts_list = sorted(script_shown) script_dir = self.getScriptsDir() for script in scripts_list: scriptName = os.path.basename(script) category_name = os.path.dirname(script.replace(script_dir, "")) self.file_tree.insert("", "end", script, text=scriptName, values=(category_name)) def executedSelectedScripts(self): for selected in self.file_tree.get_checked(): self.executeScript(selected) def executeScript(self, script_path): script_dir = self.getScriptsDir() category_name = os.path.dirname(script_path.replace(script_dir, "")) script_name = ".".join(os.path.splitext(os.path.basename(script_path))[:-1]) module = os.path.join("pollenisatorgui/scripts/",category_name, script_name).replace("/", '.') imported = importlib.import_module(module) success, res = imported.main(APIClient.getInstance()) if success: tk.messagebox.showinfo("Script finished", f"Script {script_name} finished.\n{res}") else: tk.messagebox.showwarning("Script failed", f"Script {script_name} failed.\n{res}") def openPathForUser(self): selection = self.treevw.selection() if selection: folder = os.path.join(self.getScriptsDir(), selection[0]) else: folder = self.getScriptsDir() Utils.openPathForUser(folder)
def __init__(self, master, main_path=''): self.main_path = main_path self.master = master self.modules_config = {} #{module_name : } self.modules = {} self.fio = '' self.org = '' #Профили аудита self.profiles = {} self.current_profile_options = {} #Левый фрейм включает данные об аудиторе и о существующих профилях leftFrame = ttk.Frame(master) self.auditor_Frame = ttk.LabelFrame(leftFrame, text='Данные аудитора') self.profiles_Frame = VerticalScrolledFrame(leftFrame, text='Профили аудита') #Правый фрейм включает редактор текущего профиля и кнопку запуска аудита rightFrame = ttk.Frame(master) self.current_Frame = ttk.LabelFrame(rightFrame, text='Текущий профиль') self.btn_Frame = ttk.Frame(rightFrame) #Область данных об аудиторе fio_Label = ttk.Label(self.auditor_Frame, text='ФИО') self.fio_Entry = ttk.Entry(self.auditor_Frame, font=16, width=30) self.fio_Label = ttk.Label(self.auditor_Frame, font=16, width=30) org_Label = ttk.Label(self.auditor_Frame, text='Организация') self.org_Entry = ttk.Entry(self.auditor_Frame, font=16, width=30) self.org_Label = ttk.Label(self.auditor_Frame, font=16, width=30) self.fio_OK_btn = ttk.Button(self.auditor_Frame, text='OK', width=5, command=self.accept_auditor) fio_Label.grid(row=1, column=0, sticky='new', padx=10) self.fio_Entry.grid(row=2, column=0, sticky='nsew', padx=10) org_Label.grid(row=3, column=0, sticky='new', padx=10) self.org_Entry.grid(row=4, column=0, sticky='nsew', padx=10) self.fio_OK_btn.grid(row=5, column=0, sticky='se', padx=10) self.profileView = CheckboxTreeview(self.current_Frame) self.save_audit_btn = ttk.Button(self.btn_Frame, text='Сохранить профиль', command=self.save_btn_click) self.run_audit_btn = ttk.Button(self.btn_Frame, text='Запустить аудит', command=self.run_audit) self.ysb = ttk.Scrollbar(self.current_Frame, orient='vertical', command=self.profileView.yview) self.profileView.configure(yscroll=self.ysb.set) ttk.Style().configure('Vertical.TScrollbar', troughcolor='#f6f4f2', relief=tk.GROOVE) ttk.Style().configure('Treeview', background="#ffffff") ttk.Style().configure('Frame', background="#f6f4f2") #Размещения на фреймах leftFrame.pack(side=tk.LEFT, anchor='nw', fill=tk.Y) rightFrame.pack(side=tk.LEFT, anchor='nw', expand=1, fill=tk.BOTH) self.auditor_Frame.pack(side=tk.TOP, anchor='nw', padx=5, pady=5, fill=tk.X) self.profiles_Frame.pack(side=tk.TOP, anchor='sw', padx=5, pady=10, fill=tk.BOTH, expand=1) self.current_Frame.pack(side=tk.TOP, anchor='nw', padx=5, pady=5, fill=tk.BOTH, expand=1) self.btn_Frame.pack(side=tk.TOP, anchor='nw', fill=tk.X) self.ysb.pack(side=tk.RIGHT, anchor='n', fill=tk.Y) self.profileView.pack(side=tk.TOP, anchor='nw', fill=tk.BOTH, expand=1) self.save_audit_btn.pack(side=tk.LEFT, anchor='sw', padx=5, pady=5) self.run_audit_btn.pack(side=tk.LEFT, anchor='se', padx=5, pady=5, fill=tk.X, expand=1) self.auditor_Frame.grid_rowconfigure(2, minsize=30) self.loadProfiles() self.profileView.bind("<Button-1>", self.check_uncheck_item, True)
class main_Tab: def __init__(self, master, main_path=''): self.main_path = main_path self.master = master self.modules_config = {} #{module_name : } self.modules = {} self.fio = '' self.org = '' #Профили аудита self.profiles = {} self.current_profile_options = {} #Левый фрейм включает данные об аудиторе и о существующих профилях leftFrame = ttk.Frame(master) self.auditor_Frame = ttk.LabelFrame(leftFrame, text='Данные аудитора') self.profiles_Frame = VerticalScrolledFrame(leftFrame, text='Профили аудита') #Правый фрейм включает редактор текущего профиля и кнопку запуска аудита rightFrame = ttk.Frame(master) self.current_Frame = ttk.LabelFrame(rightFrame, text='Текущий профиль') self.btn_Frame = ttk.Frame(rightFrame) #Область данных об аудиторе fio_Label = ttk.Label(self.auditor_Frame, text='ФИО') self.fio_Entry = ttk.Entry(self.auditor_Frame, font=16, width=30) self.fio_Label = ttk.Label(self.auditor_Frame, font=16, width=30) org_Label = ttk.Label(self.auditor_Frame, text='Организация') self.org_Entry = ttk.Entry(self.auditor_Frame, font=16, width=30) self.org_Label = ttk.Label(self.auditor_Frame, font=16, width=30) self.fio_OK_btn = ttk.Button(self.auditor_Frame, text='OK', width=5, command=self.accept_auditor) fio_Label.grid(row=1, column=0, sticky='new', padx=10) self.fio_Entry.grid(row=2, column=0, sticky='nsew', padx=10) org_Label.grid(row=3, column=0, sticky='new', padx=10) self.org_Entry.grid(row=4, column=0, sticky='nsew', padx=10) self.fio_OK_btn.grid(row=5, column=0, sticky='se', padx=10) self.profileView = CheckboxTreeview(self.current_Frame) self.save_audit_btn = ttk.Button(self.btn_Frame, text='Сохранить профиль', command=self.save_btn_click) self.run_audit_btn = ttk.Button(self.btn_Frame, text='Запустить аудит', command=self.run_audit) self.ysb = ttk.Scrollbar(self.current_Frame, orient='vertical', command=self.profileView.yview) self.profileView.configure(yscroll=self.ysb.set) ttk.Style().configure('Vertical.TScrollbar', troughcolor='#f6f4f2', relief=tk.GROOVE) ttk.Style().configure('Treeview', background="#ffffff") ttk.Style().configure('Frame', background="#f6f4f2") #Размещения на фреймах leftFrame.pack(side=tk.LEFT, anchor='nw', fill=tk.Y) rightFrame.pack(side=tk.LEFT, anchor='nw', expand=1, fill=tk.BOTH) self.auditor_Frame.pack(side=tk.TOP, anchor='nw', padx=5, pady=5, fill=tk.X) self.profiles_Frame.pack(side=tk.TOP, anchor='sw', padx=5, pady=10, fill=tk.BOTH, expand=1) self.current_Frame.pack(side=tk.TOP, anchor='nw', padx=5, pady=5, fill=tk.BOTH, expand=1) self.btn_Frame.pack(side=tk.TOP, anchor='nw', fill=tk.X) self.ysb.pack(side=tk.RIGHT, anchor='n', fill=tk.Y) self.profileView.pack(side=tk.TOP, anchor='nw', fill=tk.BOTH, expand=1) self.save_audit_btn.pack(side=tk.LEFT, anchor='sw', padx=5, pady=5) self.run_audit_btn.pack(side=tk.LEFT, anchor='se', padx=5, pady=5, fill=tk.X, expand=1) self.auditor_Frame.grid_rowconfigure(2, minsize=30) self.loadProfiles() self.profileView.bind("<Button-1>", self.check_uncheck_item, True) def run_audit(self): for tab_name, tab in self.modules.items(): tab.run_audit() def sync_vars(self): for tab_name, tab in self.modules.items(): if type(self.current_profile_options[tab_name][1]) != type({}): i = 0 for var in tab.vars: var.set(self.current_profile_options[tab_name][1][i]) i += 1 else: i = len(tab.vars) - 1 for second_tab_name, second_tab in self.current_profile_options[ tab_name][1].items(): for j in range(len(second_tab[1]) - 1, -1, -1): tab.vars[i].set(second_tab[1][j]) i -= 1 def accept_auditor(self): if self.fio_OK_btn.cget('text') == 'OK': self.fio = self.fio_Entry.get() self.org = self.org_Entry.get() self.fio_OK_btn.configure(text='Изменить', width=10) self.fio_Entry.grid_remove() self.org_Entry.grid_remove() self.fio_Label.configure(text=self.fio) self.org_Label.configure(text=self.org) self.fio_Label.grid(row=2, column=0, sticky='nsew', padx=10) self.org_Label.grid(row=4, column=0, sticky='nsew', padx=10) else: self.fio_OK_btn.configure(text='OK', width=5) self.fio_Entry.grid() self.org_Entry.grid() self.fio_Label.grid_remove() self.org_Label.grid_remove() def loadProfiles(self): for child in self.profiles_Frame.interior.winfo_children(): child.destroy() #self.profiles_Frame.pack(side=tk.TOP, anchor='sw', padx=5, pady = 10, fill=tk.BOTH, expand=1) try: with open(self.main_path + '/profiles.json') as file: self.profiles = json.load(file) except: with open(self.main_path + '/profiles.json', 'w') as file: json.dump(self.profiles, file) prof_count = len(self.profiles) self.var = tk.IntVar() for i in range(prof_count): tk.Radiobutton(self.profiles_Frame.interior, variable=self.var, value=i, indicator=0, height=3, text=list(self.profiles.keys())[i], selectcolor="#f19572", activebackground="#f19572", command=self.changeCurrentProfile).pack(side=tk.TOP, anchor='nw', fill=tk.X, padx=5, pady=2) def dumpProfiles(self): with open(self.main_path + '/profiles.json', 'w') as file: json.dump(self.profiles, file) def changeCurrentProfile(self): currentProfileName = list(self.profiles.keys())[self.var.get()] self.current_profile_options = copy.deepcopy( self.profiles[currentProfileName]) self.profileView.heading('#0', text=list( self.profiles.keys())[self.var.get()], anchor='w') self.initTree() self.sync_vars() #self.profiles_Label.configure(text=self.var.get()) def save_btn_click(self): self.saveDialog = tk.Toplevel() save_frame = ttk.Frame(self.saveDialog) self.saveDialog.focus_set() width = self.master.winfo_screenwidth() // 5 + 96 height = self.master.winfo_screenheight() // 5 dw = (self.master.winfo_screenwidth() - width) // 2 dh = (self.master.winfo_screenheight() - height) // 2 self.saveDialog.geometry('{}x{}+{}+{}'.format(width, height, dw, dh)) self.saveDialog.resizable(False, False) self.saveDialog.title('Сохранение профиля') # Настройка виджетов в окне ввода пароля save_Label = ttk.Label(save_frame, text='Названия профиля') self.save_Entry = ttk.Entry(save_frame, font=16) save_Btn = ttk.Button(save_frame, text='Сохранить', width=15) self.save_Entry.bind('<Return>', self.save_click) save_Btn.bind('<Button-1>', self.save_click) save_Label.grid(row=1, column=0) self.save_Entry.grid(row=2, column=0, padx=10, sticky='nsew') save_Btn.grid(row=3, column=0, padx=10, pady=20, sticky='e') save_frame.pack(fill=tk.BOTH) save_frame.grid_rowconfigure(1, minsize=height // 3) save_frame.grid_rowconfigure(2, minsize=30) save_frame.grid_columnconfigure(0, minsize=width) self.save_Entry.focus_set() def save_click(self, event): """Функция-обработчик нажатия кнопки """ profile_name = self.save_Entry.get() self.profiles[profile_name] = self.current_profile_options self.dumpProfiles() self.loadProfiles() self.saveDialog.destroy() self.initTree() def initTree(self): if self.current_profile_options == {}: self.current_profile_options = dict( self.profiles["Профиль по умолчанию"]) for (key, value) in self.current_profile_options.items(): if self.modules_config.__contains__(key): if not self.profileView.exists(key): self.profileView.insert("", "end", key, text=key) self.profileView.change_state(key, value[0]) value = value[1] if type(value) == type("1"): i = 0 for func_key in self.modules_config[key][0].keys(): func_key = func_key.replace('\n', ' ') if not self.profileView.exists(key + func_key + "_" + str(i)): self.profileView.insert(key, "end", key + func_key + "_" + str(i), text=func_key) if value[i] == '0': self.profileView.change_state( key + func_key + "_" + str(i), 'unchecked') if value[i] == '1': self.profileView.change_state( key + func_key + "_" + str(i), 'checked') i += 1 else: j = 0 for (second_key, second_value) in dict(value).items(): if not self.profileView.exists(second_key): self.profileView.insert(key, "end", second_key, text=second_key) self.profileView.change_state(second_key, second_value[0]) second_value = second_value[1] if type(value[second_key][1]) == type("1"): i = 0 for func_key in self.modules_config[key][0][ j].keys(): func_key = func_key.replace('\n', ' ') if not self.profileView.exists(second_key + func_key + "_" + str(i)): self.profileView.insert( second_key, "end", second_key + func_key + "_" + str(i), text=func_key) if value[second_key][1][i] == '0': self.profileView.change_state( second_key + func_key + "_" + str(i), 'unchecked') if value[second_key][1][i] == '1': self.profileView.change_state( second_key + func_key + "_" + str(i), 'checked') i += 1 j += 1 def check_uncheck_item(self, event): x, y, widget = event.x, event.y, event.widget elem = widget.identify("element", x, y) if "image" in elem: # a box was clicked item = self.profileView.identify_row(y) children = self.profileView.get_children(item) parents = [] parent = widget.parent(item) i = 0 while parent != '': parents.append(parent) parent = widget.parent(parent) if parents and children == (): tag = self.profileView.item(parents[-1], "tags") self.current_profile_options[parents[-1]][0] = tag[0] if len(parents) == 2: tag = self.profileView.item(parents[0], "tags") self.current_profile_options[parents[-1]][1][ parents[-2]][0] = tag[0] tag = self.profileView.item(item, "tags") i = int(item.split('_')[1]) varL = self.current_profile_options[parents[-1]][1][ parents[-2]][1][0:i] varR = self.current_profile_options[parents[-1]][1][ parents[-2]][1][i + 1:] if "checked" in tag: self.current_profile_options[parents[-1]][1][ parents[-2]][1] = varL + '1' + varR else: self.current_profile_options[parents[-1]][1][ parents[-2]][1] = varL + '0' + varR else: tag = self.profileView.item(item, "tags") i = int(item.split('_')[1]) varL = self.current_profile_options[parents[-1]][1][0:i] varR = self.current_profile_options[parents[-1]][1][i + 1:] if "checked" in tag: self.current_profile_options[ parents[-1]][1] = varL + '1' + varR else: self.current_profile_options[ parents[-1]][1] = varL + '0' + varR else: tag = self.profileView.item(item, "tags") self.current_profile_options[item][0] = tag[0] profile_1 = '' for child in self.profileView.get_children(item): children = self.profileView.get_children(child) if children != (): tag = self.profileView.item(child, "tags") self.current_profile_options[item][1][child][0] = tag[ 0] profile = '' for s_child in self.profileView.get_children(child): tag = self.profileView.item(s_child, "tags") if 'checked' in tag: profile += '1' else: profile += '0' self.current_profile_options[item][1][child][ 1] = profile else: tag = self.profileView.item(child, "tags") if 'checked' in tag: profile_1 += '1' else: profile_1 += '0' self.current_profile_options[item][1] = profile_1 self.sync_vars()
from ttkwidgets import CheckboxTreeview import tkinter as tk import tkinter.ttk as ttk from tkinter.font import Font import ttkwidgets as twk root = tk.Tk() root.geometry('500x500') root.title("Checkbox example") f1 = tk.Frame(root, width=490, height=490) f1.pack() can = tk.Canvas(f1) tree = CheckboxTreeview(can) tree.column('#0', minwidth=350, stretch=True) tree.insert("", "end", "1", text="1" + '2') tree.insert("1", "end", "11", text="11") tree.insert("1", "end", "12", text="Anantha" + "kumar" + 'Kondra' + 'Anantha Kumar Kondra') tree.insert("11", "end", "111", text="Anantha" + "kumar" + 'Kondra' + 'Anantha Kumar Kondra') tree.insert("", "end",
def Main(): window = tkinter.Tk() window.title('Security Checker') # Title window.geometry('500x350+450+200') # Resolution window['padx'] = 8 # window.iconbitmap(default="Appwheel.ico") # App icon title_font = tkfont.Font(family='Arial', size=10, weight="bold") # Fonts within the App label1 = ttk.Label(text="Check the boxes:", font=title_font) # Writings within the App label1.grid(row=0, column=0, sticky="nw", pady=8) window.grid_columnconfigure(0, weight=1) window.grid_columnconfigure(1, weight=1) window.grid_columnconfigure(2, weight=3) window.grid_columnconfigure(3, weight=2) window.grid_columnconfigure(4, weight=2) window.grid_rowconfigure(0, weight=1) window.grid_rowconfigure(1, weight=10) window.grid_rowconfigure(2, weight=2) window.grid_rowconfigure(3, weight=3) window.grid_rowconfigure(4, weight=3) tree = CheckboxTreeview # Variable tree equals tree view # Edit dictionaries as you like # Dict #1 cisco = { 1: "enable secret", 2: "aaa new-model", 3: "service-password encryption", 4: "ip ssh version 2", 5: "motd", 6: "no logging console", 7: "no logging monitor", 8: "vtp password" } # Dict 2 smbv1_patch = { 100: "KB4012598", 101: "KB4012212", 102: "KB4012215", 103: "KB4012213", 104: "KB4012216", 105: "KB4012214", 106: "KB4012217", 107: "KB4012606", 108: "KB4013198", 109: "KB4013429" } # What should not be present in a configuration files should_not_be = [ "enable password", "snmp-server community public", "transport input telnet", "EnableSMB1Protocol : True" ] scrollbar1 = ttk.Scrollbar(window, orient="vertical", command=tree.yview) # Scroll bar scrollbar1.grid(row=1, column=6, sticky='nse') tree = CheckboxTreeview(yscrollcommand=scrollbar1) tree.grid(column=0, columnspan=6, row=1, sticky="news") # Tree position tree.insert("", "end", "1", text="1. CISCO Hardening") tree.insert("1", "end", "sub0", text="1.1 Generic configs") tree.insert("sub0", "end", cisco[1], text="1.1.1 Password Hash") tree.insert("sub0", "end", cisco[3], text="1.1.2 Password Encryption") tree.insert("sub0", "end", cisco[2], text="1.1.3 AAA configuration") tree.insert("sub0", "end", cisco[4], text="1.1.4 SSH version 2") tree.insert("sub0", "end", cisco[5], text="1.1.5 MOTD") tree.insert("sub0", "end", cisco[8], text="1.1.6 VTP Password") tree.insert("sub0", "end", cisco[6], text="1.1.7 No logging console") tree.insert("sub0", "end", cisco[7], text="1.1.8 No logging monitor") tree.insert("", "end", "2", text="2. Microsoft SMBv1 Patching Check") tree.insert("2", "end", smbv1_patch[100], text="2.1 Windows Vista & Server 2008 (KB4012598)") tree.insert("2", "end", "sub10", text="2.2 Windows 7 & Server 2008 R2") tree.insert("sub10", "end", smbv1_patch[101], text="2.2 KB4012212") tree.insert("sub10", "end", smbv1_patch[102], text="2.3 KB4012215") tree.insert("2", "end", "sub11", text="2.4 Windows 8.1 & Server 2012 & 2012 R2") tree.insert("sub11", "end", smbv1_patch[103], text="2.4 KB4012213") tree.insert("sub11", "end", smbv1_patch[104], text="2.5 KB4012216") tree.insert("sub11", "end", smbv1_patch[105], text="2.6 KB4012214") tree.insert("sub11", "end", smbv1_patch[106], text="2.7 KB4012217") tree.insert("2", "end", "sub12", text="2.8 Windows 10 & Server 2016") tree.insert("sub12", "end", smbv1_patch[107], text="2.8 KB4012606") tree.insert("sub12", "end", smbv1_patch[108], text="2.7 KB4013198") tree.insert("sub12", "end", smbv1_patch[109], text="2.8 KB4013429") button2 = ttk.Button(text="Quit", command=sys.exit) # Close Button button2.grid(row=4, column=0, sticky='ws', padx=10, pady=10) # Close button position checked_boxes = list() # List for appending selected boxes lines_in_conf_file = list() # List for appending the read file passed = str('Passed\t\t') not_passed = str('Not Passed\t\t') def box_select(just): # Function for appending selected boxes checked_boxes.append(tree.get_checked()) tree.bind('<<TreeviewSelect>>', box_select) def file_open(): if len(tree.get_checked()) > 0: readfile = filedialog.askopenfilename(initialdir="/", title="Select " "configuration" " file", filetypes=(("txt " "files", "*.txt *.html"), ("all " "files", "*.*"))) try: with open(readfile, "r", encoding='utf-8') as opened_file: for i in opened_file: pass encodings = 'utf-8' except UnicodeDecodeError: encodings = 'utf-16' with open(readfile, "r", encoding=encodings) as opened_file: for read_line in opened_file: lines_in_conf_file.append(read_line.strip('\n')) with open("temp.txt", "a") as conf: # Opens file --ONCE-- for clause in checked_boxes[-1]: # Loops over selection for line in lines_in_conf_file: # Loops over conf file if clause in line: # Checks what equals between loops conf.write("{}".format(passed) + clause + "\n") # Writing them into a file break # Ends IF statement and continues with else: # a loop on a conf file if clause in should_not_be: # Checks if selection in not wanted list conf.write( "{}".format(passed) + clause + "\n") # if yes, writes to a file "PASSED" else: conf.write( "{}".format(not_passed) + clause + "\n") # if not, writes to a file "NOT # PASSED" checked_configs() else: pop_up_msg() def checked_configs(): checked = tkinter.Tk() # checked.iconbitmap(default="Appwheel.ico") # App icon checked.geometry('650x500+650+300') # Resolution checked.wm_title("Security Checker") checked.grid_columnconfigure(0, weight=1) checked.grid_columnconfigure(1, weight=1) checked.grid_columnconfigure(2, weight=3) checked.grid_columnconfigure(3, weight=2) checked.grid_columnconfigure(4, weight=2) checked.grid_rowconfigure(0, weight=1) checked.grid_rowconfigure(1, weight=10) checked.grid_rowconfigure(2, weight=2) checked.grid_rowconfigure(3, weight=3) checked.grid_rowconfigure(4, weight=3) label2 = ttk.Label(checked, text='Security check report:', font=title_font) label2.grid(row=0, column=0, sticky='ew', padx=10, pady=10) button3 = ttk.Button(checked, text="Quit", command=sys.exit) button3.grid(row=4, column=0, sticky='ws', padx=10, pady=10) def save_report_to_file(): save_file = filedialog.asksaveasfile(mode='w', defaultextension=".txt", initialdir="/", title="Save " "report", filetypes=(("txt " "files", "*.txt"), ("all " "files", "*.*"))) if save_file: with open('temp.txt', 'r') as temp_file: for i in temp_file: save_file.write(i) else: return button4 = ttk.Button(checked, text="Save to..", command=save_report_to_file) button4.grid(row=4, column=5, sticky='es', padx=10, pady=10) checked = Text(checked) checked.grid(column=0, columnspan=6, row=1, sticky="news") checked.insert('1.0', ''.join(open("temp.txt", "r"))) checked.mainloop() def pop_up_msg(): popup = tkinter.Tk() # popup.iconbitmap(default="Appwheel.ico") # App icon popup.wm_title("Security Checker") label3 = ttk.Label( popup, text='Please select at least 1 checkbox to continue', font=title_font) label3.grid(row=0, column=0, sticky='ew', padx=10, pady=10) button5 = ttk.Button(popup, text="Okay", command=popup.destroy) button5.grid(row=1, column=0, padx=10, pady=10) popup.mainloop() button1 = ttk.Button(text="Next", command=file_open) button1.grid(row=4, column=5, sticky='es', padx=10, pady=10) # Open's Browse Button window.mainloop()