如何让Python Tkinter进制转换程序正确显示并更新结果
Tkinter进制转换程序的结果显示问题修复
问题描述
我正在学习Python,编写了一个基于Tkinter的进制转换程序,目前存在以下问题:
- 点击“Konwertuj”按钮时,无法将转换结果显示在指定的Label或Entry组件中
- 再次点击按钮时,新结果也无法覆盖旧结果
该程序尚未完成,解决此核心功能问题后,剩余代码编写难度不大。当前代码如下:
import tkinter as tk from tkinter import ttk class tkinterApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) windowWidth = 300 windowHeight = 200 offsetLeft = int( (self.winfo_screenwidth() - windowWidth) / 2 ) offsetTop = int( (self.winfo_screenheight() - windowHeight) / 2 ) self.geometry('{}x{}+{}+{}'.format(windowWidth, windowHeight, offsetLeft, offsetTop)) self.title('Konwerter systemów liczbowych') self.minsize(300, 200) container = tk.Frame(self, relief="ridge", width=300, height=200) container.pack(expand = False) container.grid_rowconfigure(0, weight = 1) container.grid_columnconfigure(0, weight = 1) self.frames = {} for F in (StartPage, Decy, decBin): frame = F(container, self) self.frames[F] = frame frame.grid(row = 0, column = 0, sticky="nsew") self.show_frame(StartPage) def show_frame(self, cont): frame = self.frames[cont] frame.tkraise() class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = ttk.Label(self, text ="Wybierz system do którego należy Twoja liczba.") label.grid() button1 = ttk.Button(self, text ="Decymalny", command = lambda : controller.show_frame(Decy)) button1.grid(padx = 5, pady = 5) button2 = ttk.Button(self, text ="Binarny", command = lambda : controller.show_frame(Binar)) button2.grid(padx = 5, pady = 5) button3 = ttk.Button(self, text ="Oktalny", command = lambda : controller.show_frame(Oktal)) button3.grid(padx = 5, pady = 5) button4 = ttk.Button(self, text ="Heksadecymalny", command = lambda : controller.show_frame(Heksal)) button4.grid(padx = 5, pady = 5) class Decy(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = ttk.Label(self, text ="Wybierz system na jaki chcesz przekowertować") label.grid() label = ttk.Label(self, text ="swoją liczbę.") label.grid() button1 = ttk.Button(self, text ="Binarny", command = lambda : controller.show_frame(decBin)) button1.grid(padx = 5, pady = 5) button2 = ttk.Button(self, text ="Oktalny", command = lambda : controller.show_frame(decOkt)) button2.grid(padx = 5, pady = 5) button2 = ttk.Button(self, text ="Heksadecymalny", command = lambda : controller.show_frame(decHex)) button2.grid(padx = 5, pady = 5) button2 = ttk.Button(self, text ="Powrót", command = lambda : controller.show_frame(StartPage)) button2.grid(padx = 5, pady = 5) class decBin(tk.Frame): def clearText(self): self.entry1.confing(text='') def oblicz(): dec = wpis.get() dec = int(dec) i = 0 bnum = [] while dec!=0: rem = dec%2 bnum.insert(i, rem) i = i+1 dec = int(dec/2) i = i-1 def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = ttk.Label(self, text ="Wprowadź liczbę i zatwierdź.") label.grid() wpis = ttk.Entry(self) wpis.grid() button1 = ttk.Button(self, text="Konwertuj", command = oblicz) button1.grid(padx = 10, pady = 10) button2 = ttk.Button(self, text ="Powrót", command = lambda : controller.show_frame(StartPage)) button2.grid(padx = 10, pady = 10) app = tkinterApp() app.mainloop()
问题分析
现有代码存在几个关键问题导致结果无法显示:
oblicz方法未绑定类实例(缺少self参数),无法访问类内组件,且未处理转换后的结果- 未创建用于显示结果的Label/Entry组件
- 输入框
wpis未保存为类属性,方法无法获取输入值 clearText方法中存在拼写错误:confing应为config
修复后的代码
import tkinter as tk from tkinter import ttk class tkinterApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) windowWidth = 300 windowHeight = 250 # 调整高度容纳结果组件 offsetLeft = int((self.winfo_screenwidth() - windowWidth) / 2) offsetTop = int((self.winfo_screenheight() - windowHeight) / 2) self.geometry('{}x{}+{}+{}'.format(windowWidth, windowHeight, offsetLeft, offsetTop)) self.title('Konwerter systemów liczbowych') self.minsize(300, 250) container = tk.Frame(self, relief="ridge", width=300, height=250) container.pack(expand=False) container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) self.frames = {} # 仅初始化已定义的类,未定义的类引用暂时注释避免报错 for F in (StartPage, Decy, decBin): frame = F(container, self) self.frames[F] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame(StartPage) def show_frame(self, cont): frame = self.frames[cont] frame.tkraise() class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = ttk.Label(self, text="Wybierz system do którego należy Twoja liczba.") label.grid(pady=(20, 10)) button1 = ttk.Button(self, text="Decymalny", command=lambda: controller.show_frame(Decy)) button1.grid(padx=5, pady=5) # Binar、Oktal、Heksal类未定义,暂时注释命令 button2 = ttk.Button(self, text="Binarny") # command=lambda: controller.show_frame(Binar)) button2.grid(padx=5, pady=5) button3 = ttk.Button(self, text="Oktalny") # command=lambda: controller.show_frame(Oktal)) button3.grid(padx=5, pady=5) button4 = ttk.Button(self, text="Heksadecymalny") # command=lambda: controller.show_frame(Heksal)) button4.grid(padx=5, pady=5) class Decy(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = ttk.Label(self, text="Wybierz system na jaki chcesz przekowertować") label.grid(pady=(20, 0)) label = ttk.Label(self, text="swoją liczbę.") label.grid(pady=(0, 10)) button1 = ttk.Button(self, text="Binarny", command=lambda: controller.show_frame(decBin)) button1.grid(padx=5, pady=5) # decOkt、decHex类未定义,暂时注释命令 button2 = ttk.Button(self, text="Oktalny") # command=lambda: controller.show_frame(decOkt)) button2.grid(padx=5, pady=5) button3 = ttk.Button(self, text="Heksadecymalny") # command=lambda: controller.show_frame(decHex)) button3.grid(padx=5, pady=5) button4 = ttk.Button(self, text="Powrót", command=lambda: controller.show_frame(StartPage)) button4.grid(padx=5, pady=15) class decBin(tk.Frame): def clearText(self): # 修复拼写错误,清空输入和结果框 self.result_entry.config(state=tk.NORMAL) self.result_entry.delete(0, tk.END) self.result_entry.config(state=tk.DISABLED) self.wpis.delete(0, tk.END) def oblicz(self): try: # 获取输入并转换为整数 dec = int(self.wpis.get()) # 使用内置函数转二进制,去掉前缀'0b' binary_result = bin(dec)[2:] # 更新结果框内容,先清空旧值再插入新结果 self.result_entry.config(state=tk.NORMAL) self.result_entry.delete(0, tk.END) self.result_entry.insert(0, binary_result) self.result_entry.config(state=tk.DISABLED) except ValueError: # 处理非法输入 self.result_entry.config(state=tk.NORMAL) self.result_entry.delete(0, tk.END) self.result_entry.insert(0, "输入无效!") self.result_entry.config(state=tk.DISABLED) def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = ttk.Label(self, text="Wprowadź liczbę i zatwierdź.") label.grid(pady=(20, 10)) # 将输入框保存为类属性,方便方法访问 self.wpis = ttk.Entry(self) self.wpis.grid(pady=(0, 10)) # 按钮布局容器,优化排版 button_frame = tk.Frame(self) button_frame.grid(pady=(0, 10)) button1 = ttk.Button(button_frame, text="Konwertuj", command=self.oblicz) button1.grid(row=0, column=0, padx=5) button_clear = ttk.Button(button_frame, text="Wyczyść", command=self.clearText) button_clear.grid(row=0, column=1, padx=5) button2 = ttk.Button(self, text="Powrót", command=lambda: controller.show_frame(StartPage)) button2.grid(pady=(0, 10)) # 添加结果显示组件,设置为只读避免用户修改 result_label = ttk.Label(self, text="Wynik:") result_label.grid() self.result_entry = ttk.Entry(self, state=tk.DISABLED) self.result_entry.grid(pady=(0, 10)) app = tkinterApp() app.mainloop()
修复说明
- 将
oblicz改为类实例方法(添加self参数),使其可访问类内的输入框和结果组件 - 新增只读的
result_entry组件用于显示转换结果,点击按钮时会自动清空旧内容并插入新结果 - 将输入框
wpis保存为类属性,确保方法能获取用户输入值 - 简化进制转换逻辑,使用Python内置
bin()函数替代手动循环,提升代码简洁性和可靠性 - 修复
clearText方法的拼写错误,并添加清空输入和结果的功能 - 增加输入合法性校验,处理非整数输入的异常情况,避免程序崩溃
- 调整窗口高度和组件间距,优化界面布局
- 注释原代码中未定义的类引用,避免运行时报错
内容的提问来源于stack exchange,提问作者Nova
相关产品推荐
相关产品推荐

