今天給你們介紹下python gui界面的三級聯動效果,咱們用工具eric6來實現,先看下效果圖。python
首先咱們先建立項目linkage,再新建窗體進入到Qt設計師工具開始設計界面,完成後保存並退出。json
在eric6工具中編譯窗體,再選擇生成對話框代碼,咱們在複選框的函數中勾選on_province_activated(int)這個函數,確認後生成兩個新的py文件,咱們一般在ui_linkage.py文件中處理界面編輯優化,在linkage.py文件中處理事件機制(槽),咱們三級聯動效果主要在linkage.py中完成功能代碼。app
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