Created
October 3, 2012 03:46
-
-
Save mieki256/3824884 to your computer and use it in GitHub Desktop.
Pythonでiniファイルの読み書き
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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