尝试使用 Canvas 在 Tkinter 中显示进度条
Trying to display progress bar in Tkinter with Canvas
我试图添加一些进度条来独立显示一些值,如下所示:
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:.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
。这可以通过为其分配一个 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=""
)
我试图添加一些进度条来独立显示一些值,如下所示:
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:.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
。这可以通过为其分配一个 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=""
)