Python 如何检查在PyQt5中选中的复选框

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_

我正在尝试创建一个简单的桌面应用程序,它使用RESTAPI(包括国家、城市、isp、regionName和时区)获取IP地址并显示其位置。我的表格中有5个复选框,用户可以决定显示哪些数据(城市、国家、isp等)

我这样做的方式是为每个复选框使用5个If语句,这似乎不是一个好的方法。 此外,为了将API返回的值设置为lineEdits,我还必须为每个lineEdits使用5个if语句

是否有其他方法检查选中了哪些复选框,以便我可以使用与这些复选框相关的数据调用API? 我的片段:

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”参数创建值,而不是格式化字符串。