Найти - Пользователи
Полная версия: tkinter (configarser, проверка чтение запись файла)
Начало » GUI » tkinter (configarser, проверка чтение запись файла)
1 2
Ubhra
Добрый день.
Только учусь.
Пытаюсь создать окно с параметрами из cfg файла (ширина, высота + фулскрин).
Окно создается всегда в центре экрана, размеры из cfg.
Пока не знаю как открывать окно развернутым (не на весь экран, а именно развернутым, но опять же по условию, если разрешение экрана не превысит 1980x1920).
Долго переставлял все с места на место. PyScripter пару раз при отладке зависал, даже раз винду повесил.
Пока что использую только то, что хоть частично, но понял.
Удаляет и создает cfg файл нормально. А вот попробовал руками записать в него в первое значение 10, а во второе 4000 (заведомо не верные) и винда сдохла.
from tkinter import *
from configparser import SafeConfigParser
import os
# перезапись конфиг файла
def rewrite():
    if os.path.exists('default.cfg'):
        cf = open('default.cfg')
        cf.close()
        os.remove('default.cfg')
        cf=open('default.cfg','w', encoding="utf-8")
        cf.write('[set_file]\ns_height=500\ns_width=800\ns_full=0')
        cf.close()
    else:
        cf=open('default.cfg','w', encoding="utf-8")
        cf.write('[set_file]\ns_height=500\ns_width=800\ns_full=0')
        cf.close()
# выход из программы
def quick_quit():
    mainframe.destroy()
mainframe = Tk()
mainframe.title("Name")
# чтение конфиг файла
mainframe.minsize(800,500)
mainframe.maxsize(1980,1020)
parser = SafeConfigParser()
parser.read('default.cfg')
# << проверка значений
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 0 <= int(parser.get('set_file','s_full')) <= 1:
                pass
else:
    rewrite()
# << построение окна
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')
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
Вы очень сумбурно написали, но если я Вас правильно понял, то Вам необходимо вот-это:
mainframe.state("zoomed")
За счет maxsize и minsize Вы сможете регулировать размер развернутого окна (если оно Вам не надо во весь экран).
Если есть еще вопросы, напишите, пожалуйста, яснее :)
4kpt
Еще убила эта строка :)
if 0 <= int(parser.get('set_file','s_full')) <= 1:
И вот эти две строки зачем?
cf = open('default.cfg')
cf.close()
4kpt
Напишите, чего Вы в итоге хотите добиться?
Кроме того
def rewrite():
    if os.path.exists('default.cfg'):
        os.remove('default.cfg')
    cf=open('default.cfg','w', encoding="utf-8")
    cf.write('[set_file]\ns_height=500\ns_width=800\ns_full=0')
    cf.close()
Ubhra
Спасибо.
Вставил в код, заработало.
# << построение окна
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
Добиться хочу, что бы при запуске окна, оно значения брало из cfg файла (zumed, ширину, высоту)
А при закрытии записывало значения в файл (пока не дописал).
Проблема в основном в том, что бы проверять наличие файла, кодировку, валидность значений в диапазоне (в общем что cfg файл правильный) иначе затирать и писать новый с дефолтными значениями.
П.С. Та строка что убила, работает )))
4kpt
Строку, что убила, заменить на:
if int(parser.get('set_file','s_full')) in [0, 1]:
4kpt
Скиньте, мне, пожалуйста Ваш конфиг…
Ubhra
Вот
[set_file]
s_height=500
s_width=800
s_full=1
4kpt
Ubhra
Вы немного неправильно работаете с configparser.
Я уже разобрался по документации как надо работать.
Сейчас срочно убегаю. Нужно забрать подарок на 8 марта.
Напишу через 1,5 - 2 часа.
Хотите подождите, хотите - посмотрите решения завтра.
4kpt
Приношу свои извинения за несвоевременность…
За это привожу полное пояснение использования модуля ConfigParser.
Смотрите по этапам.

1. Импортируем модуль ConfigParser.
from ConfigParser import ConfigParser
2. Создаем экземпляр класса для последующего наполнения.
cfg = ConfigParser()
3. Создаем необходимые секции для отдельных параметров конфигурации.
cfg.add_section("root")
4. Заполняем секцию параметрами, которые необходимо сохранить.
Хотелось бы отметить, что можно использовать не именнованые, а позиционные параметры.
cfg.set(section="root", option="height", value="400")
cfg.set(section="root", option="width", value="400")
5. Открываем файл и сохраняем данные конфигурации.
with open("config_prg.ini" "w") as file_:
    cfg.write(file_)
Таким образом Вы получаете файл конфигурации, который могут использовать другие программы, которые написаны не только на python.

Обратная операция выполняется похожим образом :)

1. Создаем экземпляр класса для получения данных из конфигурационного файла.
cfg = ConfigParser()
2. Считываем данные с файла конфигурации напрямую!!!.
cfg.read("config_prg.ini")
3. Можем теперь получить данные из файла.
Акцентирую внимание, что возможно использование позиционных параметров.
cfg.get(section="root", option="width")
Поддерживаются следующие методы получения данных:
.get() - получение данных опции в виде строковой переменной;
.getint() - получение данных опции в виде целого числа;
.getfloat() - получение данных опции в виде дробного числа;
.getboolean() - получение данных опции в виде булевого числа (правда или ложь) - подходит Вам под последний параметр.
Надеюсь я все написал понятно. Переделывайте Ваш файл и выкладывайте. Я его, возможно, еще подпилю.

P.S. У меня python 2.X. Если у Вас 3.X то модуль необходимо называть так-же но без заглавных букв, т.е. название должно быть в малом регистре.
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