PyQt5--基础篇:用eric6工具实现三级联动效果

今天给大家介绍下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     
原文地址:https://www.cnblogs.com/gentleman-shao/p/8795636.html