在Tkinter中使用Canvas绘制自定义进度条出现AttributeError如何解决
问题原因
报错是因为volumelevel方法首次被触发时,self.rectangle_1还没有被初始化赋值,直接调用self.canvas.delete(self.rectangle_1)就会抛出属性不存在的异常。同时直接用delete(ALL)会清空画布所有元素,不符合仅更新进度条的需求。
解决方案
修改后的完整代码如下:
import tkinter as tk from tkinter import Canvas, Scale, IntVar class Processing1ra(tk.Frame): def __init__(self, parent): super().__init__(parent) scalevar = IntVar() self.canvas = Canvas( bg = "#FFFFFF", height = 888, width = 1458, bd = 0, highlightthickness = 0, relief = "ridge" ) self.canvas.pack() # 提前初始化进度条属性 self.rectangle_1 = None self.rectangle_2 = None self.scale = Scale(from_=0, to=100, orient="horizontal", variable=scalevar, command=self.volumelevel) self.scale.pack() def volumelevel(self, scalevar): a = 16 scalevar = int(scalevar) # 删除前先判断元素是否存在 if self.rectangle_1 is not None: self.canvas.delete(self.rectangle_1) if self.rectangle_2 is not None: self.canvas.delete(self.rectangle_2) if scalevar <= 50: self.rectangle_1 = self.canvas.create_rectangle(250.0, 356.0, 250 + scalevar, 356 + a, fill="#AFDE14", outline="") self.rectangle_2 = None else: self.rectangle_1 = self.canvas.create_rectangle(250, 356, 300, 356 + a, fill="#AFDE14", outline="") self.rectangle_2 = self.canvas.create_rectangle(300, 356, 250 + scalevar, 356 + a, fill="#EB0701", outline="")
修改说明
- 补全了父类
Frame的初始化调用,以及canvas的pack渲染操作,解决原代码运行后画布不显示的问题 - 提前将两个进度条矩形的属性初始化为
None,删除前先判断是否存在,避免首次调用方法时报错 - 修正了原代码的坐标计算错误:原写法把进度值直接作为矩形右边界,会导致进度条从250坐标开始但最大仅延伸到100坐标,完全不可见,修改为
250 + scalevar符合进度条从左到右增长的逻辑 - 数值小于等于50时主动将
rectangle_2设为None,避免后续删除时残留旧的红色进度块
内容的提问来源于stack exchange,提问作者AlvaroSt
相关产品推荐
相关产品推荐

