Python 如何检查在PyQt5中选中的复选框
我正在尝试创建一个简单的桌面应用程序,它使用RESTAPI(包括国家、城市、isp、regionName和时区)获取IP地址并显示其位置。我的表格中有5个复选框,用户可以决定显示哪些数据(城市、国家、isp等) 我这样做的方式是为每个复选框使用5个If语句,这似乎不是一个好的方法。 此外,为了将API返回的值设置为lineEdits,我还必须为每个lineEdits使用5个if语句 是否有其他方法检查选中了哪些复选框,以便我可以使用与这些复选框相关的数据调用API? 我的片段:Python 如何检查在PyQt5中选中的复选框,python,api,user-interface,checkbox,pyqt5,Python,Api,User Interface,Checkbox,Pyqt5,我正在尝试创建一个简单的桌面应用程序,它使用RESTAPI(包括国家、城市、isp、regionName和时区)获取IP地址并显示其位置。我的表格中有5个复选框,用户可以决定显示哪些数据(城市、国家、isp等) 我这样做的方式是为每个复选框使用5个If语句,这似乎不是一个好的方法。 此外,为了将API返回的值设置为lineEdits,我还必须为每个lineEdits使用5个if语句 是否有其他方法检查选中了哪些复选框,以便我可以使用与这些复选框相关的数据调用API? 我的片段: def set_
def set_params(self,IP):
try:
socket.inet_aton("%s" %IP)
except:
pass #for now
else:
if self.ui.checkBox_City.isChecked():
city = "city"
else:
city = None
if self.ui.checkBox_Country.isChecked():
country = "country"
else:
country = None
if self.ui.checkBox_Rname.isChecked():
Rname = "regionName"
else:
Rname = None
if self.ui.checkBox_ISP.isChecked():
ISP = "isp"
else:
ISP = None
if self.ui.checkBox_Time.isChecked():
time = "timezone"
else:
time = None
param = {"fields": "{},{},{},{},{}".format(country,city,ISP,Rname,time)}
r = requests.get("http://ip-api.com/json/{}".format(IP), params=param)
resdict = r.json()
#print(resdict)
if "country" in resdict.keys():
self.ui.lineEdit_Country.setText(resdict["country"])
if "city" in resdict.keys():
self.ui.lineEdit_City.setText(resdict["city"])
if "isp" in resdict.keys():
self.ui.lineEdit_ISP.setText(resdict["isp"])
if "timezone" in resdict.keys():
self.ui.lineEdit_Time.setText(resdict["timezone"])
if "regionName" in resdict.keys():
self.ui.lineEdit_Country.setText(resdict["regionName"])
您可以使用“城市”、“国家”等键将复选框和行编辑存储在字典中,并在
set_params
中使用这些键检查复选框的状态并设置行编辑的文本。因此,在您设置ui(大概在\uuuuu init\uuuuu
中的某个地方)之后,您将设置
self.check_boxes = {'country':self.ui.checkbox_Country, 'city':self.ui.checkbox_City,
'isp':self.ui.checkbox_ISP, 'regionName':self.ui.checkbox_Rname,
'timezone':self.ui.checkbox_Time}
self.line_edits = {'country':self.ui.lineEdit_Country, 'city':self.ui.lineEdit_City,
'isp':self.ui.lineEdit_ISP, 'regionName':self.ui.lineEdit_Rname,
'timezone':self.ui.lineEdit_Time}
在设置参数(self,IP)
中,您可以根据
def set_params(self.IP):
try:
....
except:
....
else:
# iterate over dict with check boxes to check their state
values = [key for key, check_box in self.check_boxes.items() if check_box.isChecked()]
param = {"fields": ','.join(values)}
r = requests.get("http://ip-api.com/json/{}".format(IP), params=param)
resdict = r.json()
# iterate over dict with line edits and set the text of the line edit if the corresponding key is in resdict.
for key, line_edit in self.line_edits.items():
line_edit.clear()
if key in resdict.keys():
line_edit.setText(resdict[key])
我已经更新了我的代码,但是如果没有一个最小的工作示例,就很难测试它是否正常工作。为什么要用列表代替以前的字典来表示
值
。另外,如果没有None值,您可以使用str.join
为“fields”参数创建值,而不是格式化字符串。