Escopo

  • Participantes:
    • Ana Flávia Dutra
    • João Antônio Rosa
    • Mariele Venancio
    • Felipe Barros
  • 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 (*)
  • Mostrar Agenda de Hoje
  • Novas funcionalidades:
    • Criar botões:
      • 1. Login
      • 2. Atividades ordenadas por data
      • 3. Tarefas prioritárias
    • Ao clicar:
      • 1. No início do programa, será solicitado usuário e senha que deverão ser autenticados antes de acessar o menu
      • 2. Serão mostradas as atividades em ordem cronológica
      • 3. Serão apresentadas apenas as tarefas cadastradas com prioridade


Código


*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>

Código Comentado

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

conectado = False primeiraExecucao = True

def login():

   # funcao pra checkar se o usuario e senha sao validos
   def dadosValidos(usuario, senha):
       # o usuario so pode ter letras
       for i in usuario:   #laco serve para identificar se usuario e senha sao validos (for e if)
           if not ((i >= 'a' and i <= 'z') or (i >= 'A' and i <= 'Z')):
               return False
       # a senha so pode conter letras e numeros
       for i in senha:
           if not ((i >= 'a' and i <= 'z') or (i >= 'A' and i <= 'Z') or (i >= '0' and i <= '9')):
               return False
       return usuario !=  and senha != 
   def entrar():
       def fentrar():
           usuario = ausuario.get()     # pega o texto digitados na box usuario
           senha = asenha.get()         # pega o texto digitado na box senha
           if dadosValidos(usuario, senha):
               # cria uma lista com os dados
               lista = []
               lista.append(usuario + ';')
               lista.append(senha + ';')
               # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
               arquivo = open('usuarios.txt', 'r')
               t = arquivo.readlines()
               arquivo.close()
               jaExiste = False
               for i in t: #para cada linha dentro de todas as linhas
                   j = i.split(';')
                   if len(j) < 2: # linha de arquivo invalida
                       continue
                   # verifica se todas as informacoes da nova linha sao iguais a alguma linha
                   if j[0] == usuario and j[1] == senha:
                       jaExiste = True
                       break
               if jaExiste:
                   global conectado
                   conectado = True
                   janelacriar.destroy()
                   janelacriar2.destroy()
                   return
           msgErro = Label(janelacriar2, text = "Usuario e/ou senha invalidos!", fg="red").place(x = 15, y = 60)
           return
       janelacriar2 = Tk()              # cria uma nova janela
       janelacriar2.title("Entrar")     # nome da janela
       janelacriar2.geometry("270x100") # dimensoes (largura x altura) da janela
       # cria as boxes de preencher e da um nome pra cada uma delas:
       usuario = Label(janelacriar2, text = "Login:").place(x = 15, y = 15)
       ausuario = Entry(janelacriar2)
       ausuario.place(x = 70, y = 15)
       Exemplo = Label(janelacriar2, text = "[a-z, A-Z]", font = "Times 8").place(x = 195, y = 15)
       senha = Label(janelacriar2, text = "Senha:").place(x = 15, y = 40)
       asenha = Entry(janelacriar2, show="*")
       asenha.place(x = 70, y = 40)
       Exemplo = Label(janelacriar2, text = "[a-z, A-Z, 0-9]", font = "Times 8").place(x = 195, y = 40)
       btnadd = Button(janelacriar2, text =  " Entrar ", font = "Times", command = fentrar).place(x = 200, y = 60)
       janelacriar2.mainloop()
       return
   def cadastrar():
       def fcadastrar():
           usuario = ausuario.get()     # pega o texto digitados na box usuario
           senha = asenha.get()         # pega o texto digitado na box senha
           if dadosValidos(usuario, senha):
               # cria uma lista com os dados
               lista = []
               lista.append(usuario + ';')
               lista.append(senha + ';')
               # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
               arquivo = open('usuarios.txt', 'r') #Abre os arquivos do diret?rio
               t = arquivo.readlines()
               arquivo.close()
               jaExiste = False
               for i in t:
                   j = i.split(';')
                   if len(j) < 2: # linha de arquivo invalida
                       continue
                   # verifica se todas as informacoes da nova linha sao iguais a alguma linha
                   if j[0] == usuario and j[1] == senha:
                       jaExiste = True
                       break
               if not jaExiste:
                   # abre arquivo com opcao de "append" = concatenacao e adiciona a nova linha no final do arquivo
                   arquivo = open('usuarios.txt', 'a')
                   arquivo.writelines(lista)
                   arquivo.write("\n")
                   arquivo.close()
                   janelacriar2.destroy() # a janela ? destruida nao apagada.
                   return
           msgErro = Label(janelacriar2, text = "Usuario e/ou senha invalidos!", fg="red").place(x = 15, y = 60)
           return
       janelacriar2 = Tk()              # cria uma nova janela
       janelacriar2.title("Cadastrar")  # nome da janela
       janelacriar2.geometry("270x100") # dimensoes (largura x altura) da janela
       # cria as boxes de preencher e da um nome pra cada uma delas:
       usuario = Label(janelacriar2, text = "Login:").place(x = 15, y = 15)
       ausuario = Entry(janelacriar2)
       ausuario.place(x = 70, y = 15)
       Exemplo = Label(janelacriar2, text = "[a-z, A-Z]", font = "Times 8").place(x = 195, y = 15)
       senha = Label(janelacriar2, text = "Senha:").place(x = 15, y = 40)
       asenha = Entry(janelacriar2, show="*")
       asenha.place(x = 70, y = 40)
       Exemplo = Label(janelacriar2, text = "[a-z, A-Z, 0-9]", font = "Times 8").place(x = 195, y = 40)


       btnadd = Button(janelacriar2, text =  "Cadastrar ", font = "Times ", command = fcadastrar).place(x = 180, y = 60)
       janelacriar2.mainloop()
       return
   janelacriar = Tk()              # cria uma nova janela
   janelacriar.title("On time")    # nome da janela
   janelacriar.geometry("270x100") # dimensoes (largura x altura) da janela
   btnadd = Button(janelacriar, text =  "      Entrar     ", font = "Times20", command = entrar).place(x = 85, y = 15)
   btnadd2 = Button(janelacriar, text = "  Cadastrar  ", font = "Times20", command = cadastrar).place(x = 85, y = 55)
   janelacriar.mainloop()
   return

def agenda():

   # task eh uma tarefa que agenda uma outra chamada de si mesma a cada 10s
   # e verifica se algum alarme tem q ser disparado
   def task():
       checkarAlarme()           # verifica se um alarme tem q ser disparado
       return
   # 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
   # funcao que verifica se tem que disparar algum alarme
   # 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
   # FUNCAO PRA CHECKAR SE A ENTRADA EH VALIDA
   def dadosValidos(usuario, descricao, data, hora, local, alarme, prioritario):
       # 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
       if prioritario != :
           if prioritario != "S" and prioritario != "N":
               return False
       return True


   # 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()
           prioritario = aprioritario.get()
           # verifica se os dados sao validos, se nao for nao faz adiciona
           if not dadosValidos(usuario, descricao, data, hora, local, alarme, prioritario):
               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 + ';')
           lista.append(prioritario + ';')
           # 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) < 7: # 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 and j[6] == prioritario:
                   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 ==  and prioritario == ):
               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, prioritario))
           janelacriar.destroy()
           return
       janelacriar = Tk()                    # cria nova janela
       janelacriar.geometry("280x230")       # 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)
       prioritario = Label(janelacriar, text = "Prioritaria:").place(x = 5, y = 155)
       aprioritario = Entry(janelacriar)
       aprioritario.place(x = 100, y = 155)
       Exemplo = Label(janelacriar, text = "(S/N)", font = "Times 5").place(x = 225, y = 155)
       # 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 = 190)
       janelacriar.mainloop()
       return
   # 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()
           prioritario = aprioritario.get()
           if not dadosValidos(usuario, descricao, data, hora, local, alarme, prioritario):
               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) < 7: # 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 == ) and (j[6] == prioritario or prioritario == ):
                   tabelapesquisar.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5], j[6]))
       janelapesquisar = Tk()              # cria uma nova janela
       janelapesquisar.geometry("875x630") # 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)
       prioritario = Label(janelapesquisar, text = "Prioritaria:").place(x = 1, y = 580)
       aprioritario = Entry(janelapesquisar)
       aprioritario.place(x = 100, y = 580)
       Exemplo = Label(janelapesquisar, text = "(S/N)", font = "Times 5").place(x = 225, y = 585)
       # cria uma nova tabela treeview que vai ter os resultados da busca
       colunas = ("0", "1", "2", "3", "4", "5", "6")
       tabelapesquisar = ttk.Treeview(janelapesquisar, columns=colunas, selectmode = 'browse', show = 'headings', height = 20)
       tabelapesquisar.place(x = 0, y = 0)
       for col in colunas:
           tabelapesquisar.heading(col, text=col, command=lambda _col=col: treeview_sort_column(tabelapesquisar, _col, False))
       # 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')
       tabelapesquisar.column("6", width=125, anchor='c')
       # 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")
       tabelapesquisar.heading("6", text="Prioritario")
       # 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) < 7: # linha de arquivo invalida
               continue
           if dadosValidos(j[0], j[1], j[2], j[3], j[4], j[5], j[6]):
               tabelapesquisar.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5], j[6]))
       # 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 = 795, y = 590)
       return
   # FUNCAO PARA MOSTRAR A AGENDA DE HOJE;
   def mostrarHoje():
       janelaHoje = Tk()                     # cria nova lanela
       janelaHoje.geometry("875x425")        # 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
       colunas = ("0", "1", "2", "3", "4", "5", "6")
       tabelaHoje = ttk.Treeview(janelaHoje, columns=colunas, selectmode = 'browse', show = 'headings', height = 20)
       tabelaHoje.place(x = 0, y = 0)
       for col in colunas:
           tabelaHoje.heading(col, text=col, command=lambda _col=col: treeview_sort_column(tabelaHoje, _col, False))
       # 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')
       tabelaHoje.column("6", width=125, anchor='c')
       # 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")
       tabelaHoje.heading("6", text="Prioritario")
       # 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], j[6]))
       return
   # FUNCAO PARA MOSTRAR A AGENDA DA SEMANA;
   def mostrarSemana():
       janelaSemana = Tk()                     # cria nova lanela
       janelaSemana.geometry("875x425")        # 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
       colunas = ("0", "1", "2", "3", "4", "5", "6")
       tabelaSemana = ttk.Treeview(janelaSemana, columns=colunas, selectmode = 'browse', show = 'headings', height = 20)
       tabelaSemana.place(x = 0, y = 0)
       for col in colunas:
           tabelaSemana.heading(col, text=col, command=lambda _col=col: treeview_sort_column(tabelaSemana, _col, False))
       # 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')
       tabelaSemana.column("6", width=125, anchor='c')
       # 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")
       tabelaSemana.heading("6", text="Prioritario")
       # 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()
       for i in t:
           j = i.split(';')
           if len(j) < 7: # 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 >= -1 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], j[6]))
       return
   # FUNCAO PARA MOSTRAR OS EVENTOS PRIORITARIOS
   def mostrarPrioritarios():
       janelaPrioritarios = Tk()                        # cria nova lanela
       janelaPrioritarios.geometry("875x425")           # dimensoes largura x altura da janela
       janelaPrioritarios.title("Eventos Prioritarios") # nome da janela
       # cria uma nova tabela treeview que vai ter as linhas dos eventos dessa semana
       colunas = ("0", "1", "2", "3", "4", "5", "6")
       tabelaPrioritarios = ttk.Treeview(janelaPrioritarios, columns=colunas, selectmode = 'browse', show = 'headings', height = 20)
       tabelaPrioritarios.place(x = 0, y = 0)
       for col in colunas:
           tabelaPrioritarios.heading(col, text=col, command=lambda _col=col: treeview_sort_column(tabelaPrioritarios, _col, False))
       # define nome - largura de cada coluna
       tabelaPrioritarios.column("0", width=125, anchor='c')
       tabelaPrioritarios.column("1", width=125, anchor='c')
       tabelaPrioritarios.column("2", width=125, anchor='c')
       tabelaPrioritarios.column("3", width=125, anchor='c')
       tabelaPrioritarios.column("4", width=125, anchor='c')
       tabelaPrioritarios.column("5", width=125, anchor='c')
       tabelaPrioritarios.column("6", width=125, anchor='c')
       # cabecalhos da nova tabela
       tabelaPrioritarios.heading("0", text="Usuario")
       tabelaPrioritarios.heading("1", text="Descricao")
       tabelaPrioritarios.heading("2", text="Data")
       tabelaPrioritarios.heading("3", text="Hora")
       tabelaPrioritarios.heading("4", text="Local")
       tabelaPrioritarios.heading("5", text="Alarme")
       tabelaPrioritarios.heading("6", text="Prioritario")
       # abre arquivo com opcao de leitura, copia em t e fecha o arquivo
       arquivo = open('documents.txt', 'r')
       t = arquivo.readlines()
       arquivo.close()
       for i in t:
           j = i.split(';')
           if len(j) < 7: # linha de arquivo invalida
               continue
           if j[6] == 'S': # se esta marcado como prioritario, adiciona na tabela
               tabelaPrioritarios.insert("",'end',values=(j[0], j[1], j[2], j[3], j[4], j[5], j[6]))
       return
   # 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()
           prioritario = aprioritario.get()
           # se os dados forem invalidos, nao faz nada
           if not dadosValidos(usuario, descricao, data, hora, local, alarme, prioritario):
               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 + ';')
           lista.append(prioritario + ';')
           # 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) < 7: # linha de arquivo invalida
                       continue
                   diferente = False
                   for j in range(0, 7): # 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, prioritario))
           # destroi janela
           janelacriar.destroy()
           return
       janelacriar = Tk()                   # cria nova janela
       janelacriar.geometry("280x230")      # 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)
       prioritario = Label(janelacriar, text = "Prioritario:").place(x = 5, y = 155)
       aprioritario = Entry(janelacriar)
       aprioritario.place(x = 100, y = 155)
       aprioritario.insert(END, y[6])
       Exemplo = Label(janelacriar, text = "(S/N)", font = "Times 5").place(x = 225, y = 160)
       #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 = 190)
       janelacriar.mainloop()
       return
   # 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) < 7: # linha de arquivo invalida
               continue
           diferente = False
           for j in range(0, 7): # 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)
   # funcao para ordenar por coluna
   def treeview_sort_column(tv, col, reverse):
       l = [(tv.set(k, col), k) for k in tv.get_children()]
       l.sort(reverse=reverse)
       # rearrange items in sorted positions
       for index, (val, k) in enumerate(l):
           tv.move(k, , index)
       # reverse sort next time
       tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))
   # janela "principal"
   janela = Tk()              # cria uma nova janela
   janela.title("On time")    # nome da janela
   janela.geometry("875x600") # dimensoes (largura x altura) da janela
   # cria o botao de criar evento em cima da janela principal
   criar = Button(text = "Adicionar evento", command = criar)
   criar.place(x = 1, y = 575)
   # botao de pesquisar
   pesquisar = Button(text = "Pesquisar evento", command = pesquisar)
   pesquisar.place(x = 102, y = 575)
   # botao de mostrar agenda de hj
   hoje = Button(text = "Mostrar eventos de hoje", command = mostrarHoje)
   hoje.place(x = 202, y = 575)
   # botao de mostrar agenda da semana
   semana = Button(text = "Mostrar eventos da semana", command = mostrarSemana)
   semana.place(x = 340, y = 575)
   # botao de mostrar agenda da semana
   prioritarios = Button(text = "Mostrar eventos prioritarios", command = mostrarPrioritarios)
   prioritarios.place(x = 496, y = 575)
   # botao de editar a linha selecionada
   editar = Button(janela, text = "Editar Selecionado", command = editar)
   editar.place(x = 652, y = 575)
   # botao de editar a linha selecionada
   delete = Button(janela, text = "Deletar Selecionado", command = delete)
   delete.place(x = 760, y = 575)


   # tabela de eventos
   # cria uma tabela treeview
   colunas = ("0", "1", "2", "3", "4", "5", "6")
   tabela = ttk.Treeview(janela, columns=colunas, selectmode = 'browse', show = 'headings', height = 27)
   # posiciona a tabela
   tabela.place(x = 0, y = 0)
   # funcao pra ordenar por valor da coluna, quando clicar na coluna
   for col in colunas:
       tabela.heading(col, text=col, command=lambda _col=col: treeview_sort_column(tabela, _col, False))
   # 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')
   tabela.column("6", width=125, anchor='c')
   # 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")
   tabela.heading("6", text="Prioritario")
   # abre o arquivo c opcao de leitura, salva em t e depois fecha
   arquivo = open('documents.txt', 'a')
   arquivo.close()
   arquivo = open('documents.txt', 'r')
   t = arquivo.readlines()
   arquivo.close()
   # copia as informacoes do arquivo documents.txt pra tabela
   for i in t:
       v = i.split(';')
       if len(v) < 7: # linha de arquivo invalida
           continue
       if(dadosValidos(v[0], v[1], v[2], v[3], v[4], v[5], v[6])): # 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], v[6]))
   # checka se algum alarme tem que ser disparado
   janela.after(500, task)
   # mainloop da janela
   janela.mainloop()




login() if conectado:

   agenda()

</syntaxhighlight>


Apresentação Final


  • Mostrar o programa funcionando para o professor
  • Implementar a funcionalidade abaixo:
    • Aluno João Antônio: Incluir um novo campo para evento: Tipo. Exemplo: Pessoal, Trabalho, Estudo, Familiar, etc
    • Aluno 2: Evitar que o alarme dispare nos feriados. Implementar apenas um, por exemplo: 24/12/2017.
    • Aluno 3:
    • Aluno 4: