Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Pythonでiniファイルの読み書き
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- mode: python;Encoding: utf8n -*-
"""
PyQt + FontDialog + ConfigParser(iniファイルアクセス)のテスト
ラベルのフォントを、
フォント選択ダイアログで選択したフォントに変更して、
フォント種類をiniファイルに記録する。
英数字のフォント名なら正常に記録できるが、
日本語フォント名では、iniファイルへの書き込み時に UnicodeEncodeError を吐く。
"""
import os
import sys
from PyQt4 import QtGui
import ConfigParser
import codecs
INI_FILE = "settings_font.ini"
DEF_STR = "The quick brown fox jumps over a lazy dog.\n" \
u"いろはにほへと ちりぬるを"
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
"""UIの初期化"""
vbox = QtGui.QVBoxLayout()
btn = QtGui.QPushButton('Dialog', self)
btn.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
btn.move(20, 20)
vbox.addWidget(btn)
btn.clicked.connect(self.showDialog)
self.lbl = QtGui.QLabel(DEF_STR, self)
self.lbl.move(130, 20)
vbox.addWidget(self.lbl)
self.lbl2 = QtGui.QLabel("", self)
self.lbl2.move(130, 60)
vbox.addWidget(self.lbl2)
self.setLayout(vbox)
self.setGeometry(300, 300, 250, 180)
self.setWindowTitle('Font dialog')
self.show()
# open ini file
self.ini_path = os.path.join(os.path.dirname(__file__), INI_FILE)
self.ini = self.read_ini_file(self.ini_path)
# 前回終了時のフォント種類が記録されていたら再現する
font = self.get_font_from_ini(self.ini)
if font is None:
print "font is None"
else:
self.lbl.setFont(font)
def showDialog(self):
"""フォント選択ダイアログの表示"""
font, ok = QtGui.QFontDialog.getFont(self.lbl.font())
if ok:
self.lbl.setFont(font) # Widgetのフォントを変更
font_name = unicode(font.toString())
self.lbl2.setText(font_name)
# 問題点: 日本語フォント名を表示できても、ini に記録できない
# UnicodeEncodeError が出る…。(Python 2.7.3)
self.set_font_to_ini(font)
self.write_ini_file(self.ini_path, self.ini)
def set_font_to_ini(self, font):
"""フォント種類を記録"""
self.ini.set('font', 'rawname', unicode(font.rawName()))
self.ini.set('font', 'family', unicode(font.family()))
self.ini.set('font', 'pointsize', str(font.pointSize()))
self.ini.set('font', 'pointsizef', str(font.pointSizeF()))
self.ini.set('font', 'fixed', "1" if font.fixedPitch() else "0")
self.ini.set('font', 'weight', str(font.weight()))
self.ini.set('font', 'italic', "1" if font.italic() else "0")
def get_font_from_ini(self, ini):
"""iniを元にフォント種類を取得"""
if ini.has_option('font', 'rawname'):
rawname = ini.get('font', 'rawname')
if rawname == "":
return None
else:
font = QtGui.QFont(rawname)
if ini.has_option('font', 'weight'):
weight = int(ini.get('font', 'weight'))
font.setWeight(weight)
if ini.has_option('font', 'pointsize'):
pointsize = int(ini.get('font', 'pointsize'))
font.setPointSize(pointsize)
if ini.has_option('font', 'italic'):
fg = True if ini.get('font', 'italic') == "1" else False
font.setItalic(fg)
if ini.has_option('font', 'fixed'):
fg = True if ini.get('font', 'fixed') == "1" else False
font.setFixedPitch(fg)
return font
else:
return None
def read_ini_file(self, ini_path):
"""iniの読み込み"""
ini = ConfigParser.SafeConfigParser()
fg = False
if os.path.exists(ini_path):
with open(ini_path, 'r') as f:
try:
ini.readfp(f)
fg = True
except IOError, inst:
sys.stderr.write(str(inst) + "\n")
if fg:
return ini
# iniが読み込めないので初期化と保存をする
ini.add_section('font')
ini.set("font", 'rawname', '')
self.write_ini_file(ini_path, ini)
return ini
def write_ini_file(self, ini_path, ini):
"""iniの保存"""
fg = False
with open(ini_path, 'w') as f:
try:
ini.write(f)
fg = True
except IOError, inst:
sys.stderr.write(str(inst) + "\n")
self.dump_ini_file(ini_path)
return fg
def dump_ini_file(self, ini_path):
"""iniファイルの内容をダンプ"""
with codecs.open(ini_path, 'r', 'utf8') as f:
try:
print f.read()
except IOError, inst:
sys.stderr.write(str(inst) + "\n")
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.