from tkinter import * class Calculator: def __init__(self, master): print("test") master.title("Random Generator") master.geometry("420x210") #Top Frame self.random_ch = '' self.entered_number = 0 first_frame = Frame(root, bg='gainsboro', width=450, height=50, pady=3) first_frame.grid(row=0, sticky="ew") self.gen_btn = Button(first_frame, text="Generate", width="8", anchor="w", command=lambda: self.update("add")) self.gen_btn.grid(row=2, column=1) self.input_reset_btn = Button(first_frame, text="Reset", width="6", anchor="w", command=lambda: self.update("reset")) self.input_reset_btn.grid(row=2, column=2) vcmd = (master.register(self.on_validate)) self.input_box = Entry(first_frame, validate="key", width=3, validatecommand=(vcmd, "%P")) self.input_box.grid(row=1, column=1) self.input_length = Label(first_frame, text="Enter a number", bg='gainsboro') self.input_length.grid(row=1, column=0) #Second Frame second_frame = Frame(root, width=450, height=50, pady=3) second_frame.grid(row=1, sticky="ew") self.text_display = Text(second_frame, height=1, width=30) self.text_display.grid(row=3, column=0) #Third Frame third_frame = Frame(root, width=450, bg='gainsboro', height=50, pady=3) third_frame.grid(row=2, sticky="ew") self.quit_btn = Button(third_frame, text="Quit", width="8", command=lambda root=root:quit(root)) self.quit_btn.grid(row=1, column=2) self.copy_btn = Button(third_frame, text="Copy", width="8", command=lambda root=root:self.copy_to_clipboard()) self.copy_btn.grid(row=1, column=3) def on_validate(self, new_text): if not new_text: self.entered_number = 0 try: self.entered_number = int(new_text) return True except ValueError: return False def update(self, method): import random import string if method == "add": self.text_display.delete('1.0', END) self.random_ch = ''.join([random.choice(string.ascii_letters + string.digits + string.punctuation)\ for n in range(self.entered_number)]) elif method == "reset": self.random_ch = '' self.text_display.delete('1.0', END) self.input_box.delete(0, END) else: self.random_ch = '' self.text_display.insert(END, self.random_ch) def copy_to_clipboard(self): root.clipboard_clear() text = self.random_ch root.clipboard_append(text) if __name__ == "__main__": root = Tk() my_gui = Calculator(root) root.mainloop()