Найти - Пользователи
Полная версия: Проблема с автоматическим заполнением строк-виджетов в tkinter
Начало » Python для новичков » Проблема с автоматическим заполнением строк-виджетов в tkinter
1
Konstantin1984+
Я задумал сделать программу-ежедневник. При нажатии на конкретную дату календаря должна появляться форма для заполнения. Форма появляется, но есть две проблемы. Первая - при вводе информации в строки ежедневника, сохраняется только значение последней строки, которое потом автоматом переходит на другие строки. Вторая проблема в том, что надо как-то сделать чтобы при переходе на другой день значения не дублировались, а была возможность создавать новые значения.

 from tkinter import *
import tkinter.ttk as ttk
import time
import calendar
tek_god=time.strftime('%Y')
tek_mes=time.strftime('%m')
root=Tk()
root.title('Ежедневник')
spiski=Frame(root)
nadp1=Label(spiski,text='Год')
spisok_god=ttk.Combobox(spiski,height=6,
                        values=[2019,2020,2021,2022,2023,2024])
spisok_god.set(tek_god)
nadp2=Label(spiski,text='Месяц')
mesyaci=['январь','февраль','март','апрель','май','июнь','июль','август',
'сентябрь','октябрь','ноябрь','декабрь']
spisok_mesyac=ttk.Combobox(spiski,height=12,values=mesyaci)
spisok_mesyac.set(mesyaci[int(tek_mes)-1])
tablica=Canvas(width=280,height=260,bg='gray80')
zapisi=Frame(root,bg='white')
spiski.grid(row=0,column=1)
tablica.grid(row=1,column=1)
zapisi.grid(row=2,column=1)
nadp1.grid(row=0,column=1)
spisok_god.grid(row=0,column=2)
nadp2.grid(row=1,column=1)
spisok_mesyac.grid(row=1,column=2)
def perechen_del(event):
    #tablica.itemconfig(event.widget,fill='red')
    nadp_zapisi1=Label(zapisi,text='09.00-09.30')
    nadp_zapisi2=Label(zapisi,text='09.30-10.00')
    nadp_zapisi3=Label(zapisi,text='10.00-10.30')
    nadp_zapisi4=Label(zapisi,text='10.30-11.00')
    nadp_zapisi5=Label(zapisi,text='11.00-11.30')
    nadp_zapisi6=Label(zapisi,text='11.30-12.00')
    nadp_zapisi7=Label(zapisi,text='12.00-12.30')
    nadp_zapisi8=Label(zapisi,text='12.30-13.00')
    nadp_zapisi9=Label(zapisi,text='13.00-13.30')
    nadp_zapisi10=Label(zapisi,text='13.30-14.00')
    nadp_zapisi11=Label(zapisi,text='14.00-14.30')
    nadp_zapisi12=Label(zapisi,text='14.30-15.00')
    nadp_zapisi13=Label(zapisi,text='15.00-15.30')
    nadp_zapisi14=Label(zapisi,text='15.30-16.00')
    nadp_zapisi15=Label(zapisi,text='16.00-16.30')
    nadp_zapisi16=Label(zapisi,text='16.30-17.00')
    nadp_zapisi17=Label(zapisi,text='17.00-17.30')
    nadp_zapisi18=Label(zapisi,text='17.30-18.00')
    knopka=Button(zapisi,text='Сохранение')
    nadp_zapisi1.grid(row=0,column=1)
    nadp_zapisi2.grid(row=1,column=1)
    nadp_zapisi3.grid(row=2,column=1)
    nadp_zapisi4.grid(row=3,column=1)
    nadp_zapisi5.grid(row=4,column=1)
    nadp_zapisi6.grid(row=5,column=1)
    nadp_zapisi7.grid(row=6,column=1)
    nadp_zapisi8.grid(row=7,column=1)
    nadp_zapisi9.grid(row=8,column=1)
    nadp_zapisi10.grid(row=9,column=1)
    nadp_zapisi11.grid(row=10,column=1)
    nadp_zapisi12.grid(row=11,column=1)
    nadp_zapisi13.grid(row=12,column=1)
    nadp_zapisi14.grid(row=13,column=1)
    nadp_zapisi15.grid(row=14,column=1)
    nadp_zapisi16.grid(row=15,column=1)
    nadp_zapisi17.grid(row=16,column=1)
    nadp_zapisi18.grid(row=17,column=1)
    knopka.grid(row=18,column=1)
    j=2
    for i in range(18):
        znach=StringVar()
        delo=Entry(zapisi,textvariable=znach)
        delo.grid(row=i,column=j)
        f=open('/home/konstantin/Рабочий стол/Документы Python/Вторая программа.py','r',encoding='utf-8')
        stroki=f.readlines()
        f.close()
        znach.set(stroki[i][0:-1])
        
        def vvod(event):
            for y in range(18):
                widget=zapisi.grid_slaves(row=y, column=2)[0]
                widget.configure(textvariable=znach)
                slova=znach.get()
                if y==0:
                    g=open('/home/konstantin/Рабочий стол/Документы Python/Вторая программа.py','w',encoding='utf-8')
                    g.write(slova+'\n')
                    g.close()
                if y>0:
                    g=open('/home/konstantin/Рабочий стол/Документы Python/Вторая программа.py','a',encoding='utf-8')
                    g.write(slova+'\n')
                    g.close()
        knopka.bind('<Button-1>',vvod)
def obnovl_kalendar(e=None):
    tablica.delete('all')
    global mesyaci
    god=int(spisok_god.get())
    mesyac=spisok_mesyac.get()
    mesyac_chislo=mesyaci.index(mesyac)+1
    c=calendar.Calendar(0)
    kalendar=c.monthdayscalendar(god, mesyac_chislo)
    x=0;y=0
    for n in range(7):
        dni=tablica.create_rectangle(x,y,x+40,y+20,fill="white")
        x=x+40
    y=y+20
    for i in range(6):
        x=0
        for j in range(7):
            kletka=tablica.create_rectangle(x,y,x+40,y+40,fill="white")
            x=x+40
        y=y+40
    dni_nedeli=['Пн','Вт','Ср','Чт','Пт','Сб','Вс']
    x=10;y=10
    for elem in dni_nedeli:
        tablica.create_text(x,y,text=elem,anchor="w",font='Roman 12',
                            justify=CENTER,fill="black")
        x=x+40
    y=40
    for elem in kalendar:
        x=10
        for elem1 in elem:
            if elem1==0:elem1=''
            elif elem1<10:elem1=' '+str(elem1)
            chislo=tablica.create_text(x,y,text=elem1,anchor="w",
                                       font='Roman 12',justify=CENTER,
                                       fill='black',tag=elem1)
            tablica.tag_bind(chislo,'<Button-1>',perechen_del)
            x=x+40
        y=y+40
obnovl_kalendar()
spisok_god.bind('<<ComboboxSelected>>', obnovl_kalendar)
spisok_mesyac.bind('<<ComboboxSelected>>', obnovl_kalendar)
root.mainloop()   
PEHDOM
.
Konstantin1984+
Первая - при вводе информации в строки ежедневника, сохраняется только значение последней строки, которое потом автоматом переходит на другие строки.
вот это
 widget.configure(textvariable=znach)
Вы все виджеты связываете с одной StringVar, вот и получается что после первого нажатия “сохранить”, все виджеты у вас дублируют значения.. Почему не делать просто slova=widget.get()?

Konstantin1984+
Вторая проблема в том, что надо как-то сделать чтобы при переходе на другой день значения не дублировались, а была возможность создавать новые значения.
ну так нужно хранить их так чтобы было понятно к какому дню они относятся. У вас оно храниться просто в виде:
 строка1 
строка2
строка3
... строкаN
нужно хотябы чтобы както так:
 [2020.02.01]
1=строка1
2=строка2
3=...
N=строкаN
[2020.02.02]
1=строка1
2=строка2
3=...
N=строкаN
ну и тд, это в самом простом случае.
Тогда можно будет понимать какой это день недели, и какое время.
Хотя ИМХО я бы брал для этого какуюнить БД типа SQLite или Firebird, потому как это не те данные чтобы хранить их в тектовом файле… один день, два, семь еще ничего, а за пол-года это уже over 3000 строк plain text. Опять же работать неудобно, пока вы только добавляете записи в конец файла, а если нужно будет, например поменять заплпнированое задание на 20-е число, при том что у вас уже все распланировано до 30-го? Это нужно весь файл вычитывать, менять нужную строку и заново весь файл записывать.
Konstantin1984+
g=open('/home/konstantin/Рабочий стол/Документы Python/Вторая программа.py','w',encoding='utf-8')
абсолютные пути зло, если хотите чтобы данные хранились в домашней папке пользователя, используйте переменные окружения типа $HOME - os.environ.get('HOME')




Konstantin1984+
Спасибо!
Konstantin1984+
Еще один вопрос. Не могу понять, как компьютеру в моей программе объяснить, что при нажатии на первый день календаря нужно читать первые 18 строк файла с данными, а при нажатии на второй день - вторые 18 строк файла с данными (то есть как вообще привязаться к виджету-дате)?
PEHDOM
Konstantin1984+
Не могу понять, как компьютеру в моей программе объяснить, что при нажатии на первый день календаря нужно читать первые 18 строк файла с данными, а при нажатии на второй день - вторые 18 строк файла с данными (то есть как вообще привязаться к виджету-дате)
вот, это уже косяки архитектуры, когда сначала рисуются окошечко а потом придумывается каким костылем к ним чегото прикрутить…
для начала вам нужно понять по какому элементу на канвасе щелкнули мышкой, и понять какой день месяца он из себя представляет, например так:
 def perechen_del(event)
    item = tablica.find_closest(event.x, event.y)
    print(tablica.gettags(item))
у вас после клика мышкой,например по 9-му дню должно вывести ('9', ‘current’)
А зная день месяца можно при считывании из файла или пропустить N*18 строк, или считать все и взять срез N*18-1 : (N+1)*18
Rafik
Намного проще будет, если завести базу данных, например на sqlite. Не придётся перелопачивать содержимое текстового файла, чтобы внести изменения в него. Всем этим будет заниматься драйвер БД, достаточно будет только указать какую запись править или добавить.
Konstantin1984+
Спасибо!
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