Найти - Пользователи
Полная версия: tkinter (configarser, проверка чтение запись файла)
Начало » GUI » tkinter (configarser, проверка чтение запись файла)
1 2
Ubhra
Спасибо.
Я импортировал SafeConfigParser, в разнице разобрался смутно.
И пытался изобразить подобие проверки файла на наличие и содержание.
Так же поясните насчет .open, оно если не найдет файл, то перезапишет, так? А если только чтение, то .read?
У меня python 3.3 все в нижнем регистре, только названия модулей в верхнем.
Сейчас приду с работы попробую использование .get и выложу результат.
Ubhra
Вот решил все с самого начала, по порядку:

# Порядок действий
Проверить наличие файла и содержимое
Если все хорошо 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()

Удалил конфиг файл и запустил отладку. Создало пустой файл и выкинуло ошибку, что нет section ‘set_file’. Тоесть не удалось записать.

Заменил эту часть, результат тот же:
    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()
4kpt
Чтение или для запись - управляется параметром, который передается вторым в функции open
open(file_name, param)
param может быть
“r” - только чтение текстовых данных;
“rb” - чтение в двоичном формате (необходимо, в часности, для модуля pickle);
“w” - открытие для записи только тесктовых данных;
“wb” - запись в двоичном формате (тот же pickle);
“r+”, “w+” - чтение и запись, но запись осуществляется с начала файла;
“a” - запись текстовых данных (запись в конец файла);
“a+” - чтение и запись текстовых данных (запись в конец файла);

Понятно, что можно комбинировать:
“rb+” - чтение и запись данных в двоичном формате.
Ubhra
Вот окончательный вариант.
Создает правильный файл и стартует окно.
Но при повторном запуске пишет что секции 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()
4kpt
Смотрим ниже…
4kpt
Немножко допилил. Теперь, если при закрытии корневого окна его размер изменился, новый размер будет сохранен в файл конфигурации. Комментарии написал, если что - спрашивайте…
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()
Прошу Вас не использовать инструкцию from .. import* !!!!

P.S. В моей инструкции к ConfigParser была ошибка. Исправил :) Метод .read() принимает имя файла конфигурации а не файловый дискриптор.
Ubhra
Спасибо.

Ошибка 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))
Еще state() не перезаписывает.
4kpt
Исправить строчку
full_s in ['zomed', 'normal']
На строчку
full_s in ['zoomed', 'normal']
Действие программы при закрытии окна крестиком:
root.protocol("WM_DELETE_WINDOW", lambda: save_config(True))
Лямбда позволяет передать на функцию значение. Если лямбды бы не было, то с действием связывался бы результат действия функции save_config(), что в корне неверно.

Ошибка bad geometry specifier “800x500+240.0+262.0”
Эта ошибка возникла именно у Вас, так как у Вас python 3.X. У меня такой ошибки нет, так как у меня деление на целое число всегда возращает целое число, т.е. в 2.Х это деление по модулю. Как в 3.Х я не знаю, посему…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB