from tkinter import * from tkinter.ttk import * class Window(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.master = master root = Tk() app = Window(root) def add_base(): out = [] for x in baseDropdown['values']: out.append(int(x)) try: if not int(baseInput.get()) in out: out.append(int(baseInput.get())) baseDropdown['values'] = sorted(out) functionTrigger(0,0,0) # Trigger number conversion if a base is added except ValueError: print("Not a valid base!") lbl1 = Label(root, text="\nInvalid base!", font=("Arial", 12)) lbl1.grid(column=1, row=0) def functionTrigger(a,b,c): # Positional arguments from the trace are not needed for this program, but still must be defined input = numberInput.get() base = int(baseDropdown['values'][baseDropdown.current()]) # Retreive the current selected base baseConverter(input, base) def baseConverter(userInput, numberBase): try: decimalNum = int(userInput,numberBase) # First attempt to get the number in decimal. except: print("bad base") return outputText = "" for base in baseDropdown['values']: # Iterate through all bases outputText += "Base " + base + ": " outputNumber = "" tempNum = decimalNum while tempNum > 0: digit = int(tempNum % int(base)) tempNum = int(tempNum / int(base)) if digit < 10: # Can be represented with 0-9 outputNumber += str(digit) else: # Alphanumeric characters needed outputNumber += chr(55 + digit) # ASCII character offset for capital letters outputNumber = outputNumber[::-1] outputText += outputNumber + "\n" lblOut = Label(root, text=outputText, font=("Arial", 12)) lblOut.grid(column=0, row=7) root.wm_title("Numerical converter") lbl0 = Label(root, text="Add a base:", font=("Arial", 12)) lbl0.grid(column=0, row=1) lbl1 = Label(root, text="\n", font=("Arial", 12)) lbl1.grid(column=1, row=0) addBaseBtn = Button(root, text="Add", command=add_base) addBaseBtn.grid(column=2, row=1) baseInput = Entry(root,width=10, state='enabled') baseInput.grid(column = 1, row = 1) lbl2 = Label(root, text="", font=("Arial", 12)) lbl2.grid(column=0, row=3) separator1 = Separator(root, orient='horizontal') separator1.place(relx=0, rely=0.2, relwidth=1, relheight=1) separator2 = Separator(root, orient='horizontal') separator2.place(relx=0, rely=0.43, relwidth=1, relheight=1) baseDropdown = Combobox(root) baseDropdown['values']= (2, 10, 16) baseDropdown.current(1) #set the selected item baseDropdown.grid(column=1, row=4) lbl3 = Label(root, text="\nNumber Base \n of the input:\n", font=("Arial", 12)) lbl3.grid(column=0, row=4) userInputRaw = StringVar() userInputRaw.trace_add("write", functionTrigger) numberInput = Entry(root,width=10, state='enabled', textvariable=userInputRaw) numberInput.grid(column=1, row = 6) lbl4 = Label(root, text="Number to convert:", font=("Arial", 12)) lbl4.grid(column=0, row=6) lbl5 = Label(root, text="", font=("Arial", 12)) lbl5.grid(column=50, row=5) lblOut = Label(root, text="rtedgh", font=("Arial", 12)) lblOut.grid(column=0, row=7) root.resizable(False, False) root.geometry('600x400') root.mainloop()