Форум сайта python.su
Спасибо.
Я импортировал SafeConfigParser, в разнице разобрался смутно.
И пытался изобразить подобие проверки файла на наличие и содержание.
Так же поясните насчет .open, оно если не найдет файл, то перезапишет, так? А если только чтение, то .read?
У меня python 3.3 все в нижнем регистре, только названия модулей в верхнем.
Сейчас приду с работы попробую использование .get и выложу результат.
Офлайн
Вот решил все с самого начала, по порядку:
# Порядок действий
Проверить наличие файла и содержимое
Если все хорошо read()
Иначе rewrite()
Чтение файла и конфигурирование окна
# Импорт from tkinter import * from configparser import * import os mainframe = Tk() mainframe.title("Name") parser = ConfigParser() # Проверить наличие файла и содержимое if os.path.exists('default.cfg'): if 800 <= int(parser.get('set_file','s_width')) <= 1980: if 500 <= int(parser.get('set_file','s_height')) <= 1920: if int(parser.get('set_file','s_full')) in [0, 1]: pass else: # Перезапись в этом же условии open('default.cfg','w', encoding="utf-8") parser.add_section('set_file') parser.set(section='set_file', option='s_height', value='500') parser.set(section='set_file', option='s_width', value='800') # << построение окна parser.read('default.cfg') mainframe_x = parser.get('set_file','s_width') mainframe_y = parser.get('set_file','s_height') mainframe_screen = parser.get('set_file','s_full') if int(mainframe_screen) == 1: mainframe.state('zoomed') else: pass mainframe_width = (mainframe.winfo_screenwidth() / 2 - int(mainframe_x) / 2) mainframe_heigth = (mainframe.winfo_screenheight() / 2 - int(mainframe_y) / 2) mainframe.geometry("%dx%d+%d+%d" % (int(mainframe_x), int(mainframe_y), mainframe_width, mainframe_heigth)) mainframe.mainloop()
parser.add_section('set_file') parser.set(section='set_file', option='s_height', value='500') parser.set(section='set_file', option='s_width', value='800') parser.set(section='set_file', option='s_full', value='0') with open('default.cfg','w', encoding="utf-8") as file_cf: parser.write(file_cf) file_cf.close()
Отредактировано Ubhra (Март 11, 2013 19:30:35)
Офлайн
Чтение или для запись - управляется параметром, который передается вторым в функции open
open(file_name, param)
Отредактировано 4kpt (Март 11, 2013 19:35:03)
Офлайн
Вот окончательный вариант.
Создает правильный файл и стартует окно.
Но при повторном запуске пишет что секции set_file нет.
# Импорт from tkinter import * from configparser import * import os mainframe = Tk() mainframe.title("Name") parser = ConfigParser() # Проверить наличие файла и содержимое if os.path.exists('default.cfg'): if 800 <= int(parser.get('set_file','s_width')) <= 1980: if 500 <= int(parser.get('set_file','s_height')) <= 1920: if int(parser.get('set_file','s_full')) in [0, 1]: pass else: # Перезапись в этом же условии parser.add_section('set_file') parser.set(section='set_file', option='s_height', value='500') parser.set(section='set_file', option='s_width', value='800') parser.set(section='set_file', option='s_full', value='0') with open('default.cfg','w', encoding="utf-8") as file_cf: parser.write(file_cf) file_cf.close() # << построение окна parser.read('default.cfg') mainframe_x = parser.get(section='set_file', option='s_width') mainframe_y = parser.get(section='set_file', option='s_height') mainframe_screen = parser.get(section='set_file', option='s_full') if int(mainframe_screen) == 1: mainframe.state('zoomed') else: pass mainframe_width = (mainframe.winfo_screenwidth() / 2 - int(mainframe_x) / 2) mainframe_heigth = (mainframe.winfo_screenheight() / 2 - int(mainframe_y) / 2) mainframe.geometry("%dx%d+%d+%d" % (int(mainframe_x), int(mainframe_y), mainframe_width, mainframe_heigth)) mainframe.mainloop()
Отредактировано Ubhra (Март 11, 2013 19:40:56)
Офлайн
Смотрим ниже…
Отредактировано 4kpt (Март 11, 2013 21:34:28)
Офлайн
Немножко допилил. Теперь, если при закрытии корневого окна его размер изменился, новый размер будет сохранен в файл конфигурации. Комментарии написал, если что - спрашивайте…
import Tkinter import ConfigParser import os root = Tkinter.Tk() root.title("Name") # Сохраниеи конфигурации при отсутствии файла, неверных данных в файле или # при закрытии окна... def save_config(event=False): values = [str(width), str(height), full_s] if event: # Проверка изменений параметров окна... if (root.winfo_width() != width or root.winfo_height() != height or root.state() != full_s): values = [str(root.winfo_width()), str(root.winfo_height()), root.state()] root.destroy() parser = ConfigParser.ConfigParser() parser.add_section('set_file') for option, value in zip(['s_width', 's_height', 's_full'], values): parser.set('set_file', option, value) with open('default.ini','w') as file_cf: parser.write(file_cf) # Проверка файла конфигурации if os.path.exists('default.ini'): parser = ConfigParser.ConfigParser() parser.read('default.ini') width = parser.getint('set_file','s_width') height = parser.getint('set_file','s_height') full_s = parser.get('set_file','s_full') if not (800 <= width <= 1980 and 500 <= height <= 1920 and full_s in ['zomed', 'normal']): width, height, full_s = (800, 500, 'normal') save_config() else: width, height, full_s = (800, 500, 'normal') save_config() # Построение окна geom = "%sx%s+%s+%s" %(width, height, root.winfo_screenwidth() / 2 - width / 2, root.winfo_screenheight() / 2 - height / 2) root.state(full_s) root.geometry(geom) root.protocol("WM_DELETE_WINDOW", lambda: save_config(True)) root.mainloop()
Отредактировано 4kpt (Март 11, 2013 21:28:33)
Офлайн
Спасибо.
Ошибка bad geometry specifier “800x500+240.0+262.0”
Заменил:
geom = "%sx%s+%s+%s" %(width, height, root.winfo_screenwidth() / 2 - width / 2, root.winfo_screenheight() / 2 - height / 2)
geom = "%sx%s+%s+%s" %(width, height, int(root.winfo_screenwidth() / 2 - width / 2), int(root.winfo_screenheight() / 2 - height / 2))
root.protocol("WM_DELETE_WINDOW", lambda: save_config(True))
Отредактировано Ubhra (Март 12, 2013 07:03:43)
Офлайн
Исправить строчку
full_s in ['zomed', 'normal']
full_s in ['zoomed', 'normal']
root.protocol("WM_DELETE_WINDOW", lambda: save_config(True))
Офлайн