如何精简Python类实例?PyQt按钮式周期表重复代码优化
2. PyQt元素周期表按钮代码优化方案
你的问题核心是消除重复代码,把创建按钮的逻辑抽象出来就可以轻松解决,这里有两个递进的优化思路:
思路1:封装按钮创建逻辑为辅助方法
先把重复的按钮初始化代码抽成一个类方法,再把所有元素的参数整理成列表,循环创建按钮即可:
from PyQt5.QtWidgets import QMainWindow, QPushButton class App(QMainWindow): def __init__(self): super().__init__() self.mainLayout() def _create_element_button(self, short_name, long_name, x, y, click_callback): # 把所有重复的按钮配置逻辑都放在这里 btn = QPushButton(short_name, self) btn.setToolTip(long_name) btn.setCheckable(True) btn.resize(50, 50) btn.move(x, y) btn.clicked.connect(click_callback) return btn def mainLayout(self): # 整理所有元素的数据:(短名, 长名, x坐标, y坐标, 点击回调) elements = [ ('H', 'Hydrogen', 10, 10, self.H_click), ('He', 'Helium', 70, 10, self.He_click), # 其他元素按这个格式依次添加即可 ] # 循环批量创建按钮 for elem_data in elements: self._create_element_button(*elem_data) # 各个元素的点击回调函数 def H_click(self): print('Hydrogen button clicked!') def He_click(self): print('Helium button clicked!')
思路2:用QGridLayout替代手动move(更专业的布局方式)
手动调用move的按钮在窗口大小变化时不会自动调整位置,而周期表天然是网格结构,用QGridLayout布局更合理,代码也更简洁:
from PyQt5.QtWidgets import QMainWindow, QPushButton, QWidget, QGridLayout class App(QMainWindow): def __init__(self): super().__init__() self.central_widget = QWidget() self.setCentralWidget(self.central_widget) self.mainLayout() def _create_element_button(self, short_name, long_name, click_callback): btn = QPushButton(short_name) btn.setToolTip(long_name) btn.setCheckable(True) btn.clicked.connect(click_callback) btn.setMinimumSize(50, 50) # 设置最小尺寸,不用手动resize return btn def mainLayout(self): grid_layout = QGridLayout(self.central_widget) # 按周期表的行列位置整理数据:(行, 列, 短名, 长名, 回调) elements_grid = [ (0, 0, 'H', 'Hydrogen', self.H_click), (0, 17, 'He', 'Helium', self.He_click), (1, 0, 'Li', 'Lithium', self.Li_click), # 其他元素按周期表的实际行列位置添加 ] # 循环添加按钮到网格布局 for row, col, short_name, long_name, callback in elements_grid: btn = self._create_element_button(short_name, long_name, callback) grid_layout.addWidget(btn, row, col)
这样不仅彻底消除了重复代码,布局也更专业——窗口大小变化时按钮会自动调整位置,后续维护也更方便,要加新元素只需在列表里加一行数据就行。
内容的提问来源于stack exchange,提问作者Harrison Reisinger
相关产品推荐
相关产品推荐

