You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:01:13