今天给大家介绍下python gui界面的三级联动效果,我们用工具eric6来实现,先看下效果图。
首先我们先创建项目linkage,再新建窗体进入到Qt设计师工具开始设计界面,完成后保存并退出。
在eric6工具中编译窗体,再选择生成对话框代码,我们在复选框的函数中勾选on_province_activated(int)这个函数,确认后生成两个新的py文件,我们通常在ui_linkage.py文件中处理界面编辑优化,在linkage.py文件中处理事件机制(槽),我们三级联动效果主要在linkage.py中完成功能代码。
1 # -*- coding: utf-8 -*- 2 3 """ 4 Module implementing Linkage. 5 """ 6 7 from PyQt5.QtCore import pyqtSlot 8 from PyQt5.QtWidgets import QDialog, QApplication 9 import json 10 11 from Ui_linkage import Ui_Linkage 12 13 14 class Linkage(QDialog, Ui_Linkage): 15 """ 16 Class documentation goes here. 17 """ 18 def __init__(self, parent=None): 19 """ 20 Constructor 21 22 @param parent reference to the parent widget 23 @type QWidget 24 """ 25 super(Linkage, self).__init__(parent) 26 self.setupUi(self) 27 #初始化操作委托到initUI() 28 self.initUI() 29 def initUI(self): 30 with open('data.json', 'r', encoding='utf-8') as f: 31 self.data=json.load(f) 32 #初始化三级联动下拉框的数据 33 self.choosep='' 34 self.choosec='' 35 self.choosea='' 36 self.label_result.setText('选择结果:(未选择)') 37 #清理当前下拉框的内容 38 self.province.clear() 39 self.city.clear() 40 self.area.clear() 41 #初始化下拉框的展示内容 42 self.province.addItem('-请选择-') 43 for s in self.data: 44 print(s['name']) 45 self.province.addItem(s['name']) 46 47 @pyqtSlot(int) 48 def on_province_activated(self, index): 49 """ 50 Slot documentation goes here. 51 52 @param index DESCRIPTION 53 @type int 54 """ 55 #因为我们在初始化的时候添加了请选择,所以需要做判断看当前是否点击它了 56 if index==0: 57 #点击请选择按钮后,我们需要对省、市、区进行三级联动数据清理 58 self.choosep='' 59 self.choosec='' 60 self.choosea='' 61 #需要清理后面市、区的内容 62 self.city.clear() 63 self.area.clear() 64 return 65 #获取当前选择的省份数据(因为index=0的时候是请选择所以需要-1) 66 self.choosep=self.data[index-1] 67 #清理市、区下拉框内容 68 self.city.clear() 69 self.area.clear() 70 #当前所选省得市级下拉框内容添加 71 self.city.addItem('-请选择-') 72 for s in self.choosep['city']: 73 self.city.addItem(s['name']) 74 75 @pyqtSlot(int) 76 def on_city_activated(self, index): 77 """ 78 Slot documentation goes here. 79 80 @param index DESCRIPTION 81 @type int 82 """ 83 if index==0: 84 #初始化市、区数据 85 self.choosec='' 86 self.choosea='' 87 #清理区的下拉框内容 88 self.area.clear() 89 return 90 #获取当前所选市的数据 91 self.choosec=self.choosep['city'][index-1] 92 #清理区的下拉框内容 93 self.area.clear() 94 #当前所选市的区下拉框内容添加 95 self.area.addItem('-请选择-') 96 for s in self.choosec['area']: 97 self.area.addItem(s) 98 99 @pyqtSlot(int) 100 def on_area_activated(self, index): 101 """ 102 Slot documentation goes here. 103 104 @param index DESCRIPTION 105 @type int 106 """ 107 if index==0: 108 #初始化区数据 109 self.choosea='' 110 return 111 #获取当前所选区数据 112 self.choosea=self.choosec['area'][index-1] 113 114 @pyqtSlot() 115 def on_sure_clicked(self): 116 str_result='选择结果:(未选择)' 117 if self.choosep: 118 str_result=self.choosep['name'] 119 if self.choosec: 120 str_result=str_result+'-'+self.choosec['name'] 121 if self.choosea: 122 str_result=str_result+'-'+self.choosea 123 self.label_result.setText(str_result) 124 125 @pyqtSlot() 126 def on_cancel_clicked(self): 127 #返回初始状态 128 self.initUI() 129 if __name__=='__main__': 130 import sys 131 app=QApplication(sys.argv) 132 linkage=Linkage() 133 linkage.show() 134 sys.exit(app.exec_()) 135 136