如何利用PyQt5 QComboBox文本获取列表值并简化冗余代码
简化PyQt5中QComboBox对应的列表取值逻辑
我明白你的困扰——原来用一大堆if/elif匹配下拉框选中的城市+年份,再对应到不同的数值列表,代码又长又难维护,想简化但试的方法没成功。咱们一步步来解决:
为什么你的代码(1)运行失败?
你写的代码(1)里,cityyear是像'Toronto2yr'这样的字符串,不是数值列表。所以cityyear[0]取的是字符串的第一个字符(比如'T'),而不是目标列表的第一个数值。把字符转成float肯定会报错,这就是代码跑不起来的核心原因。
最优解决方案:用字典做映射
咱们把所有城市年份对应的数值列表放进一个字典里,用城市+年份的字符串作为键,对应的数值列表作为值。这样一行代码就能拿到对应的数据,彻底告别冗余的if/elif。
完整修正后的代码
import sys from PyQt5.QtWidgets import * from PyQt5 import uic Calui='../_uiFiles/IDF.ui' # 用字典统一管理所有城市年份的数据,键是下拉框拼接后的字符串,值是对应的数值列表 city_year_data = { 'Toronto2yr': [11, 22, 33], 'Toronto100yr': [44, 55, 66], 'Richmondhill2yr': [77, 88, 99], 'Richmondhill100yr': [10, 11, 12] } class MyWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self, None) uic.loadUi(Calui, self) self.pushButton.clicked.connect(self.abcvalue) # 直接在abcvalue里获取下拉框文本,减少不必要的函数调用(需要复用的话也可以保留combo_text) def abcvalue(self): city = self.comboBox.currentText() year = self.comboBox_2.currentText() city_year_key = city + year # 从字典取对应列表,找不到时用默认值避免崩溃 target_list = city_year_data.get(city_year_key, [0, 0, 0]) # 转成字符串后设置到输入框 self.lineEdit.setText(str(float(target_list[0]))) self.lineEdit_2.setText(str(float(target_list[1]))) self.lineEdit_3.setText(str(float(target_list[2]))) if __name__ == "__main__": app = QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
额外优化点
- 我把
combo_text方法合并到了abcvalue里,减少不必要的函数调用;如果之后需要复用拼接逻辑,保留combo_text也完全没问题,只要在abcvalue里调用它拿到city_year_key就行。 - 用
dict.get()方法获取列表时加了默认值(比如[0,0,0]),避免用户选了字典里没有的选项时程序崩溃。 - 原列表元素已经是数字,转
float可以直接操作,不用先转字符串再转回数字。
这样代码不仅简洁,以后要加新的城市或年份,直接在city_year_data字典里加一行就行,维护起来超方便~
内容的提问来源于stack exchange,提问作者Jangsoo Lee
相关产品推荐
相关产品推荐

