How to recognize float variable? getting ValueError: could not convert string to float:

How to recognize float variable? getting ValueError: could not convert string to float:

我正在尝试为我在 Python 中编写的信号分析模拟创建一个 GUI。为此,我使用 AppJar。但是,当我调用生成信号的函数时,我得到了标题中的 ValueError。

我已经阅读了 Whosebug 上的每一个 ValueError post(我可能错过了一个,但我尽力了)并且所有这些都是关于额外的间距,无法解析为浮点数等 None 似乎适用于此。

基本上,我使用这段代码调用一个函数来生成我的信号:

signal_axes = app.addPlot("signal", *logic.signal(5, 2), 0, 0, 1)

以及函数本身的相关部分(在导入的文件logic.py中)

def signal(electrodes, length):
   velocity = math.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
   frequency = velocity / length

这不是整个函数,变量都已声明,未使用的变量稍后在函数中使用。

错误特别指向带有"frequency = velocity / length"的行,告诉我:

TypeError: unsupported operand type(s) for /: 'float' and 'str'

当我尝试使用 "float(length)" 修复它时,出现错误:

ValueError: could not convert string to float: 

在 StackExchange 的一个答案中,有人建议使用 .strip() 来去除不可见的空间。所以我尝试使用:

length.strip()

但这给了我以下错误:

AttributeError: 'float' object has no attribute 'strip'

我在这里慢慢陷入疯狂。顺便说一下,下面的代码 stand-alone 有效:

import numpy as np

kinetic_energy = 9000
mass = 40
length = 2e-2

velocity = np.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
frequency = float(velocity) / float(length)

print(frequency)

谁能看出哪里出了问题?我在下面包含了所有相关代码,这不是我的完整文件,但仅此一项就应该至少提供一个输出。

run.py

import logic
from appjar import gui

def generate(btn):
    app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), app.getEntry("length")))
    showSignalLabels()

def showSignalLabels():
    signal_axes.set_xlabel("time (us)")
    signal_axes.set_ylabel("amplitude (uV)")
    app.refreshPlot("signal")

app = gui()

signal_axes = app.addPlot("signal", *logic.signal(5, 0.02), 0, 0, 1)


app.addLabelEntry("electrodes", 1, 0, 1)
app.addLabelEntry("length", 2, 0, 1)

showSignalLabels()

app.addButton("Generate", generate)
app.go()

logic.py

import numpy as np
import math
import colorednoise as cn


steps = 5000
amplitude = 1
offset_code = 0
kinetic_energy = 9000
mass = 40
centered = 1


def signal(electrodes, length):
    velocity = math.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
    frequency = velocity / length
    time = 2 * (electrodes / frequency)

    --- irrelevant code ---

    return OutputTime, OutputSignal

编辑:这里是完整的回溯。

Exception in Tkinter callback
Traceback (most recent call last):
  File "E:\Internship IOM\WPy64-3720\python-3.7.2.amd64\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "E:\Internship IOM\PythonScripts\appJar\appjar.py", line 3783, in <lambda>
    return lambda *args: funcName(param)
  File "E:/Internship IOM/PythonScripts/appJar/testrun.py", line 12, in generate
    app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), app.getEntry("length")))
  File "E:\Internship IOM\PythonScripts\appJar\logic.py", line 33, in signal
    frequency = velocity / length
TypeError: unsupported operand type(s) for /: 'float' and 'str'

您应该在调用站点进行转换,即:

def generate(btn):
    app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"),
                                           float(app.getEntry("length"))))
    ...

因为否则你的函数 logic.signal 接收不同的类型(strfloat)。这就是为什么您收到有关 float 没有 strip 的其他错误的原因,因为您在代码的其他地方做了:

signal_axes = app.addPlot("signal", *logic.signal(5, 0.02), 0, 0, 1)

在这里你传递一个float

由于您最初的错误是 could not convert string to float 带有明显的空字符串,因此您需要采取额外措施来防止应用程序出现空值。您可以使用 try ... except:

def generate(btn):
    try:
        length = float(app.getEntry("length"))
    except ValueError:
        # Use some default value here, or re-raise.
        length = 0.
    app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), length))