Skip to main content
 首页 » 编程设计

python之无法从 ini 文件中读取 bool 值

2025年05月04日16mq0036

我在 PyQt5 应用中从 ini 文件加载 bool 值时遇到问题。

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 
 
import sys 
from PyQt5 import QtCore 
from PyQt5.QtCore import QSettings, QVariant 
from PyQt5.QtWidgets import ( 
    QApplication, QCheckBox, QDialog, QGridLayout, 
    QLabel, QLayout, QPushButton 
) 
 
 
class Settings(QDialog): 
    "settings GUI" 
 
    _settings = None 
 
    def __init__(self): 
        super(Settings, self).__init__() 
        self._ui() 
 
    def _ui(self): 
        self._chk_test = QCheckBox() 
        self._chk_test.setText("test checkbox") 
 
        self._settings = QSettings("settings.ini", QSettings.IniFormat) 
        self._settings.setFallbacksEnabled(False) 
 
        # load configuration 
        self._chk_test.setChecked( 
            self._bool(self._settings.value("test_value", True))) 
 
        # save settings 
        btn_save = QPushButton("save") 
        btn_save.clicked.connect(self._save_settings) 
 
        # setting layouts 
        grid_layout = QGridLayout() 
        grid_layout.addWidget(self._chk_test, 0, 0, 1, 1) 
        grid_layout.addWidget(btn_save, 0, 1, 1, 1) 
        grid_layout.setSizeConstraint(QLayout.SetFixedSize) 
        grid_layout.setHorizontalSpacing(100) 
        grid_layout.setVerticalSpacing(5) 
 
        self.setWindowTitle("Boolean") 
        self.setLayout(grid_layout) 
        self.show() 
 
    def _save_settings(self): 
        self._settings.setValue("test_value", self._chk_test.isChecked()) 
        self.close() 
 
    def _bool(self, str): 
        if str == "true": 
            return True 
        else: 
            return False 
 
 
if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    ui = Settings() 
    sys.exit(app.exec_()) 

当我尝试使用

加载 bool 值时
self._settings.value("test_value", True).toBool() 

或

QVariant(self._settings.value("test_value", True)).toBool() 

我得到了 AttributeError:

'str' / 'QVariant' object has no attribute 'toBool()'.  

我已经编写了自定义 _bool 方法,但我想知道是否有更好的方法来解决它。

请您参考如下方法:

他们添加第三个参数 type= 来设置结果的类型。因此,您可以使用 type=bool 并获取 Python True/False 而不是字符串 "true"/"false"

a = self._settings.value("test_value", True, type=bool) 
print('a:', type(a), a) 
 
b = self._settings.value("test_value", True) 
print('b:', type(b), b) 

结果

a: <class 'bool'> True 
b: <class 'str'> true 

在谷歌中找到:https://riverbankcomputing.com/pipermail/pyqt/2011-January/029032.html

  • Added the optional type keyword argument to QSettings.value() to allow the type of the returned value to be specified.