Sem resumo de edição
Zabisky (discussão | contribs)
 
(3 revisões intermediárias por um outro usuário não estão sendo mostradas)
Linha 10: Linha 10:
** Alterar descrição das atividades lançadas
** Alterar descrição das atividades lançadas
** Mostrar atividades por pessoa
** Mostrar atividades por pessoa
** Alarmar em datas específicas (*)
** '''Fase II:'''
** '''Fase II:'''
*** Criar botão: Mostrar Agenda de Hoje
*** Criar botão: Mostrar Agenda de Hoje
*** Ao clicar, aparecerá todas as atividades de hoje
*** Ao clicar, aparecerá todas as atividades de hoje
** '''Fase III:'''
*** Criar botão: Configurar Alarmes
*** Alarmar em datas específicas [Acordar de Manhã, Academia, Aula, ...]
<br>
<br>
<br>
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()


= Eventos - [[Let's Q Let's]] =
= Eventos - [[Let's Q Let's]] =
Linha 28: Linha 737:
*** estilo
*** estilo
*** o preço
*** o preço
** Sincronizar contatos do Face
** '''Fase II:'''
** '''Fase II:'''
*** Criar botão: Eventos da Semana
*** Criar botão: Eventos da Semana
*** Ao clicar, aparecerá todas os eventos da semana
*** Ao clicar, aparecerá todas os eventos da semana
** '''Fase III:'''
*** Autenticar pelo Face
<br>
<br>


Linha 46: Linha 756:
** '''Fase II:'''
** '''Fase II:'''
*** Criar botão: Pratos de Entrada
*** Criar botão: Pratos de Entrada
*** Ao clicar, aparecerão todos os pedidos que não foram atendidos
*** Ao clicar, aparecerá apenas o cardápio das entradas
** '''Fase III:'''
*** Criar botão: Enviar pedido por email
*** Ao clicar, o sistema enviará para o email recebido, o pedido atual
<br>
<br>


Linha 62: Linha 775:
*** Criar botão: Produtos para reposição
*** Criar botão: Produtos para reposição
*** Ao clicar, aparecerão todos os produtos cujo estoque esteja abaixo do limite mínimo
*** Ao clicar, aparecerão todos os produtos cujo estoque esteja abaixo do limite mínimo
 
** '''Fase III:'''
*** Criar botão: Ler código de barra
*** Ao clicar, o sistema lerá o código de barra e gravará o produto no Arquivo
** '''Fase IV:'''
*** Criar botão: Achar produto
*** Ao clicar, o sistema me mostra uma mapa de navegação até onde está o produto
<br>
<br>


Linha 77: Linha 795:
*** Criar botão: Metais
*** Criar botão: Metais
*** Ao clicar, aparecerão apenas os elementos do Grupo de Metais
*** Ao clicar, aparecerão apenas os elementos do Grupo de Metais
** '''Fase III:'''
*** Criar botão: Mostrar Tabela Periódica
*** Ao clicar, o sistema montará a tabela no padrão Matriz
** '''Fase IV:'''
*** Criar botão: Expandir elemento
*** Ao clicar, o sistema mostra o elemento específico, expandido, com todos os detalhes
** '''Fase V:'''
*** Criar botão: Reações perigosas
*** Ao clicar, o sistema mostra os elementos que não devem reagir entre si
<br>
<br>

Edição atual tal como às 12h32min de 17 de julho de 2017

Agenda - Calendars



  • Desenvolver um programa que construa uma Agenda que permita gerir atividades diárias.
    • 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
    • Fase II:
      • Criar botão: Mostrar Agenda de Hoje
      • Ao clicar, aparecerá todas as atividades de hoje
    • Fase III:
      • Criar botão: Configurar Alarmes
      • Alarmar em datas específicas [Acordar de Manhã, Academia, Aula, ...]


import winsound import time from datetime import datetime, timedelta from threading import Timer from tkinter import ttk from tkinter import *

primeiraExecucao = True

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

def task():

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

def desp(mensagem):

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

def checkarAlarme():

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


  1. FUNCAO PRA CHECKAR SE A ENTRADA EH VALIDA

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

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


  1. FUNCAO PARA CRIAR UM EVENTO;

def criar():

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

def pesquisar():

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

def mostrarHoje():

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

def mostrarSemana():

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


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

def editar():

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

def delete():

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

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

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

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

  1. botao de pesquisar

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

  1. botao de mostrar agenda de hj

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

  1. botao de mostrar agenda da semana

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

  1. botao de editar a linha selecionada

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

  1. botao de editar a linha selecionada

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


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

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

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

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

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

for i in t:

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


  1. posiciona a tabela e marca as colunas

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

  1. largura de cada coluna

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

  1. cabecalho de cada coluna

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

  1. checka se algum alarme tem que ser disparado

janela.after(500, task)

  1. mainloop da janela

janela.mainloop()

Eventos - Let's Q Let's


  • Desenvolver uma aplicação que informe sobre eventos da cidade de Uberlândia.
    • Cadastrar os eventos
    • Alterar os eventos cadastrados
    • Excluir algum evento
    • Mostrar eventos de acordo com:
      • o dia
      • estilo
      • o preço
    • Fase II:
      • Criar botão: Eventos da Semana
      • Ao clicar, aparecerá todas os eventos da semana
    • Fase III:
      • Autenticar pelo Face


Pedidos - Think About Eat


  • Desenvolver uma aplicação para pedidos de refeição que permita mostrar o cardápio do dia e efetuar pedidos de clientes
    • Mostrar o cardápio do dia
    • Cadastrar o pedido do cliente
    • Cadastrar o cardápio do dia
    • Alterar o cardápio
    • Receber confirmação do pedido
    • Aprovar pedido
    • Fase II:
      • Criar botão: Pratos de Entrada
      • Ao clicar, aparecerá apenas o cardápio das entradas
    • Fase III:
      • Criar botão: Enviar pedido por email
      • Ao clicar, o sistema enviará para o email recebido, o pedido atual


Produtos - Easy Buy


  • Desenvolver uma aplicação que descubra onde estão localizados determinados produtos
    • Cadastrar produtos
    • Alterar produtos
    • Excluir produtos
    • Informar estoque do produto
    • Localizar produto
    • Totalizar cesta de produtos
    • Fase II:
      • Criar botão: Produtos para reposição
      • Ao clicar, aparecerão todos os produtos cujo estoque esteja abaixo do limite mínimo
    • Fase III:
      • Criar botão: Ler código de barra
      • Ao clicar, o sistema lerá o código de barra e gravará o produto no Arquivo
    • Fase IV:
      • Criar botão: Achar produto
      • Ao clicar, o sistema me mostra uma mapa de navegação até onde está o produto


Tabela Periódica - Alchemy


  • Desenvolver uma aplicação que disponibilize informações rápidas e objetivas (Tabela na mão) sobre os elementos químicos.
    • Cadastrar os elementos químicos
    • Alterar dados
    • Excluir dados
    • Detalhar os elementos
    • Buscar elementos
    • Fase II:
      • Criar botão: Metais
      • Ao clicar, aparecerão apenas os elementos do Grupo de Metais
    • Fase III:
      • Criar botão: Mostrar Tabela Periódica
      • Ao clicar, o sistema montará a tabela no padrão Matriz
    • Fase IV:
      • Criar botão: Expandir elemento
      • Ao clicar, o sistema mostra o elemento específico, expandido, com todos os detalhes
    • Fase V:
      • Criar botão: Reações perigosas
      • Ao clicar, o sistema mostra os elementos que não devem reagir entre si