【问题标题】:How to check which checkboxes are checked in PyQt5如何检查在 PyQt5 中选中了哪些复选框
【发布时间】:2020-09-18 18:24:54
【问题描述】:

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

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

是否有任何其他方法可以检查哪些复选框被选中,以便我可以使用与这些复选框相关的数据调用 API? 我的sn-p:

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"])

【问题讨论】:

    标签: python api user-interface checkbox pyqt5


    【解决方案1】:

    您可以使用“城市”、“国家”等作为键将复选框和行编辑存储在字典中,并在set_params 中使用它们来检查复选框的状态并设置文本行编辑。所以,在你设置好 ui 之后(大概在 __init__ 的某个地方)你会设置

    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}
    

    set_params(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])
    

    【讨论】:

    • 我已经更新了我的代码,但是如果没有一个最小的工作示例,很难测试它是否正常工作。
    • 我测试了前一个,它确实有效。为什么values 使用 List 而不是以前的字典?
    • 我将字典更改为列表,因为我认为由于 None 值无关紧要,因此也可以省略。此外,如果没有 None 值,您可以只使用 str.join 为“fields”参数创建值,而不是格式化字符串。
    猜你喜欢
    • 2019-08-21
    • 1970-01-01
    • 2020-11-14
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多