【问题标题】:Trying to display progress bar in Tkinter with Canvas尝试使用 Canvas 在 Tkinter 中显示进度条
【发布时间】:2021-12-28 19:47:45
【问题描述】:

我试图添加一些进度条来独立显示一些值,如下所示:

VALUES OF PARAMETERS

所以我使用此代码添加到我的主程序中,但是当我编写此代码时:

class Processing1ra(tk.Frame):

  def __init__(self, parent):
    scalevar=IntVar()
    self.canvas = Canvas(
            bg = "#FFFFFF",
            height = 888,
            width = 1458,
            bd = 0,
            highlightthickness = 0,
            relief = "ridge"
        )
    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)
            self.canvas.delete(self.rectangle_1)
            if scalevar <= 50:
                self.rectangle_1=self.canvas.create_rectangle(250.0,356.0,scalevar,a+250,fill="#AFDE14",outline="")
            else:
                self.rectangle_1=self.canvas.create_rectangle(250, 356,300, a+356,fill="#AFDE14",outline="")
                self.rectangle_2=self.canvas.create_rectangle(300, 356, scalevar,a+356, fill="#EB0701",outline="")

问题在于self.canvas.delete(self.rectangle_1),我收到了这些错误

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files\Python39\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "d:\11.17.21\Interfaz4.py", line 544, in volumelevel
    self.canvas.delete(self.rectangle_1)
AttributeError: 'Processing1ra' object has no attribute 'rectangle_1'

但是在使用self.canvas.delete(ALL)而不是self.canvas.delete(self.rectangle_1)的情况下,其他组件会被擦除

【问题讨论】:

  • 在引用 self.rectangle_1 之前,您在哪里定义了它?
  • 这里的问题是,在volumelevel() 中,您在self.canvas.delete(self.rectangle_1) 行中使用了rectangle1。但是,rectangle1 被进一步创建了几行。为了解决这个问题,在__init__() 中定义rectangle1。你可以把它变小以至于你看不到它:self.rectangle1 = self.canvas.create_rectangle(250, 356, 0, 0, fill="#AFDE14", outline="").

标签: python tkinter tkinter-canvas


【解决方案1】:

您需要在使用之前初始化self.rectangle_1。这可以通过为其分配一个None 值来完成,并通过对其值的测试来保护调用。 (尽管tkinter 可能会毫无怨言地接受None

像这样:

class Processing1ra(tk.Frame):

    def __init__(self, parent):
        scalevar=IntVar()
        self.canvas = Canvas(
            bg = "#FFFFFF",
            height = 888,
            width = 1458,
            bd = 0,
            highlightthickness = 0,
            relief = "ridge"
        )
        self.scale = Scale(
            from_=0, 
            to=100, 
            orient="horizontal", 
            variable=scalevar, 
            command=self.volumelevel
        )
        self.scale.pack()
        self.rectangle_1 = None       # create the attribute here.
    
    
    def volumelevel(self, scalevar):
        a = 16
        scalevar = int(scalevar)
        
        if self.rectangle_1 is not None:
            self.canvas.delete(self.rectangle_1)
        
        if scalevar <= 50:
            self.rectangle_1 = self.canvas.create_rectangle(
                250.0, 
                356.0, 
                scalevar, 
                a+250, 
                fill="#AFDE14", 
                outline=""
            )
        else:
            self.rectangle_1 = self.canvas.create_rectangle(
                250,
                356,
                300, 
                a+356,
                fill="#AFDE14",
                outline=""
            )
            self.rectangle_2 = self.canvas.create_rectangle(
                300, 
                356, 
                scalevar,
                a+356, 
                fill="#EB0701",
                outline=""
            )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多