I was running a basic hex2dec converter, and wanted to transform this from console to GUI.
Now the program works fine in console, but after my conversion to GUI, it seems to throw out the int() can't convert non-string with explicit base error.
Here is the GUI code
from tkinter import *
root = Tk()
root.geometry("400x400+250+250")
root.title("Hex Converter")
heading = Label(root, text="Simple Hex to Decimal Converter", font=('arial 15 bold'), fg="steelblue").pack()
entr_hex_val = Label(root, text="Enter Hex Value to Convert", font=('arial 13 bold')).place(x=10, y=50)
my_num = IntVar()
ent_box = Entry(root, width=50, textvariable=my_num).place(x=10, y=90)
def converter():
hexdec = my_num.get()
dec = int(hexdec, 16)
lab = Label(root, text=("decimal value = "+ str(dec)), font=('arial 25 bold'), fg="red").place(x=10, y=200)
conv = Button(root, text="Convert", width=12, height=2, bg="lightgreen", command=converter).place(x=10, y=130)
root.mainloop()
and the console code
import os
def hexconverter:
os.system('cls')
hexdec = input("Enter number in Hexadecimal Format: ")
dec = int(hexdec, 16)
print(str(dec))
hexconverter()
I'm struggling to see why the same code works in console but not in the GUI.
The hex number needs to be a string, and you are defining my_num
as an integer. Changing my_num = IntVar()
to my_num = StringVar()
should fix it.
When you use .get()
on IntVar
it returns an integer and int conversion with specified base works on strings as stated in your error message.
You can convert the value to string before using it.
dec = int(str(hexdec), 16)
But since you are using hex values, your entry might get characters A-F and IntVar
would throw an error if it sees any non-integer value while using .get()
so it will be easier for you to use StringVar
and using try-except
for catching errors on conversion.
Another point is, your code will re-create labels on each click and lab
will always have the value None
. Recreating might lead some memory issues (OK, maybe not in this little one but still it is worth noting). Instead of creating label everytime, you can create it once in global scope then just change its value when needed.
my_num = StringVar()
lab = Label(root, text="", font='arial 25 bold', fg="red")
lab.place(x=10, y=200) #also notice seperated the place line to avoid NoneType error
def converter():
hexdec = my_num.get()
try:
dec = int(hexdec, 16)
lab["text"] = "decimal value = "+ str(dec)
except ValueError:
lab["text"] = "Error, please enter valid hex value"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With