| (9 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
| Linha 1 457: | Linha 1 457: | ||
janela.mainloop() | janela.mainloop() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | |||
= 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> | |||
<br> | |||
= Apresentação Final = | |||
<br> | |||
* 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 Mariele Venancio: Evitar que o alarme dispare nos feriados. Implementar apenas um, por exemplo: 24/12/2017. | |||
** Aluno Ana Flávia Dutra: Criar novo campo que permita incluir a prioridade do evento: A, M ou B (Alta, média ou baixa) | |||
** Aluno Felipe Barros: Fazer com que o alarme dispare 2 vezes ao invés de apenas uma para cada alarme. | |||
Edição atual tal como às 10h37min de 4 de dezembro de 2017
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
- Criar botões:
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
- 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):
# 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
- 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
- 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
- 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
- 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
- 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
- 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)
- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- janela "principal"
janela = Tk() # cria uma nova janela janela.title("On time") # nome da janela janela.geometry("750x600") # 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 = 104, y = 575)
- botao de mostrar agenda de hj
hoje = Button(text = "Mostrar atividades de hoje", command = mostrarHoje) hoje.place(x = 206, y = 575)
- botao de mostrar agenda da semana
semana = Button(text = "Mostrar atividades da semana", command = mostrarSemana) semana.place(x = 358, y = 575)
- botao de editar a linha selecionada
editar = Button(janela, text = "Editar Selecionado", command = editar) editar.place(x = 527, y = 575)
- botao de editar a linha selecionada
delete = Button(janela, text = "Deletar Selecionado", command = delete) delete.place(x = 636, y = 575)
- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- tabela de eventos
- cria uma tabela treeview
tabela = ttk.Treeview(janela, selectmode = 'browse', show = 'headings', height = 27)
- abre o arquivo c opcao de leitura, salva em t e depois fecha
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) < 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]))
- posiciona a tabela e marca as colunas
tabela.place(x= 0, y = 0) tabela["columns"] = ("0", "1", "2", "3", "4", "5") tabela['show'] = 'headings'
- 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')
- 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")
- checka se algum alarme tem que ser disparado
janela.after(500, task)
- 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
- 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):
# 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
- 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
- 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
- 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
- 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
- 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
- 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)
- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- janela "principal"
janela = Tk() # cria uma nova janela janela.title("On time") # nome da janela janela.geometry("750x600") # 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 = 104, y = 575)
- botao de mostrar agenda de hj
hoje = Button(text = "Mostrar atividades de hoje", command = mostrarHoje) hoje.place(x = 206, y = 575)
- botao de mostrar agenda da semana
semana = Button(text = "Mostrar atividades da semana", command = mostrarSemana) semana.place(x = 358, y = 575)
- botao de editar a linha selecionada
editar = Button(janela, text = "Editar Selecionado", command = editar) editar.place(x = 527, y = 575)
- botao de editar a linha selecionada
delete = Button(janela, text = "Deletar Selecionado", command = delete) delete.place(x = 636, y = 575)
- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- tabela de eventos
- cria uma tabela treeview
tabela = ttk.Treeview(janela, selectmode = 'browse', show = 'headings', height = 27)
- 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()
- 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]))
- posiciona a tabela e marca as colunas
tabela.place(x= 0, y = 0) tabela["columns"] = ("0", "1", "2", "3", "4", "5") tabela['show'] = 'headings'
- 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')
- 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")
- checka se algum alarme tem que ser disparado
janela.after(500, task)
- 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 Mariele Venancio: Evitar que o alarme dispare nos feriados. Implementar apenas um, por exemplo: 24/12/2017.
- Aluno Ana Flávia Dutra: Criar novo campo que permita incluir a prioridade do evento: A, M ou B (Alta, média ou baixa)
- Aluno Felipe Barros: Fazer com que o alarme dispare 2 vezes ao invés de apenas uma para cada alarme.