2016-11-25 2 views
0

파일의 부울을로드하는 데 문제가 있습니다. PyQt5 app에 있습니다.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() 

를 사용하여 부울을로드하려고 해요 때 : 나는 정의 _bool를 작성했습니다

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

을 방법 그러나 나는 이상하게 여긴다. 그것을 해결하는 더 좋은 방법이 있다면 보내십시오. self._settings.value("test_value", True) 가정

+0

짧은 :' "STR == 반환 true "' – furas

+0

좋은 트릭, 고마워! Qt 워드 프로세서에서 볼 수는 없지만, [PyQt doc] (http://pyqt.sourceforge.net/Docs/PyQt4/qsettings.html#value)에서 찾을 수 있습니다. – SyedElec

답변

3

세 번째 인수 type=을 결과 유형을 설정하는 데 추가합니다. 그래서 당신은 type=bool를 사용하는 대신 문자열의 파이썬 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.
+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

관련 문제