Aplicativo de Lista de Compras (local-first) com interface em Tkinter e sincronização por versão.
- Login simples por nome (sem senha)
- Criar e remover listas (compartilhadas entre todos os usuários)
- Visualizar listas com número de versão
- Adicionar, remover e listar itens de uma lista
- Alternar status de item (marcado/não marcado)
- Ajustar quantidade desejada e quantidade adquirida
- Sistema de versões: Cada modificação incrementa o contador de versão
- Sincronização manual: Botão "Atualizar" sincroniza com a base de dados partilhada
- Múltiplas instâncias: Suporta várias aplicações acessando a mesma BD simultaneamente
Persistência local utilizando SQLite com version counters (Last-Writer-Wins).
- Python 3.10+ (recomendado)
- Tkinter (módulo padrão do Python)
- Linux/WSL:
sudo apt install python3-tk - macOS: Incluído com Python (via python.org ou Homebrew)
- Windows: Incluído com Python
- Linux/WSL:
Não há dependências externas via pip.
chmod +x run.sh
./run.shpython main_tk.pyOu use o script batch:
run.batOpção 1 - Direto do Windows:
wsl bash run_instance.shOpção 2 - Dentro do WSL:
./run.shpython3 -m venv .venv
source .venv/bin/activate # Linux/Mac/WSL
# OU
.venv\Scripts\activate # Windowspython -c "from src import db; db.init_db()"rm -f data/db.sqlite # Linux/Mac/WSL
python scripts/init_db.py --forcePara testar o sistema de versões com sincronização:
Terminal 1:
cd /mnt/c/Users/USER/OneDrive/Ambiente\ de\ Trabalho/sdle/Projeto-SDLE
python3 main_tk.pyTerminal 2 (nova janela):
cd /mnt/c/Users/USER/OneDrive/Ambiente\ de\ Trabalho/sdle/Projeto-SDLE
python3 main_tk.py- Instância 1: Login como "João", criar lista "Supermercado"
- Instância 2: Login como "Maria", clicar botão "Atualizar" - lista aparece
- Instância 1: Adicionar item "Leite" - versão da lista incrementa (v0 para v1)
- Instância 2: Clicar "Atualizar" - ver versão v1 e item "Leite"
Notas:
- Ambas as instâncias partilham a mesma base de dados SQLite
- Versões incrementam automaticamente em cada modificação
- Botão "Atualizar" sincroniza sem reiniciar a aplicação
Projeto-SDLE/
├── main_tk.py # Ponto de entrada GUI (Tkinter)
├── run.sh # Script de execução Linux/Mac/WSL
├── run.bat # Script de execução Windows
├── run_instance.sh # Helper para WSL com caminho completo
├── requirements.txt # Dependências (vazio - usa stdlib)
├── data/
│ ├── database.sql # Schema SQLite (com version counters)
│ └── db.sqlite # Base de dados SQLite (criada automaticamente)
├── scripts/
│ └── init_db.py # Script para inicializar/resetar BD
└── src/
├── db.py # Conexão e inicialização SQLite
├── client.py # Operações de usuário
├── list.py # Operações de listas (com version increment)
├── item.py # Operações de itens (com version increment)
└── Ui/
├── ui_tk.py # Interface principal Tkinter
├── ui_user.py # Componente de login/user
├── ui_list.py # Componente de listas (com display de versão)
└── ui_item.py # Componente de itens (com coluna versão)
O projeto implementa um sistema básico de version counters para sincronização:
- Cada
shopping_listtem um campoversion(INTEGER) elast_modified(TIMESTAMP) - Cada
itemtambém tem um campoversion - Toda modificação incrementa a versão:
- Criar/remover item incrementa
versionda lista - Marcar/desmarcar item incrementa
versionda lista E do item - Alterar quantidade incrementa
versionda lista E do item
- Criar/remover item incrementa
- Listas: Exibem formato
id=X v2 | Nome da Lista - Itens: Coluna "Ver" mostra a versão de cada item
- Botão "Atualizar": Recarrega dados da BD mantendo seleção atual
- Status bar: Mostra mensagens de sincronização
- Last-Writer-Wins (LWW): Último a escrever na BD ganha, sem merge
- Sincronização manual: Precisa clicar "Atualizar" para ver mudanças
- Single-node: Todas as instâncias acessam a mesma BD SQLite local
- Sem resolução de conflitos: Escritas concorrentes sobrescrevem-se
Para evoluir para sistema distribuído:
- CRDTs: Implementar OR-Set, LWW-Element-Set para itens
- Vector Clocks: Substituir counters simples por timestamps vetoriais
- Replicação: Adicionar camada de comunicação (ZeroMQ, gRPC)
- Dynamo-style: Partitioning, consistent hashing, anti-entropy
- Conflict Resolution: Merge automático de escritas concorrentes
Linux/WSL:
sudo apt update
sudo apt install python3-tkmacOS:
brew install [email protected] # ajuste versãoWindows 11 (WSLg):
- Certifique-se que WSL 2 está instalado:
wsl --status - WSLg vem por padrão, janelas devem aparecer automaticamente
Windows 10 (precisa X server):
- Instale VcXsrv: https://sourceforge.net/projects/vcxsrv/
- Execute VcXsrv com "Multiple windows" e "Disable access control"
- No WSL:
export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0.0
rm -f data/db.sqlite
python scripts/init_db.py --force- Local-first software: https://www.inkandswitch.com/local-first/
- CRDTs: https://crdt.tech/papers.html
- Amazon Dynamo: https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf
- ZeroMQ: https://zeromq.org/
Projeto desenvolvido para Large Scale Distributed Systems (SDLE)
- Se a janela não aparecer, verifique se não está minimizada ou em outro desktop virtual.