def open_pop(self, hook_remove, hook_add, hook_apply): '''Manage bookmark sources: Major dialogue''' dprint(3, "\nTkMemobook::open_pop:: ") manager = Toplevel(self.root) manager_list = ListboxHV(manager, selectmode="multiple") manager_items = self.ctrl["db"]["scan"] if isinstance(manager_items, str): manager_items = [ manager_items ] else: manager_items = list(manager_items) manager_items.sort() for item in manager_items: manager_list.insert(END, item) manager_list.grid_columnconfigure(0, weight=1) manager_list.grid_rowconfigure(0, weight=1) manager_list.grid(sticky="nswe") buttons = Frame(manager) rembutt = Button(buttons, text="Remove", command=lambda: hook_remove(manager_list, manager_items) ) addbutt = Button(buttons, text="Add Other...", command=lambda: hook_add(manager, manager_list, manager_items) ) appbutt = Button(buttons, text="Apply", command=lambda: self.__get_busy_with(None, hook_apply, manager, manager_items) ) rembutt.grid(row=1, column=0) addbutt.grid(row=1, column=1) appbutt.grid(row=1, column=2) buttons.grid_columnconfigure(1, weight=1) buttons.grid_rowconfigure(1, weight=1) buttons.grid(stick="nswe") manager.grid_columnconfigure(0, weight=1) manager.grid_rowconfigure(0, weight=1)
def create_widgets(self): '''Create basic 3 row x 3 col search (find) dialog. Other dialogs override subsidiary create_x methods as needed. Replace and Find-in-Files add another entry row. ''' top = Toplevel(self.root) top.bind("<Return>", self.default_command) top.bind("<Escape>", self.close) top.protocol("WM_DELETE_WINDOW", self.close) top.wm_title(self.title) top.wm_iconname(self.icon) self.top = top self.frame = Frame(top, padding="5px") self.frame.grid(sticky="nwes") top.grid_columnconfigure(0, weight=100) top.grid_rowconfigure(0, weight=100) self.row = 0 self.frame.grid_columnconfigure(0, pad=2, weight=0) self.frame.grid_columnconfigure(1, pad=2, minsize=100, weight=100) self.create_entries() # row 0 (and maybe 1), cols 0, 1 self.create_option_buttons() # next row, cols 0, 1 self.create_other_buttons() # next row, cols 0, 1 self.create_command_buttons() # col 2, all rows
def printFiles(self): for pdf in self.PDFs: self.jobCounter = ghostscript("\"T:\RELEASED_FILES\CURRENT_PDF\\"+pdf.replace("\"","")+"\"", self.jobCounter, self.selectedPrinter.get(), self.selectedPaper.get(),self.POPENFile) #print (jobCounter) if self.print_wrong_revision_var.get(): for pdf in self.wrongRevsion: self.jobCounter = ghostscript("\"T:\RELEASED_FILES\CURRENT_PDF\\"+pdf.replace("\"","")+"\"", self.jobCounter, self.selectedPrinter.get(), self.selectedPaper.get(),self.POPENFile) #os.remove(self.POPENFile) posx = 500 posy = 400 sizex = 500 sizey = 100 top = Toplevel() top.title("Done") top.grid_rowconfigure(0,weigh=1) top.grid_columnconfigure(0, weight=1) top.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) msg = Message(top, text="Sent all files to printer.\nPlease wait for the printer to finish", width=200, pady=10) msg.grid(row=0, column=0, columnspan=4) top.focus_force() self.current_window = top if self.runningInFrozen: top.iconbitmap(sys._MEIPASS+r"/emblem_print.ico") else: top.iconbitmap("emblem_print.ico") top.bind("<FocusOut>", self.Alarm) button = Button(top,text="Ok", command=top.quit) button.grid(row=1, column=0)
def information(self): ######################################################################## # Information # ######################################################################## # Renvoie les spécialite offerte par l'école en fonction du choix de l'utilisateur window = Toplevel(self.root) window.resizable(True, True) vsb = Scrollbar(window, orient="vertical") vsb.grid(row=0, column=1, sticky="ns") hsb = Scrollbar(window, orient="horizontal") hsb.grid(row=1, column=0, sticky="ew") ca = Canvas(window, yscrollcommand=vsb.set, xscrollcommand=hsb.set) ca.grid(row=0, column=0, sticky="news") vsb.config(command=ca.yview) hsb.config(command=ca.xview) window.grid_rowconfigure(0, weight=1) window.grid_columnconfigure(0, weight=1) fr = Frame(ca) i=1 for a in ["Nom","Admission","Region","Alternance","Specialite"]: Label(fr, text=a).grid(row=0, column=i) i+=2 if self.choix["specialites"] == None: ListeSpe = list(self.specialites.get(0, "end")) else: ListeSpe = [ self.specialites.get(i) for i in self.specialites.curselection() ] if self.choix["alternance"] == None: alternance = ["Oui", "Non"] else: alternance = [self.choix["alternance"][0]] ligne = 1 for ecole in self.ecolesselect.values(): if ecole["var"].get() == 1: for i in [value for (key,value) in self.ecolesselect.items() if value['nom']==ecole['nom'] and value["Spe"] in ListeSpe and value["Alternance"] in alternance ]: j=1 for texte in [i["nom"],i["admission"],i["region"],i["Alternance"],i["Spe"]] : a = Entry(fr,width=60) a.insert(0,texte) a.grid(row=ligne, column=j) j+=2 a.config(state="disabled") ligne += 1 ca.create_window(0, 0, window=fr) fr.update_idletasks() ca.config(scrollregion=ca.bbox("all"))
def checkSettingsBeforePrint(self): if self.selectedPrinter.get() != '' and self.PDFs != None : printingThread = threading.Thread(target=self.printFiles) printingThread.start() else: if self.selectedPrinter.get() == '': posx = 500 posy = 400 sizex = 500 sizey = 100 top = Toplevel() top.grid_rowconfigure(0,weigh=1) top.grid_columnconfigure(0, weight=1) top.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) top.title("Printer not set") msg = Message(top, text="Set the default printer in\nPrinter Settings.",width=200, pady=10) msg.grid(row=0, column=0,columnspan=5) button = Button(top,text="Ok", command=top.destroy) button.grid(row=1, column=0) self.current_window = top if self.runningInFrozen: top.iconbitmap(sys._MEIPASS+r"/emblem_print.ico") else: top.iconbitmap("emblem_print.ico") top.focus_force() top.bind("<FocusOut>", self.Alarm) return None elif self.PDFs == None: posx = 500 posy = 400 sizex = 500 sizey = 100 top = Toplevel() top.grid_rowconfigure(0,weigh=1) top.grid_columnconfigure(0, weight=1) top.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) top.title("No file loaded") msg = Message(top, text="Browse for a file before printing.",width=200, pady=10) msg.grid(row=0, column=0,columnspan=5) button = Button(top,text="Ok", command=top.destroy) button.grid(row=1, column=0) self.current_window = top if self.runningInFrozen: top.iconbitmap(sys._MEIPASS+r"/emblem_print.ico") else: top.iconbitmap("emblem_print.ico") top.focus_force() top.bind("<FocusOut>", self.Alarm) return None
def aboutsoft(self): root1 = Toplevel() wwwwidth = 1200 wwheight = 400 screenWidth = self.root.winfo_screenwidth() screenHeight = self.root.winfo_screenheight() left = (screenWidth / 2) - (wwwwidth / 2) top = (screenHeight / 2) - (wwheight / 2) root1.geometry('%dx%d+%d+%d' % (wwwwidth, wwheight, left, top)) root1.grid_rowconfigure(0, weight=1) root1.grid_columnconfigure(0, weight=1) root1.title("About Sheet.wd") photo3 = PhotoImage(file="logo.gif") label3 = Label(root1, image=photo3) label4 = Label( root1, text="Code name sheet.wd is a simple text editor for web developers" ) label5 = Label( root1, text="and simple users developed by Dhaval. Current version :- 0.1" ) label6 = Label( root1, text= "sheet.wd is purely made for web development purpose supporting") label7 = Label( root1, text="simple txt files and HTML webpages.Although you can edit CSS" ) label8 = Label( root1, text="files also,its proper functioning would be given later") label9 = Label( root1, text="For Suggestions or queries - [email protected]") label3.pack() label4.pack() label5.pack() label6.pack() label7.pack() label8.pack() label9.pack() root1.mainloop()
def get_top_level(frames, kwargs=None): master = kwargs.pop('master') title = kwargs.pop('title') width = kwargs.get('width') height = kwargs.get('height') frames_kwargs = None if 'frames_kwargs' in kwargs.keys(): frames_kwargs = kwargs.pop('frames_kwargs') top_level = Toplevel(master=master, **kwargs) # Hide the toplevel top_level.withdraw() top_level.geometry( center_tk_window(window=top_level, height=width, width=height)) # Create main container frame that will hold all other frames top_level.grid_rowconfigure(0, weight=1) top_level.grid_columnconfigure(0, weight=1) container = ttk.Frame(top_level) container.grid(column=0, row=0, sticky="nsew") container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) top_level.__setattr__('container', container) # Render all the other frames top_level_frames = {} for frame in frames: _frame = frame(parent=container, controller=top_level, kwargs=frames_kwargs[frame] if frames_kwargs else None) top_level_frames[frame] = _frame _frame.grid(row=0, column=0, sticky='nsew') top_level.__setattr__('frames', top_level_frames) # Define the title if title: top_level.title(title) # Raise the first frame top_level_frames[frames[0]].tkraise() # Make the toplevel visible again top_level.deiconify() return top_level
def run(): """ Esegue l'emulatore del pdp8 """ CD = pdp8() principale = Tk() principale.title("Pdp8 Emulator : Assembly Editor") emulatore = Toplevel() emulatore.title("Pdp8 Emulator") emulatore.geometry("1015x589") edit = Editor(principale, CD) scrollbar1 = AutoScrollbar(emulatore) scrollbar1.grid(row=0, column=1, sticky=N + S) scrollbar2 = AutoScrollbar(emulatore, orient=HORIZONTAL) scrollbar2.grid(row=1, column=0, sticky=E + W) finestra = Canvas(emulatore, yscrollcommand=scrollbar1.set, xscrollcommand=scrollbar2.set) finestra.grid(row=0, column=0, sticky=N + S + E + W) scrollbar1.config(command=finestra.yview) scrollbar2.config(command=finestra.xview) emulatore.grid_rowconfigure(0, weight=1) emulatore.grid_columnconfigure(0, weight=1) emul = Emulatore(finestra, edit, CD, emulatore) finestra.create_window(0, 0, anchor=NW, window=emul.master) emul.master.update_idletasks() finestra.config(scrollregion=finestra.bbox("all")) principale.protocol("WM_DELETE_WINDOW", edit.exit) emulatore.protocol("WM_DELETE_WINDOW", emul.exit) principale.mainloop() emulatore.mainloop()
def bootstrap(self): root2 = Toplevel() width = 1024 wwheight = 1024 screenWidth = root2.winfo_screenwidth() screenHeight = root2.winfo_screenheight() left = (screenWidth / 2) - (width / 2) top = (screenHeight / 2) - (wwheight / 2) root2.geometry('%dx%d+%d+%d' % (width, wwheight, left, top)) root2.grid_rowconfigure(0, weight=1) root2.grid_columnconfigure(0, weight=1) root2.title("Bootstrap infochart") photobt = PhotoImage(file="bootstrap.gif") labelbt = Label(root2, image=photobt) labelbt.grid(row=0, column=0) labelheading = Label(root2, text="Glyphs summary") labelheading.grid(row=1, column=0) glyphs1 = PhotoImage(file="glyphs1.gif") glyphs2 = PhotoImage(file="glyphs2.gif") glyphs3 = PhotoImage(file="glyphs4.gif") glyphs4 = PhotoImage(file="glyphs5.gif") glyphs5 = PhotoImage(file="glyphs6.gif") labelbt1 = Label(root2, image=glyphs1) labelbt2 = Label(root2, image=glyphs2) labelbt3 = Label(root2, image=glyphs3) labelbt4 = Label(root2, image=glyphs4) labelbt5 = Label(root2, image=glyphs5) labelbt1.grid(row=1) labelbt2.grid(row=2) labelbt3.grid(row=3) labelbt4.grid(row=4) labelbt5.grid(row=5) root2.mainloop()
def instructions(fontsize): new = Toplevel() nw = 850 nh = 600 nws = new.winfo_screenwidth() # width of the screen nhs = new.winfo_screenheight() # height of the screen nx = (nws / 2) - (nw / 2) ny = (nhs / 2) - (nh / 2) new.geometry('%dx%d+%d+%d' % (nw, nh, nx, ny)) new.title('U-Pack Instructions') new.configure(bg=vtmaroon, pady=5, padx=5) new.grid_propagate(False) new.grid_rowconfigure(0, weight=1) new.grid_columnconfigure(0, weight=1) txt = Text(new, relief='sunken', bd=4, fg='black', bg=vtsmoke) txt.config(pady=10, padx=40, font=('Times', fontsize), wrap='word') txt.grid(column=0, row=0, sticky='nsew') scroller = Scrollbar(new, orient='vertical', command=txt.yview) scroller.grid(column=1, row=0, sticky='nsew') txt['yscrollcommand'] = scroller.set OKa = Button(new, command=new.destroy, text='OK') OKa.configure(bg=hokiestone, bd=4, fg='black', font=('Arial', fontsize), highlightbackground=vtmaroon, relief='raised') OKa.grid(column=0, row=1, sticky='nsew') instructtext = resource_path("UPackInstructions.txt") if path.exists(instructtext): with open(instructtext) as inst: quote = inst.read() txt.insert('end', quote) else: pathstring = str(instructtext) messagebox.showwarning(message="Cannot find the file:\n\'%s\'." % pathstring)
def createAttributePanel(self, actionType=None, event=None): if actionType != 'delayadd': self.SelDriver.set_webElement((event.x, event.y), self.ScreenCoverWindow) attributePanelWindow = Toplevel() attributePanelWindow.geometry("600x500") attributePanelWindow.attributes('-topmost', True) attributePanelWindow.title("Object Properties") attributePanelWindow.grid_columnconfigure(0, weight=1) attributePanelWindow.grid_rowconfigure(0, weight=1) top = ttk.Frame(attributePanelWindow) top.grid(column=0, row=0, sticky='nsew') top.grid_columnconfigure(0, weight=1, uniform="group1") top.grid_columnconfigure(1, weight=1, uniform="group1") top.grid_rowconfigure(0, weight=1) self.attributeTreeFrame = Frame(top, borderwidth=1, relief="solid") self.attributetreeValues = Frame(top, borderwidth=1, relief='solid') self.attributeTreeFrame.grid_rowconfigure(0, weight=1) self.attributeTreeFrame.grid_columnconfigure(0, weight=1) self.attributeTreeFrame.grid(row=0, column=0, sticky='nsew') self.attributetreeValues.grid(row=0, column=1, sticky="nsew") footer = ttk.Frame(top, height=120) footer.grid(column=0, row=1, columnspan=2) ttk.Button(footer, text='Cancel', command=attributePanelWindow.destroy).grid(column=2, row=1, padx=5, pady=10) ttk.Button(footer, text='Add Object', command=lambda: self.updatePOMTree( attributePanelWindow, self.ObjectPropertyTree.getObjectDict())).grid(column=1, row=1, padx=5, pady=10) self.createAttributeTree(self.SelDriver.attributeList, actionType)
class GameUI: def __init__(self, master, sm_gamekey, udp_port, status_callback): self.master = master self.board = Board() self.sm_gamekey = sm_gamekey self.udp_port = udp_port self.logger = Logger(1) self.client = None self.tick_rate = 0.2 self.buttons = [] self.exit_tick = False self.status_callback = status_callback self.log = {} self.start_game() def create(self): self.master = Toplevel(self.master) self.master.protocol("WM_DELETE_WINDOW", self.on_closing) self.master.title("mchess - {0} turn".format("your" if self.is_white else "whites")) for x in range(0, 8): start_background = UI_WHITE if x % 2 == 0 else UI_BLACK for y in range(0, 8): if y == 0: self.gen_button(self.board.board[x][y], start_background) else: if y % 2 == 0: self.gen_button(self.board.board[x][y], start_background) else: self.gen_button(self.board.board[x][y], UI_WHITE if start_background == UI_BLACK else UI_BLACK) for col in range(0, 8): self.master.grid_columnconfigure(col, minsize=60, weight=1) for row in range(0, 8): self.master.grid_rowconfigure(row, minsize=60, weight=1) self.log_listbox = Listbox(self.master, height=6, width=20) self.log_listbox.grid(row=0, column=9, rowspan=8, sticky=N + S) self.log_controller = ListBoxController(self.log, self.log_listbox) self.setup(NORMAL if self.is_white else DISABLED) def gen_button(self, figure, background): img = figure.load_icon() figure.image = img button = Button(self.master, image=img, bg=background) button.position = figure.position button.figure = figure button.configure(cursor="hand1") button.grid(row=figure.position[X], column=figure.position[Y]) self.buttons.append(button) if not isinstance(figure, Blank): button.bind("<ButtonPress-1>", self.on_start) button.bind("<B1-Motion>", self.on_drag) button.bind("<ButtonRelease-1>", self.on_drop) return button def get_button(self, pos): for button in self.buttons: if button.figure.position[X]==pos[X] and button.figure.position[Y]==pos[Y]: return button def add_log(self, log): if log.get_key() in self.log: log.set_index(self.log[log.get_key()].index) self.log[log.get_key()] = log self.log_controller.refresh(log.get_key()) else: self.log_controller.add(log) def move(self, target, source): source_position_before_move = (source.figure.position[X], source.figure.position[Y]) target_position_before_move = (target.figure.position[X], target.figure.position[Y]) result = self.board.move(source.figure, target.figure) if result[0] and result[1] == SWAP: target.grid(row=source_position_before_move[X], column=source_position_before_move[Y]) source.grid(row=target_position_before_move[X], column=target_position_before_move[Y]) elif result[0] and result[1] == EAT: target.grid(row=source_position_before_move[X], column=source_position_before_move[Y]) source.grid(row=target_position_before_move[X], column=target_position_before_move[Y]) self.gen_button(result[2], source["bg"]) #print(self.board) return result[0] def on_start(self, event): # you could use this method to create a floating window # that represents what is being dragged. pass def on_drag(self, event): # you could use this method to move a floating window that # represents what you're dragging pass def on_drop(self, event): # find the widget under the cursor x, y = event.widget.winfo_pointerxy() source = event.widget target = event.widget.winfo_containing(x, y) msg = CM_MOVE(self.sm_gamekey.key, target.figure.position, source.figure.position) self.send_messages([{"opcode": type(msg).OP_CODE, "data": msg.get_data()}]) def setup(self, state): for button in self.buttons: side = WHITE if self.is_white else BLACK if button.figure.side==side: button.configure(state=state) if state==NORMAL: button.configure(state=NORMAL) button.bind("<ButtonPress-1>", self.on_start) button.bind("<B1-Motion>", self.on_drag) button.bind("<ButtonRelease-1>", self.on_drop) elif state==DISABLED: button.configure(state=DISABLED) button.unbind("<ButtonPress-1>") button.unbind("<B1-Motion>") button.unbind("<ButtonRelease-1>") else: button.configure(state=DISABLED) button.unbind("<ButtonPress-1>") button.unbind("<B1-Motion>") button.unbind("<ButtonRelease-1>") def on_closing(self): if messagebox.askokcancel(parent=self.master, title="Quit", message="Do you want to quit?"): msg = CM_QUIT(self.sm_gamekey.key) self.send_messages([{"opcode": type(msg).OP_CODE, "data": msg.get_data()}]) self.disconnect() self.master.destroy() def start_game(self): try: self.exit_tick = False c = Client((self.sm_gamekey.ip, self.sm_gamekey.port), self.udp_port, False, None, None) c.start() self.client = c msg = CM_GAMEKEY(self.sm_gamekey.key) self.send_messages([{"opcode": type(msg).OP_CODE, "data": msg.get_data()}]) #self.master.after(self.tick_rate, self.tick) t = threading.Thread(target=self.tick) t.daemon = True t.start() self.status_callback.in_game() except ConnectionRefusedError: self.status_callback.available() messagebox.showerror("Connection failed", "Failed to connect to game server") def disconnect(self): self.exit_tick = True self.client.shutdown() self.client = None self.status_callback.available() def tick(self): while True: if self.exit_tick: return if self.client is not None: status = self.client.status() if status == 3 or status == 4: messagebox.showerror("Connection error", "Disconnected from game server") self.disconnect() else: return messages = None try: if self.client is not None: messages = self.client.handler.read_queue.get(True, 0.1) except queue.Empty: pass else: if messages is not None: try: processed_messages = self.process_messages(messages) if processed_messages is not None and len(processed_messages)>0: self.send_messages(processed_messages) except Exception as ex: self.logger.log("forward_messages: exception: {0}".format(ex)) time.sleep(self.tick_rate) #self.master.after(self.tick_rate, self.tick) def process_messages(self, messages): try: smessages = [] for message in messages: self.logger.log("Processor received message: {0}".format(message)) if message["opcode"] == SM_STARTGAME.OP_CODE: msg = SM_STARTGAME(message["data"]) self.logger.log("Start game. Am {0}".format("white" if msg.is_white else "black")) self.is_white = msg.is_white self.create() elif message["opcode"] == SM_MOVEOK.OP_CODE: msg = SM_MOVEOK(message["data"]) self.logger.log("Source: {0}".format(msg.source)) self.logger.log("Target: {0}".format(msg.target)) source = self.get_button(msg.source) target = self.get_button(msg.target) self.logger.log("Source {0}: {1}".format(source.figure, source.figure.position)) self.logger.log("Target: {0}: {1}".format(target.figure, target.figure.position)) target_bg = target.cget("bg") source_bg = source.cget("bg") if self.move(target, source): source["bg"] = target_bg target["bg"] = source_bg print(self.board) self.logger.log("Source {0}: {1}".format(source.figure, source.figure.position)) self.logger.log("Target: {0}: {1}".format(target.figure, target.figure.position)) elif message["opcode"] == SM_MOVEERROR.OP_CODE: pass elif message["opcode"] == SM_TURN.OP_CODE: msg = SM_TURN(message["data"]) self.logger.log("White? {0}".format(self.is_white)) self.logger.log("Turn? {0}".format(msg.turn)) if msg.turn: self.setup(NORMAL) self.master.title("Your turn") else: self.setup(DISABLED) self.master.title("mchess - blacks turn" if self.is_white else "mchess - whites turn") elif message["opcode"] == SM_QUIT.OP_CODE: messagebox.showinfo(parent=self.master, title="Game over", message="Opponent forfeited!") self.disconnect() self.master.destroy() elif message["opcode"] == SM_ROUNDINFO.OP_CODE: msg = SM_ROUNDINFO(message["data"]) self.logger.log("Round: {0}".format(msg.description)) self.add_log(Log(msg.round, msg.description)) return smessages except Exception as ex: self.logger.log('process_messages exception: {0}'.format(ex)) traceback.print_tb(ex.__traceback__) def send_messages(self, messages): self.client.handler.write_queue.put(messages) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(b'1', ('127.0.0.1', self.client.udp_port))
class myApp: def __init__(self): self.root = Tk() style = ttk.Style() style.configure("Treeview.Heading", font=(None, 11), background="green") self.config = ST.Setting(self.root) self.SelDriver = SeleniumProcessor.SeleniumDriver(self.config) self.POMTreeView = TreeProcessor.POMTree(self.config) self.XML = XMLProcessor.XML() self.treeFrame = None self.tree = None self.treeValues = None self.ScreenCoverWindow = None self.root.title("POM Manager") self.root.geometry('700x600') #MENU SECTION : to create Menu # File Menu menu = Menu(self.root) self.root.config(menu=menu) filemenu = Menu(menu) menu.add_cascade(label="File", menu=filemenu) filemenu.add_command(label="Create New POM..", command=self.NewFile) filemenu.add_command(label="Open POM...", command=self.OpenFile) filemenu.add_command(label="Save POM...", command=self.SaveFile) filemenu.add_command(label="Save as POM...", command=self.SaveFileAs) filemenu.add_separator() filemenu.add_command(label="Exit", command=self.root.destroy) toolmenu = Menu(menu) menu.add_cascade(label="Tool", menu=toolmenu) toolmenu.add_command(label="Settings", command=self.Settings) helpmenu = Menu(menu) menu.add_cascade(label="Help", menu=helpmenu) helpmenu.add_command(label="About...", command=self.About) self.root.grid_columnconfigure(0, weight=1) self.root.grid_rowconfigure(1, weight=1) top = ttk.Frame(self.root, height=200) top.grid_columnconfigure(1, weight=1) top.grid(column=0, row=0, pady=10, sticky='nsew') bottom = ttk.Frame(self.root) bottom.grid(column=0, row=1, sticky='nsew') bottom.grid_columnconfigure(0, weight=1, uniform="group1") bottom.grid_columnconfigure(1, weight=1, uniform="group1") bottom.grid_rowconfigure(0, weight=1) footer = ttk.Frame(bottom, height=120) Label(top, text='Enter Base URL :').grid(column=0, row=0) self.txtURL = Entry(top) self.txtURL.grid(column=1, row=0, sticky='we') browserCombo = ttk.Combobox(top, values=['Chrome', 'IE', 'Edge', 'FireFox'], state='readonly') browserCombo.set('Chrome') browserCombo.grid(column=2, row=0, padx=5) self.Launchbtn = ttk.Button( top, text="Launch", command=lambda: self.SelDriver.LaunchBrowser( browserCombo.get(), self.txtURL.get())) self.Launchbtn.grid(column=1, row=1, pady=5) self.root.bind("<Control-s>", lambda event: self.XML.saveXML(self.POMTreeView)) self.AddNewObjectButton = ttk.Button( footer, text='Add New Object ', command=lambda: self.enable_mouseposition()) self.AddNewObjectButton.grid(column=0, row=1, padx=5, pady=20) self.ManuallyAddobject = ttk.Button( footer, text='Add Object Manually', command=lambda: self.addobjectPropertiesManually()) self.ManuallyAddobject.grid(column=2, row=1, padx=5, pady=20) self.savebutton = ttk.Button( footer, text='Save', command=lambda: self.XML.saveXML(self.tree, self.POMTreeView)) self.savebutton.grid(column=3, row=1, padx=5, pady=20) self.AddToPageButton = ttk.Button( footer, text='Add With Delay', command=lambda: self.getDelayCoordinates()) self.AddToPageButton.grid(column=1, row=1, padx=5, pady=20) self.CancelButton = ttk.Button(footer, text='Cancel', command=self.root.destroy) self.CancelButton.grid(column=4, row=1, padx=5, pady=20) self.treeFrame = Frame(bottom, borderwidth=1, relief="solid") self.treeValues = Frame(bottom, borderwidth=1, relief="solid") self.treeFrame.grid_rowconfigure(0, weight=1) self.treeFrame.grid_columnconfigure(0, weight=1) self.treeFrame.grid(row=0, column=0, sticky='nsew') self.treeValues.grid(row=0, column=1, sticky='nsew') bottom.grid_rowconfigure(0, weight=1) footer.grid(column=0, row=1, columnspan=2) mainloop() try: self.SelDriver.quit() except AttributeError: None def NewFile(self): files = [('ORFile', '*.xml.')] file = asksaveasfile(title="Select folder", filetypes=files, defaultextension=files) self.XML.filePath = file.name self.XML.fileName = ((file.name).split('/')[-1]).split('.')[0] self.createPOMTree('newfile') def OpenFile(self): filePath = filedialog.askopenfilename() if len(filePath) > 4: self.XML = XMLProcessor.XML(filePath) if self.tree != None: self.tree.destroy() self.createPOMTree() self.AddToPageButton['state'] = 'normal' def About(self): print('This is a simple example of a menu!') def SaveFile(self): self.XML.saveXML(self.tree, self.POMTreeView) def SaveFileAs(self): self.XML.saveXML(self.tree, self.POMTreeView, 'newfile') #======================================================================= # self.tree.heading('#0', text=self.XML.fileName) #======================================================================= def Settings(self): self.config.displaySettingPanel() def cancelAddObject(self, topWindow): topWindow.destroy() def getDelayCoordinates(self): try: self.root.iconify() top = Toplevel() top.geometry("+%d+%d" % (0, 0)) top.title("Counter") top.attributes('-alpha', 0.5) v = Tkinter.IntVar() ttk.Label(top, text="**hover mouse to the object you want to add", font=('Arial', 8)).pack() text = ttk.Label(top, textvariable=v) text.config(font=("Courier", 50)) text.pack() for i in range(5, -1, -1): v.set(i) text.update() time.sleep(1) top.destroy() self.SelDriver.set_webElement(PYAUTO.position()) self.createAttributePanel('delayadd') except AttributeError: messagebox.showinfo( 'Driver Not Initiated', 'Driver is not initiated.\nPlease make sure browser is Launched using tool.' ) def enable_mouseposition(self, actionType=None): try: driver = self.SelDriver.driver driver.switch_to.window( driver.window_handles[len(driver.window_handles) - 1]) self.root.after(100, self.get_WebObject(actionType)) except AttributeError: Tkinter.messagebox.showinfo( 'Driver Not Initiated', 'Driver is not initiated. \nPlease make sure browser is launched using tool.' ) def get_WebObject(self, actionType): self.ScreenCoverWindow = Toplevel() self.root.iconify() self.ScreenCoverWindow.attributes('-topmost', True) self.ScreenCoverWindow.title("Object Properties") self.ScreenCoverWindow.attributes('-alpha', 0.2) self.ScreenCoverWindow.attributes("-fullscreen", True) self.ScreenCoverWindow.focus_force() self.ScreenCoverWindow.bind( "<Button-1>", lambda event: self.createAttributePanel(actionType, event)) def createAttributePanel(self, actionType=None, event=None): if actionType != 'delayadd': self.SelDriver.set_webElement((event.x, event.y), self.ScreenCoverWindow) attributePanelWindow = Toplevel() attributePanelWindow.geometry("600x500") attributePanelWindow.attributes('-topmost', True) attributePanelWindow.title("Object Properties") attributePanelWindow.grid_columnconfigure(0, weight=1) attributePanelWindow.grid_rowconfigure(0, weight=1) top = ttk.Frame(attributePanelWindow) top.grid(column=0, row=0, sticky='nsew') top.grid_columnconfigure(0, weight=1, uniform="group1") top.grid_columnconfigure(1, weight=1, uniform="group1") top.grid_rowconfigure(0, weight=1) self.attributeTreeFrame = Frame(top, borderwidth=1, relief="solid") self.attributetreeValues = Frame(top, borderwidth=1, relief='solid') self.attributeTreeFrame.grid_rowconfigure(0, weight=1) self.attributeTreeFrame.grid_columnconfigure(0, weight=1) self.attributeTreeFrame.grid(row=0, column=0, sticky='nsew') self.attributetreeValues.grid(row=0, column=1, sticky="nsew") footer = ttk.Frame(top, height=120) footer.grid(column=0, row=1, columnspan=2) ttk.Button(footer, text='Cancel', command=attributePanelWindow.destroy).grid(column=2, row=1, padx=5, pady=10) ttk.Button(footer, text='Add Object', command=lambda: self.updatePOMTree( attributePanelWindow, self.ObjectPropertyTree.getObjectDict())).grid(column=1, row=1, padx=5, pady=10) self.createAttributeTree(self.SelDriver.attributeList, actionType) def createAttributeTree(self, attrsList, processType=None): self.attributeTree = ttk.Treeview(self.attributeTreeFrame) self.yscrollbar = Util.AutoScrollbar(self.attributeTreeFrame, orient='vertical', command=self.attributeTree.yview) self.attributeTree.configure(yscrollcommand=self.yscrollbar.set) self.attributeTree.grid(row=0, column=0, sticky='nsew') self.yscrollbar.grid(row=0, column=1, sticky='ns') self.ObjectPropertyTree = TreeProcessor.ObjectPropertyTree( self.attributeTree, attrsList, processtype=processType) self.attributeTree.bind( "<<TreeviewSelect>>", lambda event: self.displayProperties( self.attributetreeValues, self.ObjectPropertyTree.getObjectDict())) def displayProperties(self, attributes, newObjectTreeDict, actiontype=None): propertyNum = 0 for widget in attributes.winfo_children(): widget.destroy() currentItem = self.attributeTree.focus() currObject = newObjectTreeDict[currentItem] attributes.grid_columnconfigure(1, weight=1) ttk.Label(attributes, text='Display Name', justify='left').grid(column=0, row=0, padx=5, pady=1, sticky='w') DefaultVal = StringVar(attributes, value=currObject.DisplayName) Entry(attributes, textvariable=DefaultVal).grid(column=1, row=0, padx=5, pady=1, sticky='we', columnspan=1) for oProperty in currObject.propertyList: isPropSelected = oProperty.Selected isUsed = Tkinter.IntVar() propertyCheckButton = ttk.Checkbutton(attributes, text=oProperty.propertyName, variable=isUsed) propertyCheckButton.is_selected = isUsed propertyCheckButton.grid(column=0, row=propertyNum + 1, padx=5, pady=1, sticky='w') DefaultVal = StringVar(attributes, value=oProperty.Value) PropertyVal = Entry(attributes, textvariable=DefaultVal) PropertyVal.grid(column=1, row=propertyNum + 1, padx=5, pady=1, sticky='we', columnspan=2) if isPropSelected == '1' or isPropSelected == 1: propertyCheckButton.var = isUsed propertyCheckButton.var.set(1) else: propertyCheckButton.var = isUsed propertyCheckButton.var.set(0) propertyNum = propertyNum + 1 UpdateButton = ttk.Button(attributes, text='Update') UpdateButton.grid(column=1, row=propertyNum + 1, padx=10, pady=20, sticky='w') if actiontype == 'manual': AddChildButton = ttk.Button(attributes, text='Add child Object ') AddChildButton['command'] = lambda: self.AddChildToAttributeTree() AddChildButton.grid(column=0, row=propertyNum + 1, padx=10, pady=20, sticky='w') UpdateButton['command'] = lambda: self.UpdateProperties( self.scrollable_frame, currentItem) else: UpdateButton['command'] = lambda: self.UpdateProperties( self.attributetreeValues, currentItem) def UpdateProperties(self, treeVal, key): self.ObjectPropertyTree.updateObjectDict(treeVal, key) def updatePOMTree(self, propertyWindow, objDict, actionType=None): currItem = self.attributeTree.focus() objectToAdd = objDict[currItem] currObject = objectToAdd addToObject = '' objList = [currObject.ObjectID] if self.tree == None: self.createPOMTree() propertyWindow.attributes('-topmost', False) if self.tree.exists(currObject.ObjectID): messagebox.showinfo( 'Object Present with ID: =' + currObject.ObjectID, 'Object Present with ID: ' + currObject.ObjectID + '. \nPlease Change the Name or Update object Directly from Attribute Window' ) else: self.POMTreeView.treeDict[currObject.ObjectID] = currObject while currObject.ParentID != None and len(currObject.ParentID) > 0: if self.tree.exists(currObject.ParentID): addToObject = currObject.ParentID self.POMTreeView.treeDict[addToObject].childList.append( currObject) break else: currObject = objDict[currObject.ParentID] self.POMTreeView.treeDict[currObject.ObjectID] = currObject objList.insert(0, currObject.ObjectID) for childtree in objList: childObj = objDict[childtree] self.tree.insert(addToObject, 'end', iid=childObj.ObjectID, text=childObj.DisplayName) addToObject = childObj.ObjectID propertyWindow.destroy() Util.focusTree(self.tree, objectToAdd.ObjectID) print('Object to Focus :' + currObject.ObjectID) def AddChildToAttributeTree(self): for widget in self.scrollable_frame.winfo_children(): widget.destroy() self.addObjectIndentificationFields(self.attributeTree, self.scrollable_frame, 'child') def addobjectPropertiesManually(self): self.attributePanelWindow = Toplevel() self.attributePanelWindow.geometry("600x500") self.attributePanelWindow.attributes('-topmost', True) self.attributePanelWindow.title("Object Properties") self.attributePanelWindow.grid_columnconfigure(0, weight=1) self.attributePanelWindow.grid_rowconfigure(0, weight=1) top = ttk.Frame(self.attributePanelWindow) top.grid(column=0, row=0, sticky='nsew') top.grid_columnconfigure(0, weight=1, uniform="group1") top.grid_columnconfigure(1, weight=1, uniform="group1") top.grid_rowconfigure(0, weight=1) self.attributeTreeFrame = Frame(top, borderwidth=1, relief="solid") self.attributetreeValues = Frame(top, borderwidth=1, relief="solid") self.attributeTreeFrame.grid_rowconfigure(0, weight=1) self.attributeTreeFrame.grid_columnconfigure(0, weight=1) self.attributeTreeFrame.grid(row=0, column=0, sticky='nsew') self.attributetreeValues.grid_rowconfigure(0, weight=1) self.attributetreeValues.grid_columnconfigure(0, weight=1) self.attributetreeValues.grid(row=0, column=1, sticky='nsew') self.scrollable_frame = Util.ScrollableFrame(self.attributetreeValues, 'both') self.attributeTree = ttk.Treeview(self.attributeTreeFrame) self.attributeTree.grid(row=0, column=0, sticky="nsew") self.attributeTree.bind( "<<TreeviewSelect>>", lambda event: self.displayProperties( self.scrollable_frame, self.ObjectPropertyTree.getObjectDict(), 'manual')) footer = ttk.Frame(top, height=120) footer.grid(column=0, row=1, columnspan=2) ttk.Button(footer, text='Cancel', command=self.attributePanelWindow.destroy).grid(column=0, row=1, padx=5, pady=10) ttk.Button(footer, text='Add Object', command=lambda: self.updatePOMTree( self.attributePanelWindow, self.ObjectPropertyTree.getObjectDict())).grid(column=1, row=1, padx=5, pady=10) self.addObjectIndentificationFields(self.attributeTree, self.scrollable_frame) def addObjectIndentificationFields(self, objTree, Scrollableframe, objtype=None): objectTypeList = ['POM_Page'] if len( objTree.get_children()) == 0 else ['POM_frame', 'POM_Object'] ttk.Label(Scrollableframe, text='Object Type', justify='left').grid(column=0, row=0, padx=5, sticky='w') ObjectTypeCombo = ttk.Combobox(Scrollableframe, values=objectTypeList, state='readonly') ObjectTypeCombo.grid(column=1, row=0, sticky='we') ttk.Label(Scrollableframe, text='Display Name', justify="left").grid(column=0, row=1, padx=5, sticky='w') comboExample = ttk.Combobox(Scrollableframe, values=[]) comboExample.grid(column=1, row=1, sticky='we') ObjectTypeCombo.bind( "<<ComboboxSelected>>", lambda event: self.getObjectList( Scrollableframe, ObjectTypeCombo, comboExample)) self.addPropertywidget(Scrollableframe, 2, objtype) def getObjectList(self, Scrollableframe, ObjectTypeCombo, comboExample): listObjectName = [] if ObjectTypeCombo.get() == 'POM_Page': if self.tree != None: for child in self.tree.get_children(): listObjectName.append(child) comboExample['values'] = listObjectName def addPropertywidget(self, propertyWindow, addPropRow, objtype=None): ttk.Label(propertyWindow, text=' ', justify='left').grid(column=0, row=addPropRow, padx=5, sticky='w') ttk.Label(propertyWindow, text='Property Name:', justify='left').grid(column=0, row=addPropRow + 1, padx=5, sticky='w') PropertyType = Entry(propertyWindow) PropertyType.grid(column=1, row=addPropRow + 1, sticky='we') ttk.Label(propertyWindow, text='Property Value:', justify='left').grid(column=0, row=addPropRow + 2, padx=5, sticky='w') PropertyValue = Entry(propertyWindow) PropertyValue.grid(column=1, row=addPropRow + 2, sticky='we') AddPropButton = ttk.Button(propertyWindow, text='Add Property.. ') AddPropButton.grid(row=addPropRow + 3, column=0, padx=5, pady=5, sticky='e') AddPropButton['command'] = lambda: self.addAttribute( propertyWindow, addPropRow, objtype) buttonFrame = Frame(propertyWindow) buttonFrame.grid(column=0, row=addPropRow + 4, columnspan=2) if objtype == 'child': ttk.Button(buttonFrame, text='Add to Tree', command=lambda: self.AddManualobjectToTree( propertyWindow, objtype)).grid(column=0, row=0, padx=5, pady=20) else: ttk.Button(buttonFrame, text='Add to Tree', command=lambda: self.AddManualobjectToTree( propertyWindow)).grid(column=0, row=0, padx=5, pady=20) cancelbutton = ttk.Button( buttonFrame, text='Cancel ', command=lambda: self.refreshAddManualobjectPanel()) cancelbutton.grid(column=1, row=0, padx=5, pady=20) def refreshAddManualobjectPanel(self): for widget in self.scrollable_frame.winfo_children(): widget.destroy() if len(self.attributeTree.get_children()) > 0: currItem = self.attributeTree.focus() Util.focusTree(self.attributeTree, currItem) else: self.addObjectIndentificationFields(self.attributeTree, self.scrollable_frame) def addAttribute(self, propertyWindow, addProp, objtype=None): PropertyName = (propertyWindow.grid_slaves(addProp + 1, 1)[0]).get() PropertyVal = (propertyWindow.grid_slaves(addProp + 2, 1)[0]).get() v = Tkinter.IntVar() for i in range(addProp, addProp + 5): for w in propertyWindow.grid_slaves(row=i): w.grid_forget() c = Checkbutton(propertyWindow, text=PropertyName, variable=v) c.grid(column=0, row=addProp, padx=5, sticky='w') c.is_selected = v DefaultVal = StringVar(self.root, value=PropertyVal) Entry(propertyWindow, textvariable=DefaultVal).grid(column=1, row=addProp, sticky='we') self.addPropertywidget(propertyWindow, addProp + 1, objtype) def AddManualobjectToTree(self, treeManual, objtype=None): if (treeManual.grid_slaves( 0, 1)[0]).get() == '' or (treeManual.grid_slaves( 0, 1)[0]).get() == None or (treeManual.grid_slaves( 1, 1)[0]).get() == '' or (treeManual.grid_slaves( 1, 1)[0]).get() == None: messagebox.showinfo( 'Object Not Created', 'Please provide Object Name and at least one property to add object.' ) else: if objtype == 'child': currentItem = self.attributeTree.focus() currParentObj = self.ObjectPropertyTree.objectDict[currentItem] currObj = self.ObjectPropertyTree.createTreeObject( currParentObj)[1] else: self.ObjectPropertyTree = TreeProcessor.ObjectPropertyTree( self.attributeTree, treevals=treeManual) currObj = self.ObjectPropertyTree.createTreeObject()[1] Util.focusTree(self.attributeTree, currObj.ObjectID) def createPOMTree(self, processType=None): if self.tree != None: self.tree.destroy() self.tree = Util.scrollableTree(self.treeFrame, 'both') self.tree.heading('#0', anchor='w') self.tree.grid(row=0, column=0, sticky="nsew") if self.POMTreeView == None: print('IT IS NULL') self.POMTreeView.setTree(self.tree) if self.XML.filePath != None: self.POMTreeView.createTree(self.XML, self.tree, processType) self.tree.bind("<<TreeviewSelect>>", lambda event: self.displayObjectProperties(event)) def displayObjectProperties(self, currentItem=None): propertyNum = 1 for widget in self.treeValues.winfo_children(): widget.destroy() self.currentItem = self.tree.focus() self.POMTreeView.ORObject = self.currentItem currObject = self.POMTreeView.ORObject ttk.Label(self.treeValues, text='Display Name', justify='left').grid(column=0, row=0, padx=5, sticky='w') DefaultVal = StringVar(self.treeValues, value=currObject.DisplayName) Entry(self.treeValues, textvariable=DefaultVal, state='readonly').grid(column=1, row=0, sticky='we', columnspan=2) ttk.Label(self.treeValues, text='Object ID', justify='left').grid(column=0, row=propertyNum, padx=5, sticky='w') DefaultVal = StringVar(self.treeValues, value=currObject.ObjectID) Entry(self.treeValues, textvariable=DefaultVal, state='readonly').grid(column=1, row=propertyNum, sticky='we', columnspan=2) self.treeValues.grid_columnconfigure(1, weight=1) for oProperty in currObject.propertyList: isPropSelected = oProperty.Selected isUsed = Tkinter.IntVar() propertyCheckButton = ttk.Checkbutton(self.treeValues, text=oProperty.propertyName, variable=isUsed, state='disabled') propertyCheckButton.is_selected = isUsed propertyCheckButton.grid(column=0, row=propertyNum + 1, padx=5, sticky='w') DefaultVal = StringVar(self.treeValues, value=oProperty.Value) PropertyVal = Entry(self.treeValues, textvariable=DefaultVal, state='readonly') PropertyVal.grid(column=1, row=propertyNum + 1, sticky='we', columnspan=2) if isPropSelected == '1' or isPropSelected == 1: propertyCheckButton.var = isUsed propertyCheckButton.var.set(1) else: propertyCheckButton.var = isUsed propertyCheckButton.var.set(0) propertyNum = propertyNum + 1 EditButton = ttk.Button(self.treeValues, text=' Edit ') EditButton['command'] = lambda: self.editProperties( EditButton, propertyNum + 1) EditButton.grid(column=1, row=propertyNum + 1, padx=10, pady=20, sticky='w') def editProperties(self, EditButton, propertyNum): EditButton['text'] = 'Update' EditButton.grid(column=2) ttk.Button(self.treeValues, text='Add Custom Property', command=lambda: self.addCutomProperty()).grid( column=1, row=propertyNum, pady=20, sticky='w') for widget in self.treeValues.winfo_children(): widget['state'] = 'normal' self.treeValues.grid_slaves(1, 1)[0]['state'] = 'readonly' self.isPropertySaved = False EditButton['command'] = lambda: self.updateObjectProperty(EditButton) def addCutomProperty(self): addPropRow = 0 customAttributeWindow = Toplevel() customAttributeWindow.geometry("300x100") customAttributeWindow.attributes("-topmost", True) customAttributeWindow.title("Add Property") customAttributeWindow.grid_columnconfigure(1, weight=1) ttk.Label(customAttributeWindow, text='Property Name:', justify='left').grid(column=0, row=addPropRow, padx=5, pady=5, sticky='w') PropertyType = Entry(customAttributeWindow) PropertyType.grid(column=1, row=addPropRow, sticky='we') ttk.Label(customAttributeWindow, text='Property Value:', justify='left').grid(column=0, row=addPropRow + 1, padx=5, pady=5, sticky='w') PropertyValue = Entry(customAttributeWindow) PropertyValue.grid(column=1, row=addPropRow + 1, sticky='we') AddPropButton = ttk.Button(customAttributeWindow, text='Add Property') AddPropButton.grid(row=addPropRow + 2, column=1, padx=5, pady=10, sticky='w') currentItem = self.tree.focus() AddPropButton['command'] = lambda: self.POMTreeView.addProperty( self.tree, currentItem, customAttributeWindow) def updateObjectProperty(self, actionType=None): currObj = self.POMTreeView.updateObjectProperty( self.tree, self.treeValues, self.currentItem) self.currentItem = currObj.ObjectID Util.focusTree(self.tree, currObj.ObjectID) self.displayObjectProperties()
def start_job( ): # This is the progress window and everything that has to do with actually processing the file global download_link def close_encode(): confirm_exit = messagebox.askyesno( title='Prompt', message="Are you sure you want to stop progress?", parent=window) if confirm_exit: # If user selects 'Yes' to the above message prompt, destroy the window in question window.destroy() def close_window( ): # This thread is needed in order to close the window while the GUI is processing a file thread = threading.Thread(target=close_encode) thread.start() window = Toplevel(main) # Programs download window window.title( extracted_title_name ) # Takes extracted_title_name and adds it as the windows title window.configure(background='#434547') encode_label = Label(window, text='- ' * 22 + 'Progress ' + '- ' * 22, font=('Times New Roman', 14), background='#434547', foreground='white') encode_label.grid(column=0, columnspan=2, row=0) window.grid_columnconfigure(0, weight=1) window.grid_rowconfigure(0, weight=1) window.grid_rowconfigure(1, weight=1) window.protocol('WM_DELETE_WINDOW', close_window) window.geometry('600x140') encode_window_progress = Text(window, height=2, relief=SUNKEN, bd=3) encode_window_progress.grid(row=1, column=0, columnspan=2, pady=(10, 6), padx=10, sticky=E + W) encode_window_progress.insert(END, '') app_progress_bar = ttk.Progressbar(window, orient=HORIZONTAL, mode='determinate') app_progress_bar.grid(row=2, columnspan=2, pady=(10, 10), padx=15, sticky=E + W) def my_hook( d ): # This updates the progress bar with the correct percentage if d['status'] == 'downloading': p = d['_percent_str'] p = p.replace('%', '') app_progress_bar['value'] = float(p) class MyLogger: # ytb-dl logger, allows the program to get all the needed info from the program global download_info_string def debug(self, msg): # For compatability with youtube-dl, both debug and info are passed into debug # You can distinguish them by the prefix '[debug] ' if msg.startswith('[debug] '): pass else: self.info(msg) def info(self, msg): encode_window_progress.delete('1.0', END) encode_window_progress.insert(END, msg) def warning(self, msg): pass def error(self, msg): pass if video_only.get( ) == 'on': # If "Best Video..." is selected then use these options for ytb-dl ydl_opts = { 'ratelimit': download_rate_choices[download_rate.get()], 'progress_hooks': [my_hook], 'noplaylist': True, 'overwrites': True, 'merge_output_format': 'mkv', 'final_ext': 'mkv', 'outtmpl': str(pathlib.Path(VideoOutput)) + '/%(title)s.%(ext)s', 'ffmpeg_location': str(pathlib.Path(ffmpeg)), 'logger': MyLogger(), "progress_with_newline": True, 'format': video_menu_options_choices[video_menu_options.get()], 'prefer_ffmpeg': True } if video_only.get() != 'on' and audio_menu_options.get( ) == 'Extract Only': # If "Best Video..." is NOT selected and "Audio Menu" is set to Extract Only ydl_opts = { 'ratelimit': download_rate_choices[download_rate.get()], 'progress_hooks': [my_hook], 'noplaylist': True, 'overwrites': True, 'outtmpl': str(pathlib.Path(VideoOutput)) + '/%(title)s.%(ext)s', 'ffmpeg_location': str(pathlib.Path(ffmpeg)), 'logger': MyLogger(), "progress_with_newline": True, 'format': 'bestaudio/best', 'extractaudio': True, 'prefer_ffmpeg': True } if video_only.get() != 'on' and audio_menu_options.get( ) != 'Extract Only': # If "Best Video..." is NOT selected and "Audio Menu" is set to encode to another codec ydl_opts = { 'ratelimit': download_rate_choices[download_rate.get()], 'progress_hooks': [my_hook], 'noplaylist': True, 'overwrites': True, 'outtmpl': str(pathlib.Path(VideoOutput)) + '/%(title)s.%(ext)s', 'ffmpeg_location': str(pathlib.Path(ffmpeg)), 'logger': MyLogger(), "progress_with_newline": True, 'format': 'bestaudio/best', 'extractaudio': True, 'prefer_ffmpeg': True, 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': audio_menu_options_choices[audio_menu_options.get()], 'preferredquality': '0' }] } with yt_dlp.YoutubeDL( ydl_opts ) as ydl: # Block of code needed to process the link/file ydl.download([download_link]) window.destroy( ) # Once the job is complete this destroys the download/processing window
def askFilename(self): currdir = os.getcwd() filey = None filey = filedialog.askopenfilename(parent=self.master, initialdir=currdir, title='Select burn file') if type(filey) == str and filey != '': self.entryVar.set(filey) try: if not (str(self.entryVar.get()).split(".")[1] == "xls" or str(self.entryVar.get()).split(".")[1] == "XLS" or str(self.entryVar.get()).split(".")[1] == "xlsx" or str(self.entryVar.get()).split(".")[1] == "XLSX"): posx = 500 posy = 400 sizex = 500 sizey = 100 top = Toplevel() top.title("Wrong file type") top.grid_rowconfigure(0,weigh=1) top.grid_columnconfigure(0, weight=1) top.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) msg = Message(top, text="You selected a wrong file type.\nPlease use xls or xlsx.", width=300, anchor=CENTER) msg.grid(row=0, column=0) button = Button(top,text="Ok", command=top.destroy) button.grid(row=1, column=0) self.entryVar.set("") self.current_window = top if self.runningInFrozen: top.iconbitmap(sys._MEIPASS+r"/emblem_print.ico") else: top.iconbitmap("emblem_print.ico") top.focus_force() top.bind("<FocusOut>", self.Alarm) return None except: posx = 500 posy = 400 sizex = 500 sizey = 100 top = Toplevel() top.title("Wrong file type") top.grid_rowconfigure(0,weigh=1) top.grid_columnconfigure(0, weight=1) top.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) msg = Message(top, text="You selected a wrong file type.\nPlease use xls or xlsx.", width=300, anchor=CENTER) msg.grid(row=0, column=0) button = Button(top,text="Ok", command=top.destroy) button.grid(row=1, column=0) self.entryVar.set("") top.focus_force() if self.runningInFrozen: top.iconbitmap(sys._MEIPASS+r"/emblem_print.ico") else: top.iconbitmap("emblem_print.ico") self.current_window = top top.bind("<FocusOut>", self.Alarm) return None else: return None temp = readExcel(str(self.entryVar.get())) orderedExcelInfo = sortPartNumberList(temp[0],temp[1]) temp = findPDFs(orderedExcelInfo) #The xlsx library is not reading the data correctly. #for dictx in orderedExcelInfo: # print (dictx) self.PDFs = temp [0] self.unfoundItems = temp[1] self.wrongRevsion = temp[2] #Populate the text fields self.text_found_files_body.configure(state=NORMAL) self.text_unfound_files_body.configure(state=NORMAL) self.text_revision_body.configure(state=NORMAL) self.text_found_files_body.delete('0.0', END) self.text_unfound_files_body.delete('0.0', END) self.text_revision_body.delete('0.0', END) counter = 1 for pdf in self.PDFs: self.text_found_files_body.insert(str(counter)+'.0',str(counter)+". "+pdf.replace("\"","")+"\n") counter += 1 #print (counter) self.totalFiles = counter counter = 1 for part in self.unfoundItems: self.text_unfound_files_body.insert(str(counter)+'.0', str(counter)+". "+part.replace("\"","")+"\n") counter += 1 counter = 1 for part in self.wrongRevsion: self.text_revision_body.insert(str(counter)+'.0',str(counter)+". "+part.replace("\"","")+"\n") counter += 1 self.text_found_files_body.configure(state=DISABLED) self.text_unfound_files_body.configure(state=DISABLED) self.text_revision_body.configure(state=DISABLED)
class ProcMemPlot: def __init__(self, hostname=None): self.peak_mem = 0 self.total_mem = 1024 self.free_mem = self.total_mem self.pause_plot = 0 self.hostname = hostname # members for GUI self.window_plot = None self.combo_period = None self.label_period = None self.combo_period_seconds = [] self.figure_hist = None self.plot_axe_hist = None self.y_ax = None self.canvas_hist = None self.frame_toolbar = None self.toolbar_plot = None self.button_plot_pause = None # members for plot data. self.time_hist = {} self.mem_hist = {} def plot_metrics(self): if (not (self.window_plot is not None and \ tk.Toplevel.winfo_exists(self.window_plot))) or \ self.time_hist.get('rss_total') is None or self.pause_plot == 1: return period_selection = self.combo_period.current() period_secodns_sel = self.combo_period_seconds[period_selection] last_N = period_secodns_sel // DEFAULT_REFRESH_INTERVAL self.plot_axe_hist.clear() y_hist_dict = { 'time': self.time_hist['rss_total'][-last_N:], 'mem': self.mem_hist['rss_total'][-last_N:] } y_hist_df = DataFrame(y_hist_dict, columns=['time', 'mem']) y_hist_df.plot(kind='line', legend=True, x='time', y='mem', ax=self.plot_axe_hist, color='r', marker='.', fontsize=10) self.plot_axe_hist.set_ylabel('Memory(GB)') self.plot_axe_hist.set_title('Memory (GB) History - max=' + str(self.peak_mem) + \ ' free=' + str(self.free_mem)) self.plot_axe_hist.set_ylim([0, self.total_mem]) self.canvas_hist.draw() def toggle_pause_plot(self): if self.pause_plot == 0: self.pause_plot = 1 self.button_plot_pause['text'] = 'Resume' else: self.pause_plot = 0 self.button_plot_pause['text'] = 'Pause' def show_plot_window(self, root_window): if self.window_plot is not None and tk.Toplevel.winfo_exists( self.window_plot): return self.window_plot = Toplevel(root_window) self.window_plot.geometry('1200x600+20+500') self.window_plot.title(PROGRAM_NAME + ' ' + VERSION + ' - plot - ' + self.hostname) self.window_plot.grid_columnconfigure(1, weight=1) cur_grid_row = 0 self.label_period = ttk.Label(self.window_plot, text="Period", width=LABEL_WIDTH, anchor='w') self.label_period.grid(row=cur_grid_row, column=0, sticky='w', padx=10, pady=10) self.combo_period = ttk.Combobox(self.window_plot, width=COMBO_WIDTH) self.combo_period['values'] = [ 'Last 1 hour', 'Last 4 hours', 'Last 8 hours', 'Last 24 hours', 'All history' ] self.combo_period_seconds = [ 3600, 3600 * 4, 3600 * 8, 3600 * 24, 3600 * 10000 ] self.combo_period.grid(row=cur_grid_row, column=1, sticky='w', pady=10) self.combo_period.current(0) cur_grid_row = cur_grid_row + 1 # plot row self.figure_hist = plt.Figure(figsize=(10, 5), dpi=FIGURE_DPI) self.plot_axe_hist = self.figure_hist.add_subplot(111) self.canvas_hist = FigureCanvasTkAgg(self.figure_hist, self.window_plot) self.canvas_hist.get_tk_widget().grid(row=cur_grid_row, column=0, columnspan=2, sticky='nsew') self.window_plot.grid_rowconfigure(cur_grid_row, weight=1) cur_grid_row = cur_grid_row + 1 # Plot navigation toolbar self.frame_toolbar = tk.Frame(self.window_plot) self.frame_toolbar.grid(row=cur_grid_row, column=0, columnspan=2) self.toolbar_plot = NavigationToolbar2Tk(self.canvas_hist, self.frame_toolbar) cur_grid_row = cur_grid_row + 1 # command buttons self.button_plot_pause = ttk.Button(self.window_plot, text="Pause", command=self.toggle_pause_plot) self.button_plot_pause.grid(row=cur_grid_row, column=0, columnspan=2, pady=10) cur_grid_row = cur_grid_row + 1 def update_history(self, mem_usages): if self.time_hist.get('rss_total') is None: self.time_hist['rss_total'] = [] self.mem_hist['rss_total'] = [] cur_time = datetime.datetime.now().strftime("%m/%d %H:%M:%S") self.time_hist['rss_total'].append(cur_time) self.mem_hist['rss_total'].append(mem_usages['rss_total']['rss']) if mem_usages['rss_total']['rss'] > self.peak_mem: self.peak_mem = mem_usages['rss_total']['rss'] print('INFO: @{} peak memory={} total memory={}'.format( cur_time, self.peak_mem, self.total_mem)) # update free memeory command = ['free', '-g'] p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) free_out = p.stdout.read().decode('utf-8') mem_line = free_out.strip().split('\n')[1] self.free_mem = int(mem_line.split()[6])
def show_streams_mediainfo_function(x): # Stream Viewer global stream_win_text_area, exit_stream_window, stream_window video_input = pathlib.Path(x) # "x" is passed through from main GUI # Defines the path to config.ini and opens it for reading/writing config_file = 'Runtime/config.ini' # Creates (if it doesn't exist) and defines location of config.ini config = ConfigParser() config.read(config_file) detect_font = font.nametofont("TkDefaultFont") # Get default font value into Font object set_font = detect_font.actual().get("family") # set_font_size = detect_font.actual().get("size") try: stream_win_text_area.config(state=NORMAL) stream_win_text_area.delete(1.0, END) except (NameError, TclError): stream_window = Toplevel() stream_window.title("Audio Streams") stream_window.configure(background="#434547") stream_window.resizable(False, False) # Disable resize of this window if config['save_window_locations']['audio window - view streams - position'] != '' and \ config['save_window_locations']['audio window - view streams'] == 'yes': stream_window.geometry(config['save_window_locations']['audio window - view streams - position']) stream_window.protocol('WM_DELETE_WINDOW', exit_stream_window) stream_window.grid_columnconfigure(0, weight=1) stream_window.grid_rowconfigure(0, weight=1) stream_window_frame = LabelFrame(stream_window, text=' Audio Streams ', labelanchor="n") stream_window_frame.grid(column=0, row=0, columnspan=1, padx=5, pady=(0, 3), sticky=N + S + E + W) stream_window_frame.configure(fg="#3498db", bg="#434547", bd=3, font=(set_font, 10, "bold")) stream_window_frame.grid_rowconfigure(0, weight=1) stream_window_frame.grid_columnconfigure(0, weight=1) stream_win_text_area = scrolledtext.ScrolledText(stream_window_frame, width=80, height=25, tabs=10, spacing2=3, spacing1=2, spacing3=3) stream_win_text_area.config(bg='black', fg='#CFD2D1', bd=8) stream_win_text_area.grid(column=0, pady=5, padx=5, sticky=N + E + S + W) character_space = 30 # Can be changed to adjust space of all items in the list automatically media_info = MediaInfo.parse(video_input) # Uses pymediainfo to get information for track selection for track in media_info.tracks: # For loop to loop through mediainfo tracks # Formatting -------------------------------------------------------------------------------------------------- if track.track_type == 'Audio': # Only grab audio track information if str(track.stream_identifier) != 'None': # Gets stream # audio_track_id_space = 'Track#' + ' ' * int(f'{character_space - len("Track#")}') audio_track_id = audio_track_id_space + f': {str(int(track.stream_identifier) + 1)}\n' else: audio_track_id = '' if str(track.format) != 'None': # Gets format string of tracks (aac, ac3 etc...) audio_format_space = 'Codec' + ' ' * int(f'{character_space - len("Codec")}') audio_format = audio_format_space + f": {str(track.commercial_name)} - ({str(track.format).lower()})\n" else: audio_format = '' if str(track.channel_s) != 'None': # Gets audio channels of input tracks audio_channel_space = 'Channels' + ' ' * int(f'{character_space - len("Channels")}') if str(track.channel_s) == '8': show_channels = '7.1' elif str(track.channel_s) == '6': show_channels = '5.1' elif str(track.channel_s) == '3': show_channels = '2.1' else: show_channels = str(track.channel_s) audio_channels = audio_channel_space + f": {show_channels} - {str(track.channel_layout)}\n" else: audio_channels = '' if str(track.bit_rate_mode) != 'None': # Gets audio bit rate mode audio_bitrate_mode_space = 'Bit rate mode' + ' ' * int(f'{character_space - len("Bit rate mode")}') if str(track.other_bit_rate_mode) != 'None': # Get secondary string of audio bit rate mode audio_bitrate_mode = audio_bitrate_mode_space + f": {str(track.bit_rate_mode)} / " \ f"{str(track.other_bit_rate_mode[0])}\n" else: audio_bitrate_mode = audio_bitrate_mode_space + f": {str(track.bit_rate_mode)}\n" else: audio_bitrate_mode = '' if str(track.other_bit_rate) != 'None': # Gets audio bit rate of input tracks audio_bitrate_space = 'Bit rate' + ' ' * int(f'{character_space - len("Bit rate")}') audio_bitrate = audio_bitrate_space + f": {str(track.other_bit_rate[0])}\n" else: audio_bitrate = '' if str(track.other_language) != 'None': # Gets audio language of input tracks audio_language_space = 'Language' + ' ' * int(f'{character_space - len("Language")}') audio_language = audio_language_space + f": {str(track.other_language[0])}\n" else: audio_language = '' if str(track.title) != 'None': # Gets audio title of input tracks audio_title_space = 'Title' + ' ' * int(f'{character_space - len("Title")}') if len(str(track.title)) > 40: # Counts title character length audio_title = audio_title_space + f": {str(track.title)[:40]}...\n" # If title > 40 characters else: audio_title = audio_title_space + f": {str(track.title)}\n" # If title is < 40 characters else: audio_title = '' if str(track.other_sampling_rate) != 'None': # Gets audio sampling rate of input tracks audio_sampling_rate_space = 'Sampling Rate' + ' ' * int(f'{character_space - len("Sampling Rate")}') audio_sampling_rate = audio_sampling_rate_space + f": {str(track.other_sampling_rate[0])}\n" else: audio_sampling_rate = '' if str(track.other_duration) != 'None': # Gets audio duration of input tracks audio_duration_space = 'Duration' + ' ' * int(f'{character_space - len("Duration")}') audio_duration = audio_duration_space + f": {str(track.other_duration[0])}\n" else: audio_duration = '' if str(track.delay) != 'None': # Gets audio delay of input tracks if str(track.delay) == '0': audio_delay = '' else: audio_delay_space = 'Delay' + ' ' * int(f'{character_space - len("Delay")}') audio_del_to_vid_space = 'Delay to Video' + ' ' * int(f'{character_space - len("Delay to Video")}') audio_delay = audio_delay_space + f': {str(track.delay)}ms\n' \ + audio_del_to_vid_space + f': {str(track.delay_relative_to_video)}ms\n ' else: audio_delay = '' if str(track.other_stream_size) != 'None': # Get tracks stream size audio_track_size_space = 'Stream size' + ' ' * int(f'{character_space - len("Stream size")}') audio_track_stream_size = audio_track_size_space + f": {str(track.other_stream_size[4])}\n" else: audio_track_stream_size = '' if str(track.other_bit_depth) != 'None': # Get tracks bit-depth audio_track_b_depth_space = 'Bit Depth' + ' ' * int(f'{character_space - len("Bit Depth")}') audio_track_bit_depth = audio_track_b_depth_space + f": {(track.other_bit_depth[0])}\n" else: audio_track_bit_depth = '' if str(track.compression_mode) != 'None': audio_track_compression_space = 'Compression' + ' ' * int(f'{character_space - len("Compression")}') audio_track_compression = audio_track_compression_space + f": {str(track.compression_mode)}\n" else: audio_track_compression = '' if str(track.default) != 'None': # Get tracks default boolean audio_track_default_space = 'Default' + ' ' * int(f'{character_space - len("Default")}') audio_track_default = audio_track_default_space + f": {str(track.default)}\n" else: audio_track_default = '' if str(track.forced) != 'None': # Get tracks forced boolean audio_track_forced_space = 'Forced' + ' ' * int(f'{character_space - len("Forced")}') audio_track_forced = audio_track_forced_space + f": {str(track.forced)}" else: audio_track_forced = '' # ---------------------------------------------------------------------------------------------- Formatting audio_track_info = str(audio_track_id + audio_format + audio_channels + audio_bitrate_mode + audio_bitrate + audio_sampling_rate + audio_delay + audio_duration + audio_language + audio_title + audio_track_stream_size + audio_track_bit_depth + audio_track_compression + audio_track_default + audio_track_forced) # Formatting media_info_track_string = 80 * '#' + '\n' + audio_track_info + '\n' + 80 * '#' + '\n' # String to insert stream_win_text_area.configure(state=NORMAL) # Enable textbox stream_win_text_area.insert(INSERT, media_info_track_string) # Insert string stream_win_text_area.insert(INSERT, '\n') # Insert a newline stream_win_text_area.configure(state=DISABLED) # Disable textbox def right_click_menu_func(x_y_pos): # Function for mouse button 3 (right click) to pop up menu right_click_menu.tk_popup(x_y_pos.x_root, x_y_pos.y_root) # This gets the position of cursor def copy_selected_text(): # Function to copy only selected text pya_hotkey('ctrl', 'c') time_sleep(.01) # Slow program incase ctrl+c is slower right_click_menu = Menu(stream_window, tearoff=False) # This is the right click menu right_click_menu.add_command(label='Copy Selected Text', command=copy_selected_text) right_click_menu.add_command(label='Copy All Text', command=pyperclip_copy(stream_win_text_area.get(1.0, END))) stream_window.bind('<Button-3>', right_click_menu_func) # Uses mouse button 3 (right click) to pop up menu Hovertip(stream_win_text_area, 'Right click to copy', hover_delay=1200) # Hover tip tool-tip