import tkinter import tkinter.ttk import os import subprocess import sys from voussoirkit import pathclass def load_programs(): directory = os.path.join(os.path.dirname(__file__), 'PGUI') shortcuts = [os.path.join(directory, p) for p in os.listdir(directory)] shortcuts = [p for p in shortcuts if p.lower().endswith('.lnk')] shortcuts = [pathclass.Path(p) for p in shortcuts] return shortcuts class PGUILauncher(tkinter.ttk.Frame): def __init__(self, parent): super().__init__(parent) self.parent = parent self.style = tkinter.ttk.Style() self.style.theme_use("clam") self.pack(fill=tkinter.BOTH, expand = 1) self.filter_var = tkinter.StringVar() self.filter_var.trace('w', self.filter) self.filter_entry = tkinter.Entry(self, textvariable=self.filter_var) self.filter_entry.grid(row=0, column=0, columnspan=999, sticky='ew') self.filter_entry.bind('', self.launch_filtered) self.filter_entry.bind('', self.quit) self.filter_entry.focus() x = 0 y = 1 self.buttons = [] self.buttonwidth = 12 shortcuts = load_programs() for (index, shortcut) in enumerate(shortcuts): print(y, x) button = tkinter.ttk.Button( self, text=shortcut.replace_extension('').basename, command=lambda sc=shortcut: self.launch_program(sc), ) button.shortcut = shortcut print(f'Creating button for {shortcut.basename}') button.configure(width=self.buttonwidth) button.grid(row=y, column=x) self.buttons.append(button) x += 1 if x >= 3 and (index != len(shortcuts)-1): x = 0 y += 1 print(y, x) self.pack() self.update() def filter(self, *args): text = self.filter_entry.get().lower() for button in self.buttons: if text == '' or text in button['text'].lower(): button['state'] = 'normal' else: button['state'] = 'disabled' def launch_filtered(self, *args): enabled = [b for b in self.buttons if b['state'].string == 'normal'] if len(enabled) != 1: return button = enabled[0] self.launch_program(button.shortcut) def launch_program(self, shortcut): print('opening application', shortcut.basename) os.chdir(shortcut.parent.absolute_path) command = f'"{shortcut.absolute_path}"' subprocess.Popen(command, shell=True) self.quit() def quit(self, *args): return super().quit() def main(argv): root = tkinter.Tk() root.withdraw() root.title("PGUI") root.resizable(0,0) ex = PGUILauncher(root) width = root.winfo_reqwidth() height = root.winfo_reqheight() x_offset = (root.winfo_screenwidth() - width) / 2 y_offset = (root.winfo_screenheight() - height) / 2 root.geometry('%dx%d+%d+%d' % (width, height, x_offset, y_offset-50)) root.deiconify() root.mainloop() if __name__ == '__main__': raise SystemExit(main(sys.argv[1:]))