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

Tkinter Progressbar报错:无法将空字符串转为浮点数问题

问题:Tkinter进度条更新失败,StringVar未正确同步

在Controller中运行测量任务,想要在View中实现Tkinter Progressbar。为了通过步长值(每秒步数)控制Progressbar,需要从Controller获取两个数值。我在Controller的构造函数中实例化了两个初始为空的StringVar,测量时调用Device库的方法获取时间值,并通过set方法更新这两个StringVar。但在View中计算步长值时,触发了ValueError,提示无法将空字符串转为浮点数,显然StringVar未被正确更新。

相关代码

Controller类

class Controller():  
    def __init__(self):
       super().__init__()
       self.paramset = Paramset() # 获取参数
       self.get_test_done_time = tkinter.StringVar()
       self.get_sample_period = tkinter.StringVar()

    def measure_data(self, port):
       try:
           self.dev = Device(port) # Device是第三方库
       except Exception:
           messagebox.showerror("Error", "No COM-Port")
           return None
       try:
           self.dev.set_curr_range(self.paramset.curr_range[0].get())
           self.dev.set_sample_rate(float(self.paramset.sampleRate[0].get()))
           t, volt, curr = self.dev.run_test("cyclic", display='pbar',
                                    filename=self.paramset.textdata[0].get())
           self.get_test_done_time.set(self.dev.get_test_done_time())
           self.get_sample_period.set(self.dev.get_sample_period())
           self.dev.stop_test()
           self.dev.close()

    def start_test(self, port):
        self.worker = threading.Thread(target=self.measure_data, args=(port,))
        self.worker.start()

View类

class View:
    def __init__(self):
        self.controller = Controller()
        self.percentLabel = Label(textvariable=self.percent)
        self.progress_frame = ttk.Frame(self)
        self.pb = ttk.Progressbar(self.progress_frame, orient=tk.HORIZONTAL, length=200)
        self.pb.pack()
        self.progress_frame.grid(row=len(vars(self.controller.paramset)) - 6, column=0)
        self.start_button = ttk.Button(self.buttonframe, text="Start Test", 
                                       command=lambda: self.start_measurement(self.portVar.get()) or self.start_progress_bar()) 
        # start_measurement对应controller中的start_test

    def progress(self):
        if self.variable.get() == "Cyclo":
            if self.controller.worker.is_alive():
                self.stepValue = float(self.controller.get_test_done_time.get()) / float(self.controller.get_sample_period.get())
        while self.pb["value"] < 100:
            self.pb['value'] += self.stepValue
            self.percentLabel['text'] = self.update_progress_label()
            time.sleep(1.2)
            self.update_idletasks()
        if self.pb["value"] == 100:
            self.pb["value"] = 0
            self.percentLabel['text'] = "Current Progress: 0.0%"
            self.pb.stop()
            self.update_idletasks()

    def start_progress_bar(self):
        self.progress_worker = threading.Thread(target=lambda:self.progress())
        self.progress_worker.start()

报错信息

Exception in thread Thread-2 (<lambda>):
Traceback (most recent call last):
  File "C:\Users\xxx\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1009, in _bootstrap_inner
    self.run()
  File "C:\Users\xxx\AppData\Local\Programs\Python\Python310\lib\threading.py", line 946, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\xxx\xxx\xxx\xxx\View.py", line 265, in <lambda>
    self.progress_worker = threading.Thread(target = lambda:self.progress())
  File "C:\Users\xxx\xxx\xxx\xxx\xxx\View.py", line 252, in progress
    self.stepValue = float(self.controller.get_test_done_time.get())/ float(self.controller.get_sample_period.get())
ValueError: could not convert string to float: ''

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:40:23