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的情况下才会报错=].
我整天都在努力解决这个荒谬的问题,但没有成功;在这个论坛中有很多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的情况下才会报错=].