Tkinter ValueError: could not convert string to float: ''

Tkinter ValueError: could not convert string to float: ''

我整天都在努力解决这个荒谬的问题,但没有成功;在这个论坛中有很多material,但通常它们都是大量的代码,我无法理解发生了什么。在互联网上,他们通常建议转换,但它不起作用。为了让事情变得简单,我写了一个示例代码来说明我在更大的代码中遇到的问题

import tkinter as tk
from tkinter import *
#from tkinter import ttk

my_window = tk.Tk()

my_label = tk.Label(master=my_window,text="N")
my_label.pack()

my_entry = tk.Entry(master=my_window)
my_entry.pack()
N = my_entry.get()

print(float(N))

my_window.mainloop()

很好很简单,但我收到以下消息

ValueError: could not convert string to float: ''

我尝试了很多可能性,但都奏效了。非常感谢任何小建议。谢谢

编辑:

我想了解如何将float(N)赋值给一个全局变量,比如说a,这样我以后在代码中使用它,我就拿了@Cool Cloud的代码并稍作修改

import tkinter as tk
from tkinter import *

my_window = tk.Tk()

a=1. 

def cast():
    N = my_entry.get()
    try: # Try to execute this
        print(float(N))
        a=float(N)
    except ValueError: # If ValueError(meaning it is not a float) is triggered then print...
        print('Not a number!')

my_label = tk.Label(master=my_window,text="N")
my_label.pack()

my_entry = tk.Entry(master=my_window)
my_entry.pack()
# N = my_entry.get() N will be empty as my_entry is empty when code is executed

Button(my_window,text='Click me to convert to 
float',command=cast).pack() # A button to trigger event

print(a)

my_window.mainloop()

其输出如下图

正如您所看到的,它直接打印 1.0 而无需等待赋值 a=float(N),所以我的疑问是我如何实际执行此赋值,以便稍后在我的代码中使用它。谢谢

P.S.: 我知道 cast() 定义中的 print(a) 在这种情况下会正确给出 123.0,但我的问题更笼统:我'我试图了解如何输入 N 值,使其浮动并将其“传播”到程序的其余部分。我的怀疑是 print(a) 几乎在程序的最后一行,并且仍然不等待 cast() 进来。

发件人:https://www.geeksforgeeks.org/python-tkinter-entry-widget/

"get() : Returns 条目的当前文本作为字符串。"

我认为您不能只将字符串转换为浮点数。

GUI 编程是事件驱动的,这意味着您必须根据触发的事件进行编码。 Every python代码从上到下运行,在这种情况下从上到下的所有代码,外部函数,都被执行。这意味着一旦:

my_entry = tk.Entry(master=my_window)
my_entry.pack()

...被执行,下一行要执行的是N = my_entry.get(),并且在执行时,入口小部件内没有任何内容,因此N变为空字符串,然后您正在尝试将该空字符串转换为浮点数,这显然会出错。

你应该做的是,制作一个按钮,当你点击它时(事件被触发)并将它连接到一个函数,该函数将获取输入并转换为浮点数。因此,当您单击该按钮时,您已经在条目中输入了一些内容,现在它不再是空的。

import tkinter as tk
from tkinter import *

my_window = tk.Tk()

def cast():
    N = my_entry.get()
    try: # Try to execute this
        print(float(N))
    except ValueError: # If ValueError(meaning it is not a float) is triggered then print...
        print('Not a number!')

my_label = tk.Label(master=my_window,text="N")
my_label.pack()

my_entry = tk.Entry(master=my_window)
my_entry.pack()
# N = my_entry.get() N will be empty as my_entry is empty when code is executed

Button(my_window,text='Click me to convert to float',command=cast).pack() # A button to trigger event

my_window.mainloop()

另一种方式,也是一种不受欢迎的方式,是使用 DoubleVar(),这将为您 get() 文本,在这种情况下,您的输入将接受任何值,但是当您 get() 来自 DoubleVar() 的值如果不是浮点数,它将引发 TclError

def cast():
    # Unlike before, error will be generated at get() and you dont need float()
    # because if there is no error then it is guaranteed to be a float anyway
    try:
        N = var.get()
        print(N)
    except TclError: # If TclError is triggered then print...
        print('Not a number!')
    
var = DoubleVar() # tkinter control variable
my_entry = tk.Entry(master=my_window,textvariable=var)
my_entry.pack()

注意:你可以做my_entry.get(),即使输入不是浮点数也不会报错,只有在[=21的情况下才会报错=].