Tkinter Entry 小部件看到空字符串,因此无法转换为浮点数

Tkinter Entry widget sees empty string, cannot convert to float because of it

我正在尝试制作一个 Density/Volume/Mass 计算器。当我在 Entry 小部件中输入值并单击按钮时,我收到一条 ValueError: could not convert string to float: '' 消息。我错过了什么?为什么它看不到输入的值?奇怪的是,我最初只制作了密度计算器部分,而且效果很好。现在没有了。

import tkinter as tk
from tkinter import ttk


def density_calculator():

    def density():
        vol = float(vol_value.get())
        mas = float(mass_value.get())
        dens = mas / vol
        calculated_density = ttk.Label(root, text=f"{dens}", font=("Helvetica", 20))
        calculated_density.place(x=280, y=290)

    density_w = tk.Tk()
    density_w.title("Density Calculator")
    density_w.geometry("600x400")
    density_w.resizable(False, False)
    vol_value = tk.StringVar()
    mass_value = tk.StringVar()
    volume = ttk.Label(density_w, text="Volume (cm^3)", relief="ridge", font=("Helvetica", 20))
    mass = ttk.Label(density_w, text="Mass (g)", relief="ridge", font=("Helvetica", 20))
    density_label = ttk.Label(density_w, text="Density (g/cm3)", relief="ridge", font=("Helvetica", 20))
    volume_entry = ttk.Entry(density_w, textvariable=vol_value)
    mass_entry = ttk.Entry(density_w, textvariable=mass_value)


    volume.place(x=65, y=50)
    mass.place(x=405, y=50)
    density_label.place(x=200, y=250)
    volume_entry.place(x=100, y=100)
    mass_entry.place(x=400, y=100)

    done_button = ttk.Button(density_w, text="Calculate", command=density)
    done_button.place(x=480, y=350)
    density_w.mainloop()


def volume_calculator():


    def volume():
        vol = float(dens_value.get())
        mas = float(mass_value.get())
        dens = mas / vol
        calculated_density = ttk.Label(root, text=f"{dens}", font=("Helvetica", 20))
        calculated_density.place(x=280, y=290)

    volume_w = tk.Tk()
    volume_w.title("Volume Calculator")
    volume_w.geometry("600x400")
    volume_w.resizable(False, False)
    dens_value = tk.StringVar()
    mass_value = tk.StringVar()
    density = ttk.Label(volume_w, text="Density (g/cm^3)", relief="ridge", font=("Helvetica", 20))
    mass = ttk.Label(volume_w, text="Mass (g)", relief="ridge", font=("Helvetica", 20))
    volume_label = ttk.Label(volume_w, text="Volume (cm3)", relief="ridge", font=("Helvetica", 20))
    density_entry = ttk.Entry(volume_w, textvariable=dens_value)
    mass_entry = ttk.Entry(volume_w, textvariable=mass_value)

    density.place(x=65, y=50)
    mass.place(x=405, y=50)
    volume_label.place(x=200, y=250)
    density_entry.place(x=100, y=100)
    mass_entry.place(x=400, y=100)

    done_button = ttk.Button(volume_w, text="Calculate", command=volume)
    done_button.place(x=480, y=350)
    volume_w.mainloop()


root = tk.Tk()
root.title("Density, Volume, Mass Calculator")
root.geometry("200x100")
root.resizable(False, False)


density_choice = ttk.Radiobutton(root, text="Calculate Density", command=density_calculator)
volume_choice = ttk.Radiobutton(root, text="Calculate Volume", command=volume_calculator)
mass_choice = ttk.Radiobutton(root, text="Calculate Density")
density_choice.place(x=0, y=0)
volume_choice.place(x=0, y=20)

root.mainloop()

更改以下两项后,您的代码现在可以正常工作了

  • 取值时用入口变量替换StringVar变量
  • 在标签创建中使用实际的 window 名称来显示结果

最终代码如下

import tkinter as tk
from tkinter import ttk


def density_calculator():

    def density():
        vol = float(volume_entry.get())
        mas = float(mass_entry.get())
        dens = round(mas / vol, 2)
        calculated_density = ttk.Label(density_w, text=f"{dens}", font=("Helvetica", 20))
        calculated_density.place(x=280, y=290)

    density_w = tk.Tk()
    density_w.title("Density Calculator")
    density_w.geometry("600x400")
    density_w.resizable(False, False)
    vol_value = tk.StringVar()
    mass_value = tk.StringVar()
    volume = ttk.Label(density_w, text="Volume (cm^3)", relief="ridge", font=("Helvetica", 20))
    mass = ttk.Label(density_w, text="Mass (g)", relief="ridge", font=("Helvetica", 20))
    density_label = ttk.Label(density_w, text="Density (g/cm3)", relief="ridge", font=("Helvetica", 20))
    volume_entry = ttk.Entry(density_w, textvariable=vol_value)
    mass_entry = ttk.Entry(density_w, textvariable=mass_value)


    volume.place(x=65, y=50)
    mass.place(x=405, y=50)
    density_label.place(x=200, y=250)
    volume_entry.place(x=100, y=100)
    mass_entry.place(x=400, y=100)

    done_button = ttk.Button(density_w, text="Calculate", command=density)
    done_button.place(x=480, y=350)
    density_w.mainloop()


def volume_calculator():


    def volume():
        vol = float(density_entry.get())
        mas = float(mass_entry.get())
        dens = round(mas / vol, 2)
        calculated_density = ttk.Label(volume_w, text=f"{dens}", font=("Helvetica", 20))
        calculated_density.place(x=280, y=290)

    volume_w = tk.Tk()
    volume_w.title("Volume Calculator")
    volume_w.geometry("600x400")
    volume_w.resizable(False, False)
    dens_value = tk.StringVar()
    mass_value = tk.StringVar()
    density = ttk.Label(volume_w, text="Density (g/cm^3)", relief="ridge", font=("Helvetica", 20))
    mass = ttk.Label(volume_w, text="Mass (g)", relief="ridge", font=("Helvetica", 20))
    volume_label = ttk.Label(volume_w, text="Volume (cm3)", relief="ridge", font=("Helvetica", 20))
    density_entry = ttk.Entry(volume_w, textvariable=dens_value)
    mass_entry = ttk.Entry(volume_w, textvariable=mass_value)

    density.place(x=65, y=50)
    mass.place(x=405, y=50)
    volume_label.place(x=200, y=250)
    density_entry.place(x=100, y=100)
    mass_entry.place(x=400, y=100)

    done_button = ttk.Button(volume_w, text="Calculate", command=volume)
    done_button.place(x=480, y=350)
    volume_w.mainloop()


root = tk.Tk()
root.title("Density, Volume, Mass Calculator")
root.geometry("200x100")
root.resizable(False, False)


density_choice = ttk.Radiobutton(root, text="Calculate Density", command=density_calculator)
volume_choice = ttk.Radiobutton(root, text="Calculate Volume", command=volume_calculator)
mass_choice = ttk.Radiobutton(root, text="Calculate Density")
density_choice.place(x=0, y=0)
volume_choice.place(x=0, y=20)

root.mainloop()

输出如下