Escopo


  • Desenvolver um programa que construa uma Agenda que permita gerir atividades diárias.

Funcionalidades


  • Marcar atividades da semana
  • Mostrar atividades no dia
  • Mostrar atividades na semana
  • Excluir atividades específicas
  • Alterar descrição das atividades lançadas
  • Mostrar atividades por pessoa
  • Alarmar em datas específicas (*)
  • Nova funcionalidade:
    • Criar botão: Mostrar Agenda de Hoje
    • Ao clicar, aparecerá todas as atividades de hoje


Código


17/07/2017

*mudança de nome de janela de "eventos da semana" por "eventos do dia". <syntaxhighlight lang="py" line="1"> import winsound import time from datetime import datetime, timedelta from threading import Timer from tkinter import ttk from tkinter import *

primeiraExecucao = True

  1. task eh uma tarefa que agenda uma outra chamada de si mesma a cada 10s
  2. e verifica se algum alarme tem q ser disparado

def task():

   checkarAlarme()           # verifica se um alarme tem q ser disparado
   return
  1. ativa o despertador

def desp(mensagem):

   ultimo = 0
   # fecha a janela e para as repeticoes da musica
   def desligar():
       janelacriar.after_cancel(ultimo)
       janelacriar.destroy()
       return
   # toca uma musica especifica a cada 10000s
   def tocar():
       # winsound.Beep(1000,1000) # frequencia, duracao do alarme
       winsound.PlaySound('pow.wav', winsound.SND_FILENAME)
       ultimo = janelacriar.after(10000, tocar)
       return
   janelacriar = Tk()             # cria uma nova janela
   janelacriar.geometry("200x80") # dimensoes largura x altura da janela
   janelacriar.title("ALARME!!!") # nome da janela
   # mensagem eh a mensagem escrita na janela, se for vazia troca pra "(sem descricao)"
   if mensagem == :
       mensagem = "(Sem descricao)"
   # imprime a mnsagem na tela
   msg = Label(janelacriar, text = mensagem, font = "Times 10").place(x = 1, y = 1)
   # adicioa um botao que, quando clicado, chama a funcao desligar() dentro dessa funcao
   btnadd = Button(janelacriar, text = "Desligar", font = "Times ", command = desligar).place(x = 135, y = 45)
   ultimo = janelacriar.after(500, tocar)
   janelacriar.mainloop()
   return
  1. funcao que verifica se tem que disparar algum alarme
  2. a flag semhorario representa se tem que despertar os eventos sem horario especificos (usando so a data) ou nao

def checkarAlarme():

   janela.after(10000, task)
   global primeiraExecucao # variavel global que me fala se tenho q disparar os alarmes de hj mas sem horario ou nao
   # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # datetime retorna a data atual
   hoje = datetime.now()
   for i in t:
       j = i.split(';')
       if len(j) < 6: # linha de arquivo invalida
           continue
       if j[5] == "S": # verifica se o alarme do evento esta ativado
           data = j[2].split('/') # j[2] eh a data do evento
           if len(data) == 3:
               dia = int(data[0])
               mes = int(data[1])
               ano = int(data[2])
               if dia == hoje.day and mes == hoje.month and ano == hoje.year:
                   horario = j[3].split(':') # j[3] eh o horario do evento
                   if len(horario) == 2:
                       hora = int(horario[0])
                       minutos = int(horario[1])
                       dt = datetime(ano, mes, dia, hora, minutos)
                       # verifica se o alarme deveria ter sido disparado ha menos de 10 segundo
                       if (hoje-dt).seconds >= 0 and (hoje-dt).seconds <= 12:
                           desp(j[1]) # dispara o alarme com a mensagem de descricao do evento
                   # verifica se eh pra despertar os eventos sem horario especifico (considerando so a data):
                   elif primeiraExecucao:
                       primeiraExecucao = False
                       desp(j[1]) # dispara o alarme com a mensagem de descricao do evento
   return


  1. FUNCAO PRA CHECKAR SE A ENTRADA EH VALIDA

def dadosValidos(usuario, descricao, data, hora, local, alarme):

   # funcao que verifica se um ano eh bissexto
   def bissexto(ano):
       if ano % 4 != 0 or (ano % 100 == 0 and ano % 400 != 0):
           return False
       return True
   # funcao que verifica se uma string representa um numero inteiro
   def inteiro(s):
       for i in range(len(s)):
           if s[i] < '0' or s[i] > '9':
               return False
       return True
   # se a data nao for vazia, verifica se eh uma data valida
   if data != :
       lista = data.split('/')
       # verifica se tem 3 campos separados por '/'
       if len(lista) != 3:
           return False
       dia = lista[0]
       mes = lista[1]
       ano = lista[2]
       # verifica se todos os campos sao inteiros
       if not inteiro(dia) or not inteiro(mes) or not inteiro(ano):
           return False
       dia = int(dia)
       mes = int(mes)
       ano = int(ano)
       # verifica se a data eh valida
       if dia<1 or dia>31 or mes<1 or mes>12 or ano<2017 or ((mes==4 or mes==6 or mes==9 or mes==1) and dia>30) or (mes==2 and dia>29) or (mes==2 and not bissexto(ano) and dia>28):
           return False
   # se a hora nao for vazia, verifica se eh valida (valores entre 00:00 e 23:59)
   if hora != :
       lista = hora.split(':')
       if len(lista) != 2:
           return False
       hora = lista[0]
       minuto = lista[1]
       if not inteiro(hora) or not inteiro(minuto):
           return False
       hora = int(hora)
       minuto = int(minuto)
       if hora < 0 or hora > 23 or minuto < 0 or minuto > 59:
           return False
   # se o alarme nao for vazio, verifica se eh valido (igual a "S" ou "N")
   if alarme != :
       if alarme != "S" and alarme != "N":
           return False
   return True


  1. FUNCAO PARA CRIAR UM EVENTO;

def criar():

   def adicionar():
       usuario = ausuario.get()     # pega o texto digitados na box usuario
       descricao = adescricao.get() # pega o texto digitado na box descricao
       data = adata.get()           # ...
       hora = ahora.get()
       local = alocal.get()
       alarme = aalarme.get()
       # verifica se os dados sao validos, se nao for nao faz adiciona
       if not dadosValidos(usuario, descricao, data, hora, local, alarme):
           return
       # cria uma lista com os dados
       lista = []
       lista.append(usuario + ';')
       lista.append(descricao + ';')
       lista.append(data +';')
       lista.append(hora + ';')
       lista.append(local + ';')
       lista.append(alarme + ';')
       # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
       arquivo=open('documents.txt', 'r')
       t = arquivo.readlines()
       arquivo.close()
       # jaExiste indica se tem um elemento igual na tabela
       # se ja exisitr, nao insere porque nao podem ter elementos duplicados
       jaExiste = False
       for i in t:
           j = i.split(';')
           if len(j) < 6: # linha de arquivo invalida
               continue
           # verifica se todas as informacoes da nova linha sao iguais a alguma linha ja existente
           if j[0] == usuario and j[1] == descricao and j[2] == data and j[3] == hora and j[4] == local and j[5] == alarme:
               jaExiste = True
               break
       # se ja existir ou se todas as informacoes forem vazias, nao insere de novo
       if jaExiste or (usuario ==  and descricao ==  and data ==  and hora ==  and local ==  and alarme == ):
           return
       # abre arquivo com opcao de "append" = concatenacao e adiciona a nova linha no final do arquivo
       arquivo = open('documents.txt', 'a')
       arquivo.writelines(lista)
       arquivo.write("\n")
       arquivo.close()
       # adiciona uma nova linha na tabela tambem
       tabela.insert("",'end',values=(usuario, descricao, data, hora, local, alarme))
       janelacriar.destroy()
       return
   janelacriar = Tk()                    # cria nova janela
   janelacriar.geometry("280x200")       # dimensoes largura x altura da janela
   janelacriar.title("Adicionar evento") # nome da janela
   # cria as boxes de preencher e da um nome pra cada uma delas:
   usuario = Label(janelacriar, text = "Usuario:").place(x = 5, y = 5)
   ausuario = Entry(janelacriar)
   ausuario.place(x = 100, y = 5)
   descricao = Label(janelacriar, text = "Descricao:").place(x = 5, y = 30)
   adescricao = Entry(janelacriar)
   adescricao.place(x = 100, y = 30)
   data = Label(janelacriar, text = "Data:").place(x = 5, y = 55)
   adata = Entry(janelacriar)
   adata.place(x = 100, y = 55)
   Exemplo = Label(janelacriar, text = "(DD/MM/AAAA)", font = "Times 5").place(x = 225, y = 60)
   hora = Label(janelacriar, text = "Horario").place(x = 5, y = 80)
   ahora = Entry(janelacriar)
   ahora.place(x = 100, y = 80)
   local = Label(janelacriar, text = "Local:").place(x = 5, y = 105)
   alocal = Entry(janelacriar)
   alocal.place(x = 100, y = 105)
   alarme = Label(janelacriar, text = "Alarme:").place(x = 5, y = 130)
   aalarme = Entry(janelacriar)
   aalarme.place(x = 100, y = 130)
   Exemplo = Label(janelacriar, text = "(S/N)", font = "Times 5").place(x = 225, y = 135)
   # cria um botao que, quando clicado, chama a funcao adicionar() que ta dentro dessa funcao
   btnadd = Button(janelacriar, text = "Confirmar", font = "Times ", command = adicionar).place(x = 200, y = 160)
   janelacriar.mainloop()
   return
  1. FUNCAO PARA PESQUISAR UM EVENTO;

def pesquisar():

   def achar():
       j = []
       usuario = ausuario.get()      # pega o texto digitado na box usuario
       descricao = adescricao.get()  # pega o texto digitado na box descricao
       data = adata.get()            # ...
       hora = ahora.get()
       local = alocal.get()
       alarme = aalarme.get()
       if not dadosValidos(usuario, descricao, data, hora, local, alarme):
           return
       # abre o arquivo com opcao de leitura, copia em t e fecha o arquivo
       arquivo = open('documents.txt', 'r')
       t = arquivo.readlines()
       arquivo.close()
       # apaga a tabelapesquisar
       tabelapesquisar.delete(*tabelapesquisar.get_children())
       # reinsere apenas as linhas que correspondem a busca
       for i in t:
           j = i.split(';')
           if len(j) < 6: # linha de arquivo invalida
               continue
           # se as informacoes da linha baterem com a pesquisa do usuario, adiciona na tabela
           if (j[0] == usuario or usuario == ) and (j[1] == descricao or descricao == ) and (j[2] == data or data ==) and (j[3] == hora or hora == ) and (j[4] == local or local == ) and (j[5] == alarme or alarme == ):
               tabelapesquisar.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5]))
   janelapesquisar = Tk()              # cria uma nova janela
   janelapesquisar.geometry("750x600") # dimensoes largura x altura da janela
   janelapesquisar.title("Pesquisar")  # nome da janela
   # cria as boxes de preencher e da um nome pra cada uma delas:
   usuario = Label(janelapesquisar, text = "Usuario:").place(x = 1, y = 430)
   ausuario = Entry(janelapesquisar)
   ausuario.place(x = 100, y = 430)
   descricao = Label(janelapesquisar, text = "Descricao:").place(x = 1, y = 455)
   adescricao = Entry(janelapesquisar)
   adescricao.place(x = 100, y = 455)
   data = Label(janelapesquisar, text = "Data:").place(x = 1, y = 480)
   adata = Entry(janelapesquisar)
   adata.place(x = 100, y = 480)
   Exemplo = Label(janelapesquisar, text = "(DD/MM/AAAA)", font = "Times 5").place(x = 225, y = 485)
   hora = Label(janelapesquisar, text = "Horario:").place(x = 1, y = 505)
   ahora = Entry(janelapesquisar)
   ahora.place(x = 100, y = 505)
   local = Label(janelapesquisar, text = "Local:").place(x = 1, y = 530)
   alocal = Entry(janelapesquisar)
   alocal.place(x = 100, y = 530)
   alarme = Label(janelapesquisar, text = "Alarme:").place(x = 1, y = 555)
   aalarme = Entry(janelapesquisar)
   aalarme.place(x = 100, y = 555)
   Exemplo = Label(janelapesquisar, text = "(S/N)", font = "Times 5").place(x = 225, y = 560)
   # cria uma nova tabela treeview que vai ter os resultados da busca
   tabelapesquisar = ttk.Treeview(janelapesquisar, selectmode = 'browse', show = 'headings', height = 20)
   tabelapesquisar.place(x= 0, y = 0)
   tabelapesquisar["columns"] = ("0","1", "2", "3", "4", "5")
   tabelapesquisar['show'] = 'headings'
   # define nome - largura de cada coluna
   tabelapesquisar.column("0", width=125, anchor='c')
   tabelapesquisar.column("1", width=125, anchor='c')
   tabelapesquisar.column("2", width=125, anchor='c')
   tabelapesquisar.column("3", width=125, anchor='c')
   tabelapesquisar.column("4", width=125, anchor='c')
   tabelapesquisar.column("5", width=125, anchor='c')
   # abre arquivo com opcao de leitra, copia sobre t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # inicialmente a tabelapesquisar tem todos os dados
   for i in t:
       j = i.split(';')
       if len(j) < 6: # linha de arquivo invalida
           continue
       if dadosValidos(j[0], j[1], j[2], j[3], j[4], j[5]):
           tabelapesquisar.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5]))
   # cria um botao que, quando clicado, chama a funcao achar() que ta dentro dessa funcao
   g = Button(janelapesquisar, text = "Confirmar", font = "Times ", command = achar).place(x = 670, y = 560)
   # cabecalhos da tabela
   tabelapesquisar.heading("0", text="Usuario")
   tabelapesquisar.heading("1", text="Descricao")
   tabelapesquisar.heading("2", text="Data")
   tabelapesquisar.heading("3", text="Hora")
   tabelapesquisar.heading("4", text="Local")
   tabelapesquisar.heading("5", text="Alarme")
   return
  1. FUNCAO PARA MOSTRAR A AGENDA DE HOJE;

def mostrarHoje():

   janelaHoje = Tk()                     # cria nova lanela
   janelaHoje.geometry("750x425")        # dimensoes largura x altura da janela
   janelaHoje.title("Eventos da Semana") # nome da janela
   # cria uma nova tabela treeview que vai ter os eventos com a data de hj
   tabelaHoje = ttk.Treeview(janelaHoje, selectmode = 'browse', show = 'headings', height = 20)
   tabelaHoje.place(x = 0, y = 0)
   tabelaHoje["columns"] = ("0","1", "2", "3", "4", "5")
   tabelaHoje['show'] = 'headings'
   # define nome - largura de cd coluna
   tabelaHoje.column("0", width=125, anchor='c')
   tabelaHoje.column("1", width=125, anchor='c')
   tabelaHoje.column("2", width=125, anchor='c')
   tabelaHoje.column("3", width=125, anchor='c')
   tabelaHoje.column("4", width=125, anchor='c')
   tabelaHoje.column("5", width=125, anchor='c')
   # abre arquivo, copia sobre t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # datetime.now() retorna a data atual
   hoje = datetime.now()
   for i in t:
       j = i.split(';')
       if len(j) < 6: # linha de arquivo invalida
           continue
       lista = j[2].split('/') # a coluna j[2] eh a que representa a data na tabela
       if len(lista) == 3:
           dia = int(lista[0]) # pega o dia, mes e ano da data
           mes = int(lista[1])
           ano = int(lista[2])
           if dia == hoje.day and mes == hoje.month and ano == hoje.year: # se as datas forem iguais, adiciona na linha
               tabelaHoje.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5]))
   # cabecalhos da nova tabela
   tabelaHoje.heading("0", text="Usuario")
   tabelaHoje.heading("1", text="Descricao")
   tabelaHoje.heading("2", text="Data")
   tabelaHoje.heading("3", text="Hora")
   tabelaHoje.heading("4", text="Local")
   tabelaHoje.heading("5", text="Alarme")
   return
  1. FUNCAO PARA MOSTRAR A AGENDA DA SEMANA;

def mostrarSemana():

   janelaSemana = Tk()                     # cria nova lanela
   janelaSemana.geometry("750x425")        # dimensoes largura x altura da janela
   janelaSemana.title("Eventos da Semana") # nome da janela
   # cria uma nova tabela treeview que vai ter as linhas dos eventos dessa semana
   tabelaSemana = ttk.Treeview(janelaSemana, selectmode = 'browse', show = 'headings', height = 20)
   tabelaSemana.place(x= 0, y = 0)
   tabelaSemana["columns"] = ("0","1", "2", "3", "4", "5")
   tabelaSemana['show'] = 'headings'
   # define nome - largura de cd coluna
   tabelaSemana.column("0", width=125, anchor='c')
   tabelaSemana.column("1", width=125, anchor='c')
   tabelaSemana.column("2", width=125, anchor='c')
   tabelaSemana.column("3", width=125, anchor='c')
   tabelaSemana.column("4", width=125, anchor='c')
   tabelaSemana.column("5", width=125, anchor='c')
   # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # datetime.now() retorna a data atual
   hoje = datetime.now()
   print(hoje)


   for i in t:
       j = i.split(';')
       if len(j) < 6: # linha de arquivo invalida
           continue
       lista = j[2].split('/') # a coluna j[2] eh a que representa a data na tabela
       if len(lista) == 3:
           dia = int(lista[0]) # pega o dia, mes e ano da data
           mes = int(lista[1])
           ano = int(lista[2])
           dt = datetime(ano, mes, dia) # cria uma data com as informacoes dadas
           if(dt-hoje).days >= 0 and (dt-hoje).days <= 7: # se a diferenca em dias entre a data da entrada e a data de hj for <= 7, insere na nova tabela
               tabelaSemana.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5]))
   # cabecalhos da nova tabela
   tabelaSemana.heading("0", text="Usuario")
   tabelaSemana.heading("1", text="Descricao")
   tabelaSemana.heading("2", text="Data")
   tabelaSemana.heading("3", text="Hora")
   tabelaSemana.heading("4", text="Local")
   tabelaSemana.heading("5", text="Alarme")
   return
  1. FUNCAO PARA EDITAR

def editar():

   if len(tabela.selection()) == 0: # nenhuma linha selecionada
       return
   x = tabela.selection()[0]       # pega informacao da linha selecionada
   y = tabela.item(x, "values")    # joga a lista de informacoes em cima de y
   def adicionar():
       usuario = ausuario.get()        # pega o que foi escrito dentro da box ausuario
       descricao = adescricao.get()    #                                    adescricao
       data = adata.get()              # ...
       hora = ahora.get()
       local = alocal.get()
       alarme = aalarme.get()
       # se os dados forem invalidos, nao faz nada
       if not dadosValidos(usuario, descricao, data, hora, local, alarme):
           return
       # abre arquivo com opcao de "append" = concatenacao
       arquivo = open('documents.txt', 'a')
       # cria uma lista com o novo item
       lista = []
       lista.append(usuario + ';')
       lista.append(descricao + ';')
       lista.append(data +';')
       lista.append(hora + ';')
       lista.append(local + ';')
       lista.append(alarme + ';')
       # adiciona o novo item no fim da lista e fecha o arquivo
       arquivo.writelines(lista)
       arquivo.write("\n")
       arquivo.close()
       def delete():
           x = tabela.selection()[0]
           y = tabela.item(x, "values")
           # copia o arquivo em t e fecha o arquivo
           arquivo = open('documents.txt', 'r')
           t = arquivo.readlines()
           arquivo.close()
           # abre o arquivo com opcao de escrita, vai sobrescrever o arquivo
           arquivo = open('documents.txt', 'w')
           for i in t:
               lista = i.split(';')
               if len(lista) < 6: # linha de arquivo invalida
                   continue
               diferente = False
               for j in range(0, 6): # so escreve no arquivo as linhas q tem pelo menos uma coluna diferente da linha selecionada
                   if lista[j] != y[j]:
                       diferente = True
                       break
               if diferente:
                   arquivo.writelines(i)
           # fecha o arquivo
           arquivo.close()
           # deleta a linha da tabela
           x = tabela.selection()[0]
           tabela.delete(x)
       # deleta a linha selecionada da tabela e do arquivo
       delete()
       # adiciona a nova linha na tabela
       tabela.insert("",'end',values=(usuario, descricao, data, hora, local, alarme))
       # destroi janela
       janelacriar.destroy()
       return
   janelacriar = Tk()                   # cria nova janela
   janelacriar.geometry("280x200")      # dimensoes da janela
   janelacriar.title("Editar evento")   # nome da janela
   # cria as boxes de preencher e da um nome pra cada uma delas:
   usuario = Label(janelacriar, text = "Usuario:").place(x = 5, y = 5)
   ausuario = Entry(janelacriar)
   ausuario.place(x = 100, y = 5)
   ausuario.insert(END, y[0])
   descricao = Label(janelacriar, text = "Descricao:").place(x = 5, y = 30)
   adescricao = Entry(janelacriar)
   adescricao.place(x = 100, y = 30)
   adescricao.insert(END, y[1])
   data = Label(janelacriar, text = "Data:").place(x = 5, y = 55)
   adata = Entry(janelacriar)
   adata.place(x = 100, y = 55)
   adata.insert(END, y[2])
   Exemplo = Label(janelacriar, text = "(DD/MM/AAAA)", font = "Times 5").place(x = 225, y = 60)
   hora = Label(janelacriar, text = "Horario").place(x = 5, y = 80)
   ahora = Entry(janelacriar)
   ahora.place(x = 100, y = 80)
   ahora.insert(END,y[3])
   local = Label(janelacriar, text = "Local:").place(x = 5, y = 105)
   alocal = Entry(janelacriar)
   alocal.place(x = 100, y = 105)
   alocal.insert(END, y[4])
   alarme = Label(janelacriar, text = "Alarme:").place(x = 5, y = 130)
   aalarme = Entry(janelacriar)
   aalarme.place(x = 100, y = 130)
   aalarme.insert(END, y[5])
   Exemplo = Label(janelacriar, text = "(S/N)", font = "Times 5").place(x = 225, y = 135)
   #adiciona um botao que, quando clicado, chama a funcao adicionar() que esta dentro dessa funcao
   btnadd = Button(janelacriar, text = "Confirmar", font = "Times ", command = adicionar).place(x = 200, y = 160)
   janelacriar.mainloop()
   return
  1. FUNCAO PARA DELETAR UM EVENTO;

def delete():

   if len(tabela.selection()) == 0: # nenhuma linha selecionada
       return
   # pega a linha selecionada e joga sobre y
   x = tabela.selection()[0]
   y = tabela.item(x, "values")
   # abre o arquivo com opcao de leitura, copia em cima de t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # abre o arquivo com opcao de escrita: o arquivo vai ser sobrescrito
   arquivo = open('documents.txt', 'w')
   for i in t:
       lista = i.split(';')
       if len(lista) < 6: # linha de arquivo invalida
           continue
       diferente = False
       for j in range(0, 6): # so escreve no arquivo as linhas q tem pelo menos uma coluna diferente da linha selecionada
           if lista[j] != y[j]:
               diferente = True
               break
       if diferente:
           arquivo.writelines(i)
   # fecha o arquivo
   arquivo.close()
   # apaga da tabela a linha selecionada
   x = tabela.selection()[0]
   tabela.delete(x)
  1. $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  1. janela "principal"

janela = Tk() # cria uma nova janela janela.title("On time") # nome da janela janela.geometry("750x600") # dimensoes (largura x altura) da janela

  1. cria o botao de criar evento em cima da janela principal

criar = Button(text = "Adicionar evento", command = criar) criar.place(x = 1, y = 575)

  1. botao de pesquisar

pesquisar = Button(text = "Pesquisar evento", command = pesquisar) pesquisar.place(x = 104, y = 575)

  1. botao de mostrar agenda de hj

hoje = Button(text = "Mostrar atividades de hoje", command = mostrarHoje) hoje.place(x = 206, y = 575)

  1. botao de mostrar agenda da semana

semana = Button(text = "Mostrar atividades da semana", command = mostrarSemana) semana.place(x = 358, y = 575)

  1. botao de editar a linha selecionada

editar = Button(janela, text = "Editar Selecionado", command = editar) editar.place(x = 527, y = 575)

  1. botao de editar a linha selecionada

delete = Button(janela, text = "Deletar Selecionado", command = delete) delete.place(x = 636, y = 575)


  1. $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  2. tabela de eventos
  1. cria uma tabela treeview

tabela = ttk.Treeview(janela, selectmode = 'browse', show = 'headings', height = 27)

  1. abre o arquivo c opcao de leitura, salva em t e depois fecha

arquivo = open('documents.txt', 'r') t = arquivo.readlines() arquivo.close()

  1. copia as informacoes do arquivo documents.txt pra tabela

for i in t:

   v = i.split(';')
   if len(v) < 6: # linha de arquivo invalida
       continue
   if(dadosValidos(v[0], v[1], v[2], v[3], v[4], v[5])): # so joga na tabela se os valores forem validos
       tabela.insert("",'end',text= "L1",values=(v[0], v[1], v[2], v[3], v[4], v[5]))


  1. posiciona a tabela e marca as colunas

tabela.place(x= 0, y = 0) tabela["columns"] = ("0", "1", "2", "3", "4", "5") tabela['show'] = 'headings'

  1. largura de cada coluna

tabela.column("0", width=125, anchor='c') tabela.column("1", width=125, anchor='c') tabela.column("2", width=125, anchor='c') tabela.column("3", width=125, anchor='c') tabela.column("4", width=125, anchor='c') tabela.column("5", width=125, anchor='c')

  1. cabecalho de cada coluna

tabela.heading("0", text="Usuario") tabela.heading("1", text="Descricao") tabela.heading("2", text="Data") tabela.heading("3", text="Horario") tabela.heading("4", text="Local") tabela.heading("5", text="Alarme")

  1. checka se algum alarme tem que ser disparado

janela.after(500, task)

  1. mainloop da janela

janela.mainloop() </syntaxhighlight>

revisão

<syntaxhighlight lang="python3"> import winsound import time from datetime import datetime, timedelta from threading import Timer from tkinter import ttk from tkinter import *

primeiraExecucao = True

  1. task eh uma tarefa que agenda uma outra chamada de si mesma a cada 10s
  2. e verifica se algum alarme tem q ser disparado

def task():

   checkarAlarme()           # verifica se um alarme tem q ser disparado
   return
  1. ativa o despertador

def desp(mensagem):

   ultimo = 0
   # fecha a janela e para as repeticoes da musica
   def desligar():
       janelacriar.after_cancel(ultimo)
       janelacriar.destroy()
       return
   # toca uma musica especifica a cada 10000s
   def tocar():
       winsound.Beep(1000,1000) # frequencia, duracao do alarme
       #winsound.PlaySound('pow.wav', winsound.SND_FILENAME)
       ultimo = janelacriar.after(10000, tocar)
       return
   janelacriar = Tk()             # cria uma nova janela
   janelacriar.geometry("200x80") # dimensoes largura x altura da janela
   janelacriar.title("ALARME!!!") # nome da janela
   # mensagem eh a mensagem escrita na janela, se for vazia troca pra "(sem descricao)"
   if mensagem == :
       mensagem = "(Sem descricao)"
   # imprime a mnsagem na tela
   msg = Label(janelacriar, text = mensagem, font = "Times 10").place(x = 1, y = 1)
   # adicioa um botao que, quando clicado, chama a funcao desligar() dentro dessa funcao
   btnadd = Button(janelacriar, text = "Desligar", font = "Times ", command = desligar).place(x = 135, y = 45)
   ultimo = janelacriar.after(500, tocar)
   janelacriar.mainloop()
   return
  1. funcao que verifica se tem que disparar algum alarme
  2. a flag semhorario representa se tem que despertar os eventos sem horario especificos (usando so a data) ou nao

def checkarAlarme():

   janela.after(10000, task)
   global primeiraExecucao # variavel global que me fala se tenho q disparar os alarmes de hj mas sem horario ou nao
   # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # datetime retorna a data atual
   hoje = datetime.now()
   for i in t:
       j = i.split(';')
       if len(j) < 6: # linha de arquivo invalida
           continue
       if j[5] == "S": # verifica se o alarme do evento esta ativado
           data = j[2].split('/') # j[2] eh a data do evento
           if len(data) == 3:
               dia = int(data[0])
               mes = int(data[1])
               ano = int(data[2])
               if dia == hoje.day and mes == hoje.month and ano == hoje.year:
                   horario = j[3].split(':') # j[3] eh o horario do evento
                   if len(horario) == 2:
                       hora = int(horario[0])
                       minutos = int(horario[1])
                       dt = datetime(ano, mes, dia, hora, minutos)
                       # verifica se o alarme deveria ter sido disparado ha menos de 10 segundo
                       if (hoje-dt).seconds >= 0 and (hoje-dt).seconds <= 12:
                           desp(j[1]) # dispara o alarme com a mensagem de descricao do evento
                   # verifica se eh pra despertar os eventos sem horario especifico (considerando so a data):
                   elif primeiraExecucao:
                       primeiraExecucao = False
                       desp(j[1]) # dispara o alarme com a mensagem de descricao do evento
   return


  1. FUNCAO PRA CHECKAR SE A ENTRADA EH VALIDA

def dadosValidos(usuario, descricao, data, hora, local, alarme):

   # funcao que verifica se um ano eh bissexto
   def bissexto(ano):
       if ano % 4 != 0 or (ano % 100 == 0 and ano % 400 != 0):
           return False
       return True
   # funcao que verifica se uma string representa um numero inteiro
   def inteiro(s):
       for i in range(len(s)):
           if s[i] < '0' or s[i] > '9':
               return False
       return True
   # se a data nao for vazia, verifica se eh uma data valida
   if data != :
       lista = data.split('/')
       # verifica se tem 3 campos separados por '/'
       if len(lista) != 3:
           return False
       dia = lista[0]
       mes = lista[1]
       ano = lista[2]
       # verifica se todos os campos sao inteiros
       if not inteiro(dia) or not inteiro(mes) or not inteiro(ano):
           return False
       dia = int(dia)
       mes = int(mes)
       ano = int(ano)
       # verifica se a data eh valida
       if dia<1 or dia>31 or mes<1 or mes>12 or ano<2017 or ((mes==4 or mes==6 or mes==9 or mes==1) and dia>30) or (mes==2 and dia>29) or (mes==2 and not bissexto(ano) and dia>28):
           return False
   # se a hora nao for vazia, verifica se eh valida (valores entre 00:00 e 23:59)
   if hora != :
       lista = hora.split(':')
       if len(lista) != 2:
           return False
       hora = lista[0]
       minuto = lista[1]
       if not inteiro(hora) or not inteiro(minuto):
           return False
       hora = int(hora)
       minuto = int(minuto)
       if hora < 0 or hora > 23 or minuto < 0 or minuto > 59:
           return False
   # se o alarme nao for vazio, verifica se eh valido (igual a "S" ou "N")
   if alarme != :
       if alarme != "S" and alarme != "N":
           return False
   return True


  1. FUNCAO PARA CRIAR UM EVENTO;

def criar():

   def adicionar():
       usuario = ausuario.get()     # pega o texto digitados na box usuario
       descricao = adescricao.get() # pega o texto digitado na box descricao
       data = adata.get()           # ...
       hora = ahora.get()
       local = alocal.get()
       alarme = aalarme.get()
       # verifica se os dados sao validos, se nao for nao faz adiciona
       if not dadosValidos(usuario, descricao, data, hora, local, alarme):
           return
       # cria uma lista com os dados
       lista = []
       lista.append(usuario + ';')
       lista.append(descricao + ';')
       lista.append(data +';')
       lista.append(hora + ';')
       lista.append(local + ';')
       lista.append(alarme + ';')
       # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
       arquivo=open('documents.txt', 'r')
       t = arquivo.readlines()
       arquivo.close()
       # jaExiste indica se tem um elemento igual na tabela
       # se ja exisitr, nao insere porque nao podem ter elementos duplicados
       jaExiste = False
       for i in t:
           j = i.split(';')
           if len(j) < 6: # linha de arquivo invalida
               continue
           # verifica se todas as informacoes da nova linha sao iguais a alguma linha ja existente
           if j[0] == usuario and j[1] == descricao and j[2] == data and j[3] == hora and j[4] == local and j[5] == alarme:
               jaExiste = True
               break
       # se ja existir ou se todas as informacoes forem vazias, nao insere de novo
       if jaExiste or (usuario ==  and descricao ==  and data ==  and hora ==  and local ==  and alarme == ):
           return
       # abre arquivo com opcao de "append" = concatenacao e adiciona a nova linha no final do arquivo
       arquivo = open('documents.txt', 'a')
       arquivo.writelines(lista)
       arquivo.write("\n")
       arquivo.close()
       # adiciona uma nova linha na tabela tambem
       tabela.insert("",'end',values=(usuario, descricao, data, hora, local, alarme))
       janelacriar.destroy()
       return
   janelacriar = Tk()                    # cria nova janela
   janelacriar.geometry("280x200")       # dimensoes largura x altura da janela
   janelacriar.title("Adicionar evento") # nome da janela
   # cria as boxes de preencher e da um nome pra cada uma delas:
   usuario = Label(janelacriar, text = "Usuario:").place(x = 5, y = 5)
   ausuario = Entry(janelacriar)
   ausuario.place(x = 100, y = 5)
   descricao = Label(janelacriar, text = "Descricao:").place(x = 5, y = 30)
   adescricao = Entry(janelacriar)
   adescricao.place(x = 100, y = 30)
   data = Label(janelacriar, text = "Data:").place(x = 5, y = 55)
   adata = Entry(janelacriar)
   adata.place(x = 100, y = 55)
   Exemplo = Label(janelacriar, text = "(DD/MM/AAAA)", font = "Times 5").place(x = 225, y = 60)
   hora = Label(janelacriar, text = "Horario").place(x = 5, y = 80)
   ahora = Entry(janelacriar)
   ahora.place(x = 100, y = 80)
   local = Label(janelacriar, text = "Local:").place(x = 5, y = 105)
   alocal = Entry(janelacriar)
   alocal.place(x = 100, y = 105)
   alarme = Label(janelacriar, text = "Alarme:").place(x = 5, y = 130)
   aalarme = Entry(janelacriar)
   aalarme.place(x = 100, y = 130)
   Exemplo = Label(janelacriar, text = "(S/N)", font = "Times 5").place(x = 225, y = 135)
   # cria um botao que, quando clicado, chama a funcao adicionar() que ta dentro dessa funcao
   btnadd = Button(janelacriar, text = "Confirmar", font = "Times ", command = adicionar).place(x = 200, y = 160)
   janelacriar.mainloop()
   return
  1. FUNCAO PARA PESQUISAR UM EVENTO;

def pesquisar():

   def achar():
       j = []
       usuario = ausuario.get()      # pega o texto digitado na box usuario
       descricao = adescricao.get()  # pega o texto digitado na box descricao
       data = adata.get()            # ...
       hora = ahora.get()
       local = alocal.get()
       alarme = aalarme.get()
       if not dadosValidos(usuario, descricao, data, hora, local, alarme):
           return
       # abre o arquivo com opcao de leitura, copia em t e fecha o arquivo
       arquivo = open('documents.txt', 'r')
       t = arquivo.readlines()
       arquivo.close()
       # apaga a tabelapesquisar
       tabelapesquisar.delete(*tabelapesquisar.get_children())
       # reinsere apenas as linhas que correspondem a busca
       for i in t:
           j = i.split(';')
           if len(j) < 6: # linha de arquivo invalida
               continue
           # se as informacoes da linha baterem com a pesquisa do usuario, adiciona na tabela
           if (j[0] == usuario or usuario == ) and (j[1] == descricao or descricao == ) and (j[2] == data or data ==) and (j[3] == hora or hora == ) and (j[4] == local or local == ) and (j[5] == alarme or alarme == ):
               tabelapesquisar.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5]))
   janelapesquisar = Tk()              # cria uma nova janela
   janelapesquisar.geometry("750x600") # dimensoes largura x altura da janela
   janelapesquisar.title("Pesquisar")  # nome da janela
   # cria as boxes de preencher e da um nome pra cada uma delas:
   usuario = Label(janelapesquisar, text = "Usuario:").place(x = 1, y = 430)
   ausuario = Entry(janelapesquisar)
   ausuario.place(x = 100, y = 430)
   descricao = Label(janelapesquisar, text = "Descricao:").place(x = 1, y = 455)
   adescricao = Entry(janelapesquisar)
   adescricao.place(x = 100, y = 455)
   data = Label(janelapesquisar, text = "Data:").place(x = 1, y = 480)
   adata = Entry(janelapesquisar)
   adata.place(x = 100, y = 480)
   Exemplo = Label(janelapesquisar, text = "(DD/MM/AAAA)", font = "Times 5").place(x = 225, y = 485)
   hora = Label(janelapesquisar, text = "Horario:").place(x = 1, y = 505)
   ahora = Entry(janelapesquisar)
   ahora.place(x = 100, y = 505)
   local = Label(janelapesquisar, text = "Local:").place(x = 1, y = 530)
   alocal = Entry(janelapesquisar)
   alocal.place(x = 100, y = 530)
   alarme = Label(janelapesquisar, text = "Alarme:").place(x = 1, y = 555)
   aalarme = Entry(janelapesquisar)
   aalarme.place(x = 100, y = 555)
   Exemplo = Label(janelapesquisar, text = "(S/N)", font = "Times 5").place(x = 225, y = 560)
   # cria uma nova tabela treeview que vai ter os resultados da busca
   tabelapesquisar = ttk.Treeview(janelapesquisar, selectmode = 'browse', show = 'headings', height = 20)
   tabelapesquisar.place(x= 0, y = 0)
   tabelapesquisar["columns"] = ("0","1", "2", "3", "4", "5")
   tabelapesquisar['show'] = 'headings'
   # define nome - largura de cada coluna
   tabelapesquisar.column("0", width=125, anchor='c')
   tabelapesquisar.column("1", width=125, anchor='c')
   tabelapesquisar.column("2", width=125, anchor='c')
   tabelapesquisar.column("3", width=125, anchor='c')
   tabelapesquisar.column("4", width=125, anchor='c')
   tabelapesquisar.column("5", width=125, anchor='c')
   # abre arquivo com opcao de leitra, copia sobre t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # inicialmente a tabelapesquisar tem todos os dados
   for i in t:
       j = i.split(';')
       if len(j) < 6: # linha de arquivo invalida
           continue
       if dadosValidos(j[0], j[1], j[2], j[3], j[4], j[5]):
           tabelapesquisar.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5]))
   # cria um botao que, quando clicado, chama a funcao achar() que ta dentro dessa funcao
   g = Button(janelapesquisar, text = "Confirmar", font = "Times ", command = achar).place(x = 670, y = 560)
   # cabecalhos da tabela
   tabelapesquisar.heading("0", text="Usuario")
   tabelapesquisar.heading("1", text="Descricao")
   tabelapesquisar.heading("2", text="Data")
   tabelapesquisar.heading("3", text="Hora")
   tabelapesquisar.heading("4", text="Local")
   tabelapesquisar.heading("5", text="Alarme")
   return
  1. FUNCAO PARA MOSTRAR A AGENDA DE HOJE;

def mostrarHoje():

   janelaHoje = Tk()                     # cria nova lanela
   janelaHoje.geometry("750x425")        # dimensoes largura x altura da janela
   janelaHoje.title("Eventos de Hoje") # nome da janela
   # cria uma nova tabela treeview que vai ter os eventos com a data de hj
   tabelaHoje = ttk.Treeview(janelaHoje, selectmode = 'browse', show = 'headings', height = 20)
   tabelaHoje.place(x = 0, y = 0)
   tabelaHoje["columns"] = ("0","1", "2", "3", "4", "5")
   tabelaHoje['show'] = 'headings'
   # define nome - largura de cd coluna
   tabelaHoje.column("0", width=125, anchor='c')
   tabelaHoje.column("1", width=125, anchor='c')
   tabelaHoje.column("2", width=125, anchor='c')
   tabelaHoje.column("3", width=125, anchor='c')
   tabelaHoje.column("4", width=125, anchor='c')
   tabelaHoje.column("5", width=125, anchor='c')
   # abre arquivo, copia sobre t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # datetime.now() retorna a data atual
   hoje = datetime.now()
   for i in t:
       j = i.split(';')
       if len(j) < 6: # linha de arquivo invalida
           continue
       lista = j[2].split('/') # a coluna j[2] eh a que representa a data na tabela
       if len(lista) == 3:
           dia = int(lista[0]) # pega o dia, mes e ano da data
           mes = int(lista[1])
           ano = int(lista[2])
           if dia == hoje.day and mes == hoje.month and ano == hoje.year: # se as datas forem iguais, adiciona na linha
               tabelaHoje.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5]))
   # cabecalhos da nova tabela
   tabelaHoje.heading("0", text="Usuario")
   tabelaHoje.heading("1", text="Descricao")
   tabelaHoje.heading("2", text="Data")
   tabelaHoje.heading("3", text="Hora")
   tabelaHoje.heading("4", text="Local")
   tabelaHoje.heading("5", text="Alarme")
   return
  1. FUNCAO PARA MOSTRAR A AGENDA DA SEMANA;

def mostrarSemana():

   janelaSemana = Tk()                     # cria nova lanela
   janelaSemana.geometry("750x425")        # dimensoes largura x altura da janela
   janelaSemana.title("Eventos da Semana") # nome da janela
   # cria uma nova tabela treeview que vai ter as linhas dos eventos dessa semana
   tabelaSemana = ttk.Treeview(janelaSemana, selectmode = 'browse', show = 'headings', height = 20)
   tabelaSemana.place(x= 0, y = 0)
   tabelaSemana["columns"] = ("0","1", "2", "3", "4", "5")
   tabelaSemana['show'] = 'headings'
   # define nome - largura de cd coluna
   tabelaSemana.column("0", width=125, anchor='c')
   tabelaSemana.column("1", width=125, anchor='c')
   tabelaSemana.column("2", width=125, anchor='c')
   tabelaSemana.column("3", width=125, anchor='c')
   tabelaSemana.column("4", width=125, anchor='c')
   tabelaSemana.column("5", width=125, anchor='c')
   # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # datetime.now() retorna a data atual
   hoje = datetime.now()
   print(hoje)


   for i in t:
       j = i.split(';')
       if len(j) < 6: # linha de arquivo invalida
           continue
       lista = j[2].split('/') # a coluna j[2] eh a que representa a data na tabela
       if len(lista) == 3:
           dia = int(lista[0]) # pega o dia, mes e ano da data
           mes = int(lista[1])
           ano = int(lista[2])
           dt = datetime(ano, mes, dia) # cria uma data com as informacoes dadas
           if(dt-hoje).days >= 0 and (dt-hoje).days <= 7: # se a diferenca em dias entre a data da entrada e a data de hj for <= 7, insere na nova tabela
               tabelaSemana.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5]))
   # cabecalhos da nova tabela
   tabelaSemana.heading("0", text="Usuario")
   tabelaSemana.heading("1", text="Descricao")
   tabelaSemana.heading("2", text="Data")
   tabelaSemana.heading("3", text="Hora")
   tabelaSemana.heading("4", text="Local")
   tabelaSemana.heading("5", text="Alarme")
   return
  1. FUNCAO PARA EDITAR

def editar():

   if len(tabela.selection()) == 0: # nenhuma linha selecionada
       return
   x = tabela.selection()[0]       # pega informacao da linha selecionada
   y = tabela.item(x, "values")    # joga a lista de informacoes em cima de y
   def adicionar():
       usuario = ausuario.get()        # pega o que foi escrito dentro da box ausuario
       descricao = adescricao.get()    #                                    adescricao
       data = adata.get()              # ...
       hora = ahora.get()
       local = alocal.get()
       alarme = aalarme.get()
       # se os dados forem invalidos, nao faz nada
       if not dadosValidos(usuario, descricao, data, hora, local, alarme):
           return
       # abre arquivo com opcao de "append" = concatenacao
       arquivo = open('documents.txt', 'a')
       # cria uma lista com o novo item
       lista = []
       lista.append(usuario + ';')
       lista.append(descricao + ';')
       lista.append(data +';')
       lista.append(hora + ';')
       lista.append(local + ';')
       lista.append(alarme + ';')
       # adiciona o novo item no fim da lista e fecha o arquivo
       arquivo.writelines(lista)
       arquivo.write("\n")
       arquivo.close()
       def delete():
           x = tabela.selection()[0]
           y = tabela.item(x, "values")
           # copia o arquivo em t e fecha o arquivo
           arquivo = open('documents.txt', 'r')
           t = arquivo.readlines()
           arquivo.close()
           # abre o arquivo com opcao de escrita, vai sobrescrever o arquivo
           arquivo = open('documents.txt', 'w')
           for i in t:
               lista = i.split(';')
               if len(lista) < 6: # linha de arquivo invalida
                   continue
               diferente = False
               for j in range(0, 6): # so escreve no arquivo as linhas q tem pelo menos uma coluna diferente da linha selecionada
                   if lista[j] != y[j]:
                       diferente = True
                       break
               if diferente:
                   arquivo.writelines(i)
           # fecha o arquivo
           arquivo.close()
           # deleta a linha da tabela
           x = tabela.selection()[0]
           tabela.delete(x)
       # deleta a linha selecionada da tabela e do arquivo
       delete()
       # adiciona a nova linha na tabela
       tabela.insert("",'end',values=(usuario, descricao, data, hora, local, alarme))
       # destroi janela
       janelacriar.destroy()
       return
   janelacriar = Tk()                   # cria nova janela
   janelacriar.geometry("280x200")      # dimensoes da janela
   janelacriar.title("Editar evento")   # nome da janela
   # cria as boxes de preencher e da um nome pra cada uma delas:
   usuario = Label(janelacriar, text = "Usuario:").place(x = 5, y = 5)
   ausuario = Entry(janelacriar)
   ausuario.place(x = 100, y = 5)
   ausuario.insert(END, y[0])
   descricao = Label(janelacriar, text = "Descricao:").place(x = 5, y = 30)
   adescricao = Entry(janelacriar)
   adescricao.place(x = 100, y = 30)
   adescricao.insert(END, y[1])
   data = Label(janelacriar, text = "Data:").place(x = 5, y = 55)
   adata = Entry(janelacriar)
   adata.place(x = 100, y = 55)
   adata.insert(END, y[2])
   Exemplo = Label(janelacriar, text = "(DD/MM/AAAA)", font = "Times 5").place(x = 225, y = 60)
   hora = Label(janelacriar, text = "Horario").place(x = 5, y = 80)
   ahora = Entry(janelacriar)
   ahora.place(x = 100, y = 80)
   ahora.insert(END,y[3])
   local = Label(janelacriar, text = "Local:").place(x = 5, y = 105)
   alocal = Entry(janelacriar)
   alocal.place(x = 100, y = 105)
   alocal.insert(END, y[4])
   alarme = Label(janelacriar, text = "Alarme:").place(x = 5, y = 130)
   aalarme = Entry(janelacriar)
   aalarme.place(x = 100, y = 130)
   aalarme.insert(END, y[5])
   Exemplo = Label(janelacriar, text = "(S/N)", font = "Times 5").place(x = 225, y = 135)
   #adiciona um botao que, quando clicado, chama a funcao adicionar() que esta dentro dessa funcao
   btnadd = Button(janelacriar, text = "Confirmar", font = "Times ", command = adicionar).place(x = 200, y = 160)
   janelacriar.mainloop()
   return
  1. FUNCAO PARA DELETAR UM EVENTO;

def delete():

   if len(tabela.selection()) == 0: # nenhuma linha selecionada
       return
   # pega a linha selecionada e joga sobre y
   x = tabela.selection()[0]
   y = tabela.item(x, "values")
   # abre o arquivo com opcao de leitura, copia em cima de t e fecha o arquivo
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # abre o arquivo com opcao de escrita: o arquivo vai ser sobrescrito
   arquivo = open('documents.txt', 'w')
   for i in t:
       lista = i.split(';')
       if len(lista) < 6: # linha de arquivo invalida
           continue
       diferente = False
       for j in range(0, 6): # so escreve no arquivo as linhas q tem pelo menos uma coluna diferente da linha selecionada
           if lista[j] != y[j]:
               diferente = True
               break
       if diferente:
           arquivo.writelines(i)
   # fecha o arquivo
   arquivo.close()
   # apaga da tabela a linha selecionada
   x = tabela.selection()[0]
   tabela.delete(x)
  1. $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  1. janela "principal"

janela = Tk() # cria uma nova janela janela.title("On time") # nome da janela janela.geometry("750x600") # dimensoes (largura x altura) da janela

  1. cria o botao de criar evento em cima da janela principal

criar = Button(text = "Adicionar evento", command = criar) criar.place(x = 1, y = 575)

  1. botao de pesquisar

pesquisar = Button(text = "Pesquisar evento", command = pesquisar) pesquisar.place(x = 104, y = 575)

  1. botao de mostrar agenda de hj

hoje = Button(text = "Mostrar atividades de hoje", command = mostrarHoje) hoje.place(x = 206, y = 575)

  1. botao de mostrar agenda da semana

semana = Button(text = "Mostrar atividades da semana", command = mostrarSemana) semana.place(x = 358, y = 575)

  1. botao de editar a linha selecionada

editar = Button(janela, text = "Editar Selecionado", command = editar) editar.place(x = 527, y = 575)

  1. botao de editar a linha selecionada

delete = Button(janela, text = "Deletar Selecionado", command = delete) delete.place(x = 636, y = 575)


  1. $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  2. tabela de eventos
  1. cria uma tabela treeview

tabela = ttk.Treeview(janela, selectmode = 'browse', show = 'headings', height = 27)

  1. abre o arquivo c opcao de leitura, salva em t e depois fech

arquivo = open('documents.txt', 'a') arquivo.close() arquivo = open('documents.txt', 'r') t = arquivo.readlines() arquivo.close()

  1. copia as informacoes do arquivo documents.txt pra tabela

for i in t:

   v = i.split(';')
   if len(v) < 6: # linha de arquivo invalida
       continue
   if(dadosValidos(v[0], v[1], v[2], v[3], v[4], v[5])): # so joga na tabela se os valores forem validos
       tabela.insert("",'end',text= "L1",values=(v[0], v[1], v[2], v[3], v[4], v[5]))


  1. posiciona a tabela e marca as colunas

tabela.place(x= 0, y = 0) tabela["columns"] = ("0", "1", "2", "3", "4", "5") tabela['show'] = 'headings'

  1. largura de cada coluna

tabela.column("0", width=125, anchor='c') tabela.column("1", width=125, anchor='c') tabela.column("2", width=125, anchor='c') tabela.column("3", width=125, anchor='c') tabela.column("4", width=125, anchor='c') tabela.column("5", width=125, anchor='c')

  1. cabecalho de cada coluna

tabela.heading("0", text="Usuario") tabela.heading("1", text="Descricao") tabela.heading("2", text="Data") tabela.heading("3", text="Horario") tabela.heading("4", text="Local") tabela.heading("5", text="Alarme")

  1. checka se algum alarme tem que ser disparado

janela.after(500, task)

  1. mainloop da janela

janela.mainloop() </syntaxhighlight>