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
相关产品推荐
相关产品推荐

