from tkinter import *
class NumberTransfer:
def __init__(self):
self.frame = Tk()
self.frame.title('进制转换工具')
self.frame.geometry('705x500+400+50')
self.frame.resizable(0, 0)
self.frame['bg'] = 'lightgray'
# 在窗体里放一个图片
self.banner_image = PhotoImage(file='./image/number.png')
self.banner_top = Label(self.frame, image=self.banner_image)
self.banner_top.place(x=0, y=0)
# 选择进制
self.label_select = Label(self.frame, text='请选择要输入的进制:', bg='lightgray', font=('宋体', 14, 'bold'))
self.label_select.place(x=10, y=150)
self.var_number = IntVar() # 定义一个变量,四个单选按钮绑定这同一个变量
self.radio_bin = Radiobutton(self.frame, text='二进制', bg='lightgray', font=('宋体', 14, 'bold'), variable=self.var_number, value=2)
self.radio_bin.place(x=210, y=150)
self.radio_oct = Radiobutton(self.frame, text='八进制', bg='lightgray', font=('宋体', 14, 'bold'), variable=self.var_number, value=8)
self.radio_oct.place(x=300, y=150)
self.radio_dec = Radiobutton(self.frame, text='十进制', bg='lightgray', font=('宋体', 14, 'bold'), variable=self.var_number, value=10)
self.radio_dec.place(x=390, y=150)
self.radio_hex = Radiobutton(self.frame, text='十六进制', bg='lightgray', font=('宋体', 14, 'bold'), variable=self.var_number, value=16)
self.radio_hex.place(x=480, y=150)
# 输入区域
self.label_input = Label(self.frame, text='请输入具体的数值:', bg='lightgray', font=('宋体', 14, 'bold'))
self.label_input.place(x=29, y=190)
self.var_input = StringVar() # 定义一个变量,和输入文本框进行绑定
self.entry_input = Entry(self.frame, font=('宋体', 14, 'bold'), width=32, textvariable=self.var_input)
self.entry_input.place(x=215, y=190)
self.button_input = Button(self.frame, text='计算', font=('宋体', 13, 'bold'), width=8, command=self.get_number)
self.button_input.place(x=590, y=187)
# 显示结果
self.label_result = Label(self.frame, text='结果:', bg='lightgray', fg='red', font=('宋体', 14, 'bold'))
self.label_result.place(x=150, y=230)
self.label_bin = Label(self.frame, text='二进制:', bg='lightgray', fg='blue', font=('宋体', 14, 'bold'))
self.label_bin.place(x=230, y=230)
self.label_bin_result = Label(self.frame, text='二进制输出的结果', bg='lightgray', fg='green', font=('宋体', 14, 'bold'))
self.label_bin_result.place(x=330, y=230)
self.label_oct = Label(self.frame, text='八进制:', bg='lightgray', fg='blue', font=('宋体', 14, 'bold'))
self.label_oct.place(x=230, y=260)
self.label_oct_result = Label(self.frame, text='八进制输出的结果', bg='lightgray', fg='green', font=('宋体', 14, 'bold'))
self.label_oct_result.place(x=330, y=260)
self.label_dec = Label(self.frame, text='十进制:', bg='lightgray', fg='blue', font=('宋体', 14, 'bold'))
self.label_dec.place(x=230, y=290)
self.label_dec_result = Label(self.frame, text='十进制输出的结果', bg='lightgray', fg='green', font=('宋体', 14, 'bold'))
self.label_dec_result.place(x=330, y=290)
self.label_hex = Label(self.frame, text='十六进制:', bg='lightgray', fg='blue', font=('宋体', 14, 'bold'))
self.label_hex.place(x=210, y=320)
self.label_hex_result = Label(self.frame, text='十六进制输出结果', bg='lightgray', fg='green', font=('宋体', 14, 'bold'))
self.label_hex_result.place(x=330, y=320)
def show(self):
self.frame.mainloop()
# 把十进制转化为二进制、八进制、十进制、十六进制
def transfer_number(self, number: int):
number_list = []
number_list.append(bin(number))
number_list.append(oct(number))
number_list.append(number)
number_list.append(hex(number))
return number_list
# 不管选择什么类型,先转换为十进制数
def get_type_ten_number(self, type_number: int, number: str):
if type_number == 2:
return int(number, 2)
if type_number == 8:
return int(number, 8)
if type_number == 10:
return int(number)
if type_number == 16:
return int(number, 16)
def get_number(self):
input_number = self.var_input.get() # 输入的数据
type_number = self.var_number.get() # 选择的进制类型
ten_number = self.get_type_ten_number(type_number, input_number)
number_list = self.transfer_number(ten_number)
self.label_bin_result['text'] = number_list[0]
self.label_oct_result['text'] = number_list[1]
self.label_dec_result['text'] = number_list[2]
self.label_hex_result['text'] = number_list[3]
if __name__ == '__main__':
this_gui = NumberTransfer()
this_gui.show()