2016-11-25 17 views
0

ファイルからPyQt5アプリにブール値をロードする際に問題があります。iniファイルからブール値を読み取ることができません

#!/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_()) 

私ははAttributeErrorを取得しています

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

または

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

を使用して、ブールロードしようとしています:

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

私はカスタムを書いた_bool方法が、私は不思議ですそれを解決するより良い方法があるならば。 self._settings.value("test_value", True)を想定し

+0

短い: '" strの==戻ります本当 "" – furas

+0

素敵なトリック、ありがとう! Qtのドキュメントでは、私はそれは存在しませんが、私は見ていませんでしたが、[PyQt doc](http://pyqt.sourceforge.net/Docs/PyQt4/qsettings.html#value)で見つけることができます。 – SyedElec

答えて

3

3番目の引数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 

をGoogleで発見結果: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.
+0

あなたの答えをありがとう。それはまさに私がやりたかったことです。 – przemekk

0

は、あなたが、しかし

self._chk_test.setChecked(
      self._settings.value("test_value", True) == "true") 

を行うことができますが、これを複数回行う必要がある場合、私は、カスタムメソッドを続けるだろう(しかし@furasが持っているとして、それがよりコンパクトに、値がある"true"文字列を返します提案されました):

def _bool(self, str): 
    return str == "true" 
+0

"true"または "false"の値を持つ文字列を返し、それをブール値にしたいと考えました。私が探していた答えは上に与えられています。 – przemekk

関連する問題