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

如何让Tkinter单位转换程序的按钮正确输出转换结果?

修复你的Tkinter单位转换程序

以下是修复后的完整代码,已经解决了点击按钮无结果输出的问题:

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Unit Converter")
root.geometry("800x500")

# 修复变量覆盖问题:将Entry和IntVar分开,用textvariable绑定
var1 = IntVar()
entry_num = Entry(width=30, textvariable=var1)
entry_num.pack()
entry_num.place(x=300, y=21)

lbl = Label(root, text="Write Number Here: ")
lbl.pack()
lbl.place(x=180, y=20)

list1 = ["Choose Unit", "Kilogram", "Pounds", "Ounces", "Celsius", "Fahrenheit", "Kelvin", "Kilometers", "Miles", "Yards"]
kg_conversion = ["Pounds", "Ounces"]
pound_conversions = ["Kilogram", "Ounces"]
ounces_conversions = ["Kilogram", "Pounds"]

cel_conversions = ["Fahrenheit", "Kelvin"]
far_conversions = ["Celsius", "Kelvin"]
kel_conversions = ["Celsius", "Kelvin"]

km_conversions = ["Miles", "Yards"]
mile_conversions = ["Kilometers", "Yards"]
yard_conversions = ["Kilometers", "Miles"]

def pick_unit(e):
    if drop1.get() == "Kilogram":
        drop2.config(value=kg_conversion)
    elif drop1.get() == "Pounds":
        drop2.config(value=pound_conversions)
    elif drop1.get() == "Ounces":
        drop2.config(value=ounces_conversions)
    elif drop1.get() == "Kilometers":
        drop2.config(value=km_conversions)
    elif drop1.get() == "Miles":
        drop2.config(value=mile_conversions)
    elif drop1.get() == "Yards":
        drop2.config(value=yard_conversions)
    elif drop1.get() == "Celsius":
        drop2.config(value=cel_conversions)
    elif drop1.get() == "Fahrenheit":
        drop2.config(value=far_conversions)
    elif drop1.get() == "Kelvin":
        drop2.config(value=kel_conversions)

drop1 = ttk.Combobox(root, value=list1)
drop1.current(0)
drop1.pack()
drop1.place(x=20, y=19)

drop1.bind("<<ComboboxSelected>>", pick_unit)

drop2 = ttk.Combobox(root, values=[" "])
drop2.current(0)
drop2.pack()
drop2.place(x=20, y=50)

# 温度转换函数
def cel_to_far():
    return float(var1.get()) * 1.8 + 32

def cel_to_kel():
    return float(var1.get()) + 273.15

def far_to_cel():
    return (float(var1.get()) - 32) * 0.5556

def far_to_kel():
    return (float(var1.get()) + 459.67) * 0.5556

def kel_to_cel():
    return float(var1.get()) - 273.15

def kel_to_far():
    return 1.8 * (float(var1.get()) - 273.15) + 32

# 长度转换函数
def km_to_mile():
    return float(var1.get()) * 0.62137119

def km_to_yard():
    return float(var1.get()) * 1093.613298

def mile_to_km():
    return float(var1.get()) * 1.609

def mile_to_yard():
    return float(var1.get()) * 1760

def yard_to_km():
    return float(var1.get()) * 0.0009144

def yard_to_mile():
    return float(var1.get()) / 1760

# 重量转换函数(修复缺少return的问题)
def kg_to_pounds():
    return float(var1.get()) * 2.2

def kg_to_ounces():
    return float(var1.get()) * 35.274

def pounds_to_kg():
    return float(var1.get()) / 2.2

def pounds_to_ounces():
    return float(var1.get()) * 16

def ounces_to_kg():
    return float(var1.get()) * 0.028349523

def ounces_to_pounds():
    return float(var1.get()) * 0.0625

# 提前创建结果标签,避免重复创建
result_label = Label(root, text="")
result_label.pack()
result_label.place(x=300, y=100)

def converting():
    result = None
    # 获取下拉框选中值(修复直接比较对象的错误)
    from_unit = drop1.get()
    to_unit = drop2.get()

    # 重量转换逻辑
    if from_unit == "Kilogram" and to_unit == "Pounds":
        result = kg_to_pounds()
    elif from_unit == "Kilogram" and to_unit == "Ounces":
        result = kg_to_ounces()
    elif from_unit == "Pounds" and to_unit == "Kilogram":
        result = pounds_to_kg()
    elif from_unit == "Pounds" and to_unit == "Ounces":
        result = pounds_to_ounces()
    elif from_unit == "Ounces" and to_unit == "Kilogram":
        result = ounces_to_kg()
    elif from_unit == "Ounces" and to_unit == "Pounds":
        result = ounces_to_pounds()
    # 长度转换逻辑
    elif from_unit == "Kilometers" and to_unit == "Miles":
        result = km_to_mile()
    elif from_unit == "Kilometers" and to_unit == "Yards":
        result = km_to_yard()
    elif from_unit == "Miles" and to_unit == "Kilometers":
        result = mile_to_km()
    elif from_unit == "Miles" and to_unit == "Yards":
        result = mile_to_yard()
    elif from_unit == "Yards" and to_unit == "Kilometers":
        result = yard_to_km()
    elif from_unit == "Yards" and to_unit == "Miles":
        result = yard_to_mile()
    # 温度转换逻辑
    elif from_unit == "Celsius" and to_unit == "Fahrenheit":
        result = cel_to_far()
    elif from_unit == "Celsius" and to_unit == "Kelvin":
        result = cel_to_kel()
    elif from_unit == "Fahrenheit" and to_unit == "Celsius":
        result = far_to_cel()
    elif from_unit == "Fahrenheit" and to_unit == "Kelvin":
        result = far_to_kel()
    elif from_unit == "Kelvin" and to_unit == "Celsius":
        result = kel_to_cel()
    elif from_unit == "Kelvin" and to_unit == "Fahrenheit":
        result = kel_to_far()

    # 更新结果标签文本
    if result is not None:
        result_label.config(text=f"转换结果: {round(result, 4)} {to_unit}")
    else:
        result_label.config(text="请选择有效的单位组合")

mybutton = Button(root, text="Convert", command=converting)
mybutton.pack()
mybutton.place(x=200, y=100)

root.mainloop()

关键问题修复说明

  1. 变量覆盖:原代码中var1先被赋值为Entry对象,随后又被重定义为IntVar,导致无法获取输入值。修复后将Entry和IntVar分开,用textvariable绑定关联。
  2. 下拉框值获取错误:原代码直接用Combobox对象和字符串比较,改为用.get()方法获取选中的文本内容。
  3. 转换结果未传递:原代码调用转换函数后未保存结果,修复后将转换结果赋值给result变量,再更新到标签中。
  4. 重复创建标签:提前创建结果标签,点击按钮时仅更新标签的文本属性,避免界面堆积冗余组件。
  5. 缺少return语句:部分转换函数(如kg_to_ounces)未返回计算结果,添加return后才能获取转换值。
  6. 无效初始化代码:删除了程序启动时无效的下拉框判断逻辑,这部分代码在初始化阶段无法获取用户选中值,完全不起作用。

内容的提问来源于stack exchange,提问作者Zenel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:15:59