Python 如何使我的代码更加紧凑和优雅?

Python 如何使我的代码更加紧凑和优雅?,python,function,Python,Function,我有一段代码作为我想做的事情的原型。我正在制作一个GUI,我写的很多东西都是相同的,但变量名不同(例如,小部件几乎相同)。所以我在想是否有办法缩短代码: 原型: frame_widget = QtWidgets.QWidget() frame_widget.setLayout(self.button_frame) self.centralframe.addWidget(frame_widget) timer_widget = QtWidgets.QWidget() timer_widget.s

我有一段代码作为我想做的事情的原型。我正在制作一个GUI,我写的很多东西都是相同的,但变量名不同(例如,小部件几乎相同)。所以我在想是否有办法缩短代码:

原型:

frame_widget = QtWidgets.QWidget()
frame_widget.setLayout(self.button_frame)
self.centralframe.addWidget(frame_widget)

timer_widget = QtWidgets.QWidget()
timer_widget.setLayout(self.timer_frame)
self.centralframe.addWidget(timer_widget)
是否可以使用函数或其他方法来避免代码重复?

例如

def add_widget(frame, layout):
    widget = QtWidgets.QWidget()
    widget.setLayout(layout)
    frame.addWidget(widget)

# usage
add_widget(self.centralframe, self.button_frame)
add_widget(self.centralframe, self.timer_widget)
比如说,

def add_widget(frame, layout):
    widget = QtWidgets.QWidget()
    widget.setLayout(layout)
    frame.addWidget(widget)

# usage
add_widget(self.centralframe, self.button_frame)
add_widget(self.centralframe, self.timer_widget)

两个代码块之间唯一真正改变的是帧。您可以将所需的所有帧放在一个列表中,然后对其进行迭代:

frames=[self.button\u frame,self.timer\u frame]#以及您拥有的任何其他帧。。。
对于帧中帧:
frame_widget=qtwidts.QWidget()
frame_widget.setLayout(frame)
self.centralframe.addWidget(frame\u小部件)

两个代码块之间唯一真正发生变化的是帧。您可以将所需的所有帧放在一个列表中,然后对其进行迭代:

frames=[self.button\u frame,self.timer\u frame]#以及您拥有的任何其他帧。。。
对于帧中帧:
frame_widget=qtwidts.QWidget()
frame_widget.setLayout(frame)
self.centralframe.addWidget(frame\u小部件)

这并不是一个巨大的改进,但您只需制作一个匿名的
元组
,将这些东西包装在小部件中并添加,然后循环:

for elem in (self.button_frame, self.timer_frame):
    widget = QtWidgets.QWidget()
    widget.setLayout(elem)
    self.centralframe.addWidget(widget)
如果您谈论的是许多这样的
元素,而不仅仅是两个,那么它会更有用


这假设您以后不依赖
timer\u小部件
frame\u小部件
的存在;如果你这样做了,你就必须修改它,使其具有某种
小部件dict
,并使循环运行在
str
名称和UI元素对上,这样你就可以按名称分配给
dict

这不是一个很大的改进,但你可以制作一个匿名的
元组来包装小部件并添加,然后在其上循环:

for elem in (self.button_frame, self.timer_frame):
    widget = QtWidgets.QWidget()
    widget.setLayout(elem)
    self.centralframe.addWidget(widget)
如果您谈论的是许多这样的
元素,而不仅仅是两个,那么它会更有用


这假设您以后不依赖
timer\u小部件
frame\u小部件
的存在;如果这样做,您必须修改它,使其具有某种类型的
小部件dict
,并使循环运行在
str
名称和UI元素对上,以便您可以按名称分配给
dict

我将向类添加一个方法,为给定帧创建小部件:

def addWidget(self,frame):
    widget = QtWidgets.QWidget()
    widget.setLayout(frame)
    self.centralframe.addWidget(widget)
    return widget
然后您可以这样使用它:

 frame_widget = self.addWidget(self.button_frame)
 timer_widget = self.addWidget(self.timer_frame)

我将向类中添加一个方法,用于为给定帧创建小部件:

def addWidget(self,frame):
    widget = QtWidgets.QWidget()
    widget.setLayout(frame)
    self.centralframe.addWidget(widget)
    return widget
然后您可以这样使用它:

 frame_widget = self.addWidget(self.button_frame)
 timer_widget = self.addWidget(self.timer_frame)

谢谢我现在明白了,谢谢!我现在明白了谢谢你!我会考虑谢谢你!我会考虑