所以我创建了一个Tkinter应用程序,有3个框架。用户界面是用Figma设计的,因此对象是显式调用的。
通过创建一个从canvas继承的顶级类,我设法减少了canvas对象被显式调用的情况。
class MyCanvas (Canvas):
def __init__(self, *args, **kwargs):
Canvas.__init__(self, *args, **kwargs)
self['bg'] = "#FFFFFF",
self['height'] = 519,
self['width'] = 862,
self['bd'] = 0,
self['highlightthickness'] = 0,
self['relief'] = "ridge"
self.place(x=0,y=0)
这是其中一个框架:
class HomePage (tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
canvas = MyCanvas(self)
现在,这之后的代码是:
canvas.create_rectangle(
0.0,
0.0,
587.0,
519.0,
fill="#00A4D2",
outline="")
这个代码块出现了三次(我有三帧(。有没有办法减少这种情况的重复?
我尝试过的不同方法:
- @classmethod
@classmethod
def Createrect(cls):
self.create_rectangle(0.0,
0.0,
587.0,
519.0,
fill="#00A4D2",
outline="")
然后在之后调用该方法
canvas = MyCanvas(self)
没用。
- 创建另一个顶级类
class createrect(MyCanvas)
def createrect1():
MyCanvas.create_rectangle(.0,
0.0,
587.0,
519.0,
fill="#00A4D2",
outline="")
又是一次试错,显然没有成功。
谢谢你将来的帮助!
目前该应用程序正在运行,但它有600多条线路。最初是900(lol(,但由于我发现了继承概念,它减少到了600+。尽管如此,我相信它可以进一步减少。如果代码不健壮,我很抱歉,这是我的第一个Python应用程序。
我希望我提供了所有必要的细节。如果需要其他详细信息,请随时发表评论。
我不确定你是想得太多还是我想得太少:(
选项1:只需在MyCanvas中创建一个常规方法即可多次调用它。仅适用于当前画布。
class MyCanvas(Canvas):
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self['bg'] = "#FFFFFF",
self['height'] = 519,
self['width'] = 862,
self['bd'] = 0,
self['highlightthickness'] = 0,
self['relief'] = "ridge"
self.place(x=0, y=0)
self.create_rect()
self.create_rect()
self.create_rect()
def create_rect(self):
self.create_rectangle(0.0, 0.0, 587.0, 519.0, fill="#00A4D2", outline="")
选项2:拥有一个MainCanvas,其中包含可重复使用的方法
class MainCanvas(Canvas):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def create_rect(self):
self.create_rectangle(0.0, 0.0, 587.0, 519.0, fill="#00A4D2", outline="")
class MyCanvas(MainCanvas):
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self['bg'] = "#FFFFFF",
self['height'] = 519,
self['width'] = 862,
self['bd'] = 0,
self['highlightthickness'] = 0,
self['relief'] = "ridge"
self.place(x=0, y=0)
self.create_rect()
self.create_rect()
self.create_rect()
矩形项目应为以下形式之一:
pathName create rectangle x1 y1 x2 y2 ?option value ...?
pathName create rectangle coordList ?option value ...?
因此,创建一个矩形所需要的只是一个坐标列表或写出的位置参数。在这些坐标之后,您有各种可选的关键字参数。考虑到这一点,你可以很容易地做一些事情,比如:
coords = [x1,y1,x2,y2]
options= {
'fill':"#00A4D2",
'outline':""}
[self.create_rectangle(*coords,**options) for i in range(4)]
这段代码使用了python特性打开和列表理解。还要注意,我没有使用self.
,因为在我看来,这些变量似乎毫无意义,无法收集垃圾。
够短吗?