class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master.title("Trivium") self.size(480, 260) self.bring_to_front() self.focus() self.create_interface() def create_interface(self): self.create_form() self.create_footer() def create_form(self): self.form = Form(self.master) self.form.pack(fill=tk.BOTH, expand=True, pady=10) def create_footer(self): self.footer = tk.Frame(bd=1, relief=tk.SUNKEN) self.runbtn = tk.Button(self.footer, text="Ejecutar", state=tk.ACTIVE, command=self.run_event_handler, takefocus=0) self.master.bind("<Return>", self.run_event_handler) self.master.bind("<KP_Enter>", self.run_event_handler) self.runbtn.pack(side="right", padx=10, pady=10) self.aboutbtn = tk.Button(self.footer, text="Acerca de", command=self.about_event_handler, takefocus=0) self.aboutbtn.pack(side="left", padx=10, pady=10) self.footer.pack(side="bottom", fill="x", expand=False) def run_event_handler(self, event=None): e = self.form.submit() if not e: return bits = int(e["output-bits"]) if e["output-bits"] else 0 header, message = None, Path( e["input-file"]).read_bytes() if e["input-file"].strip() else None if message and BMProc.is_bmp(e["input-file"]): header, message = BMProc.extract_header(message) trivium = Trivium(e["key"], e["iv"]) if message and bits and bits > len(message) * 8: bits = None cipher = trivium.process(message, bits) if header: message = header + message cipher = header + cipher written = Path(e["output-file"]).write_bytes(cipher) if not bits and message is not None and len(message) != len( cipher) or bits and ceil(bits / 8) != len(cipher): showerror( "Error", "Ocurrió un problema al procesar el archivo de entrada.") elif written != len(cipher): showerror( "Error", "Ocurrió un problema al intentar escribir el archivo de salida." ) else: showinfo("Éxito", "El archivo se procesó correctamente.") def about_event_handler(self, event=None): AboutDialog(self.master) def size(self, width, height): self.master.minsize(width, height) x = (self.master.winfo_screenwidth() - width) // 2 y = (self.master.winfo_screenheight() - height) // 2 self.master.geometry("{}x{}+{}+{}".format(width, height, x, y)) def bring_to_front(self): self.master.lift() self.master.attributes('-topmost', True) self.master.after_idle(self.master.attributes, '-topmost', False) def focus(self): if platform() == 'Darwin': system( '''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''' ) else: self.master.focus_force()