Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 9, 2020 08:49:50

Konstantin1984+
Зарегистрирован: 2020-02-04
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Не происходит автоматического обновления окна в Tkinter

Не могу понять в чем дело. Я хочу создать ежедневник в tkinter. Выбор года и месяца через Combobox, поставил автоматическое обновление окна, чтобы при выборе следующего месяца календарь обновлялся. Почему-то обновление происходит только один раз в соответствии с заложенными по умолчанию цифрами. Инструкции ниже.

 from tkinter import *
import tkinter.ttk as ttk
import time
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)
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
import calendar
def obnovl_kalendar():
    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)
            
            tablica.create_text(x,y,text=elem1,anchor="w",font='Roman 12',
                                justify=CENTER,fill="black")
            x=x+40
        y=y+40
root.after(100,obnovl_kalendar)
    
root.mainloop()

Офлайн

#2 Фев. 9, 2020 13:18:49

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Не происходит автоматического обновления окна в Tkinter

Konstantin1984+

 ...
        y=y+40
    root.after(100,obnovl_kalendar)#добавить
root.after(100,obnovl_kalendar)
root.mainloop()
Но ИМХО это плохая архитектура, вы по 10 раз в секунду перерисовываете канвас. Ткинтера это событийнориентированый фреймворк, следовательно нужно от этого и работать.
без всяких root.after:
 from tkinter import *
import tkinter.ttk as ttk
import time
import calendar
tek_god=time.strftime('%Y')
tek_mes=time.strftime('%m')
mesyaci=['январь','февраль','март','апрель','май','июнь','июль','август',
'сентябрь','октябрь','ноябрь','декабрь']
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='Месяц')
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 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)
            tablica.create_text(x,y,text=elem1,anchor="w",font='Roman 12',
                                justify=CENTER,fill="black")
            x=x+40
        y=y+40
obnovl_kalendar()
spisok_god.bind('<<ComboboxSelected>>', obnovl_kalendar)
spisok_mesyac.bind('<<ComboboxSelected>>', obnovl_kalendar)
root.mainloop()



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Фев. 9, 2020 13:49:25

Konstantin1984+
Зарегистрирован: 2020-02-04
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Не происходит автоматического обновления окна в Tkinter

Спасибо! Многоуважаемый PEHDOM, Вы продолжаете меня просвещать. Не подскажете, где (из каких источников) можно получить столь глубинные знания tkinter?

Офлайн

#4 Фев. 9, 2020 14:17:23

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Не происходит автоматического обновления окна в Tkinter

Konstantin1984+
Не подскажете, где (из каких источников) можно получить столь глубинные знания tkinter?
хмм, вот тут http://slav0nic.org.ua/static/books/python/ есть куча книг по пайтону вообще и ткинтеру в частности, например http://slav0nic.org.ua/static/books/python/an-introduction-to-tkinter.pdf
или вот http://effbot.org/tkinterbook/
там все подробно расписано, но ИМХО скучновато, годиться более как документация чем реальный учебник (хотя кому как).
Как учебник могу порекомендовать вот это :https://www.russianlutheran.org/python/nardo/nardo.html
очень подробно и пошагов(и на русском) расписано как програмить ГУИ на ткинтере.
Документация мастхев , как гриться:
https://docs.python.org/3/library/tkinter.html


но основное, это практика, практика, и еще раз практика



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Фев. 9, 2020 14:50:26)

Офлайн

#5 Фев. 9, 2020 17:41:41

Konstantin1984+
Зарегистрирован: 2020-02-04
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Не происходит автоматического обновления окна в Tkinter

Спасибо за ссылки!
По поводу практики, у меня новая проблема в той же программе: я хочу получить при нажатии на конкретную дату календаря вывод в нижней части окна непосредственно записей ежедневника. Делаю я это по ссылке на тег. Но что-то не выходит каменный цветочек.

f

 rom tkinter import *
import tkinter.ttk as ttk
import time
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)
import calendar
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):
            global znach_tag
            znach_tag=i*10+j
            global kletka
            kletka=tablica.create_rectangle(x,y,x+40,y+40,fill="white",
                                            tag=znach_tag)
            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
    global elem1
    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)
            x=x+40
        y=y+40
obnovl_kalendar()
spisok_god.bind('<<ComboboxSelected>>', obnovl_kalendar)
spisok_mesyac.bind('<<ComboboxSelected>>', obnovl_kalendar)
def perechen_del(event):
    tablica.itemconfig(elem1,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')
    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)
    j=2
    for i in range(18):
        delo=Entry(zapisi)
        delo.grid(row=i,column=j)
tablica.tag_bind(elem1,'<Button-1>',perechen_del)
root.mainloop()    

Офлайн

#6 Фев. 10, 2020 09:29:44

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Не происходит автоматического обновления окна в Tkinter

Метод tag_bind() позволяет привязать событие (например, щелчок кнопкой мыши) к определенной фигуре на Canvas.
tablica.tag_bind(elem1,'<Button-1>',perechen_del) привязывает событе непонятно к чему, так как elem1 на момент привязки равен ‘ ’.

 from tkinter import *
import tkinter.ttk as ttk
import time
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)
import calendar
def perechen_del(event):
    tablica.itemconfig(elem1,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')
    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)
    j=2
    for i in range(18):
        delo=Entry(zapisi)
        delo.grid(row=i,column=j)
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):
            global znach_tag
            znach_tag=i*10+j
            global kletka
            kletka=tablica.create_rectangle(x,y,x+40,y+40,fill="white",
                                            tag=znach_tag)
            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
    global elem1
    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()



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Фев. 10, 2020 16:29:50

Konstantin1984+
Зарегистрирован: 2020-02-04
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Не происходит автоматического обновления окна в Tkinter

Да, я напутал. Спасибо!

Офлайн

#8 Март 7, 2020 17:19:18

Arushi
Зарегистрирован: 2020-03-07
Сообщения: 12
Репутация: +  -1  -
Профиль   Отправить e-mail  

Не происходит автоматического обновления окна в Tkinter

Спасибо за ссылки!
пригодятся обязательно

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version