Skip to content

Commit afca754

Browse files
theme
1 parent 5d14f85 commit afca754

11 files changed

Lines changed: 329 additions & 36 deletions

.github/workflows/main.yml

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Build Windows EXE
1+
name: Build Windows EXE with Installer
22

33
on:
44
push:
@@ -21,7 +21,8 @@ jobs:
2121
- name: 📦 Instalar dependências
2222
run: |
2323
python -m pip install --upgrade pip
24-
pip install pyinstaller customtkinter pillow matplotlib numpy scipy control sympy
24+
pip install -r requirements.txt
25+
pip install pyinstaller
2526
2627
- name: ⚙️ Compilar o sistema
2728
run: |
@@ -32,27 +33,45 @@ jobs:
3233
--name "SistemaControle" `
3334
--icon=image/icons/papel.ico `
3435
--add-data "logo.png;." `
35-
--add-data "image/icons/papel.ico;image/icons" `
36+
--add-data "ico.png;." `
37+
--add-data "image;image" `
38+
--add-data "tema_config.py;." `
3639
--add-data "criterios_estabilidade.py;." `
3740
--add-data "analise_segunda_ordem.py;." `
3841
--add-data "controladores.py;." `
3942
--add-data "utilidades_ui.py;." `
4043
--add-data "lugar_geometrico_raizes.py;." `
4144
--add-data "metricas_exportacao.py;." `
4245
--add-data "painel_metricas.py;." `
43-
--add-data "tela.py;." `
4446
--add-data "logger_sistema.py;." `
4547
--add-data "gerenciador_excecoes.py;." `
4648
--collect-all "customtkinter" `
4749
--collect-all "numpy" `
4850
--collect-all "scipy" `
4951
--collect-all "control" `
52+
--collect-all "matplotlib" `
53+
--collect-all "pandas" `
5054
--collect-all "reportlab" `
5155
--hidden-import "matplotlib.backends.backend_tkagg" `
56+
--hidden-import "PIL._tkinter_finder" `
5257
tela.py
5358
54-
- name: 📤 Fazer upload do executável
59+
- name: 🔧 Instalar Inno Setup
60+
run: |
61+
choco install innosetup -y
62+
63+
- name: 📦 Criar instalador
64+
run: |
65+
& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer.iss
66+
67+
- name: 📤 Upload do executável
5568
uses: actions/upload-artifact@v4
5669
with:
5770
name: Sistema-de-Controle-EXE
58-
path: dist/SistemaControle.exe
71+
path: dist/SistemaControle.exe
72+
73+
- name: 📤 Upload do instalador
74+
uses: actions/upload-artifact@v4
75+
with:
76+
name: Sistema-de-Controle-Installer
77+
path: Output/SistemaControleSetup.exe

.gitignore

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# Python
2+
__pycache__/
3+
*.py[cod]
4+
*$py.class
5+
*.so
6+
.Python
7+
build/
8+
develop-eggs/
9+
dist/
10+
downloads/
11+
eggs/
12+
.eggs/
13+
lib/
14+
lib64/
15+
parts/
16+
sdist/
17+
var/
18+
wheels/
19+
*.egg-info/
20+
.installed.cfg
21+
*.egg
22+
23+
# PyInstaller
24+
*.spec
25+
26+
# Virtual Environment
27+
venv/
28+
ENV/
29+
env/
30+
31+
# IDEs
32+
.vscode/
33+
.idea/
34+
*.swp
35+
*.swo
36+
*~
37+
38+
# OS
39+
.DS_Store
40+
Thumbs.db
41+
42+
# Logs
43+
*.log
44+
logs/
45+
46+
# Config
47+
config.json
48+
49+
# Build outputs
50+
Output/
51+
*.exe
52+
53+
# Temporary
54+
temp/
55+
tmp/
28 Bytes
Binary file not shown.
28 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

__pycache__/tela.cpython-312.pyc

21 Bytes
Binary file not shown.

analise_segunda_ordem.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import matplotlib.pyplot as plt
99
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
1010
import matplotlib
11+
1112
matplotlib.use('TkAgg')
1213

1314
try:
14-
from tela import gerenciador_temas, CORES
15+
from tema_config import gerenciador_temas, obter_cores
16+
CORES = obter_cores()
1517
except ImportError:
1618
class GerenciadorTemasFallback:
1719
def __init__(self):

controladores.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
import platform
1212

1313
try:
14-
from tela import gerenciador_temas, CORES
14+
from tema_config import gerenciador_temas, obter_cores
15+
CORES = obter_cores()
1516
except ImportError:
1617
class GerenciadorTemasFallback:
1718
def __init__(self):

installer.iss

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
; Script de instalação do Sistema de Controle
2+
; Criado com Inno Setup
3+
4+
#define MyAppName "Sistema de Controle"
5+
#define MyAppVersion "1.0.0"
6+
#define MyAppPublisher "Luís Fernando Alves"
7+
#define MyAppExeName "SistemaControle.exe"
8+
#define MyAppIcon "image\icons\papel.ico"
9+
10+
[Setup]
11+
; Informações básicas
12+
AppId={A1B2C3D4-E5F6-7890-ABCD-EF1234567890}
13+
AppName={#MyAppName}
14+
AppVersion={#MyAppVersion}
15+
AppPublisher={#MyAppPublisher}
16+
DefaultDirName={autopf}\{#MyAppName}
17+
DefaultGroupName={#MyAppName}
18+
AllowNoIcons=yes
19+
OutputDir=Output
20+
OutputBaseFilename=SistemaControleSetup
21+
SetupIconFile={#MyAppIcon}
22+
Compression=lzma2/ultra64
23+
SolidCompression=yes
24+
WizardStyle=modern
25+
UninstallDisplayIcon={app}\{#MyAppExeName}
26+
27+
; Privilégios
28+
PrivilegesRequired=admin
29+
30+
; Idiomas
31+
[Languages]
32+
Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"
33+
34+
[Tasks]
35+
Name: "desktopicon"; Description: "Criar atalho na Área de Trabalho"; GroupDescription: "Atalhos adicionais:"; Flags: unchecked
36+
Name: "quicklaunchicon"; Description: "Criar atalho na Barra de Tarefas"; GroupDescription: "Atalhos adicionais:"; Flags: unchecked
37+
38+
[Files]
39+
Source: "dist\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
40+
Source: "logo.png"; DestDir: "{app}"; Flags: ignoreversion
41+
Source: "ico.png"; DestDir: "{app}"; Flags: ignoreversion
42+
Source: "image\*"; DestDir: "{app}\image"; Flags: ignoreversion recursesubdirs createallsubdirs
43+
Source: "README.md"; DestDir: "{app}"; Flags: ignoreversion isreadme
44+
45+
[Icons]
46+
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{app}\image\icons\papel.ico"
47+
Name: "{group}\Desinstalar {#MyAppName}"; Filename: "{uninstallexe}"
48+
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{app}\image\icons\papel.ico"; Tasks: desktopicon
49+
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{app}\image\icons\papel.ico"; Tasks: quicklaunchicon
50+
51+
[Run]
52+
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Description: "Executar {#MyAppName}"; Flags: nowait postinstall skipifsilent
53+
54+
[Code]
55+
function InitializeSetup(): Boolean;
56+
begin
57+
Result := True;
58+
end;

tela.py

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@
1818
from gerenciador_excecoes import gerenciador_excecoes, TipoErro, GerenciadorExcecoes # import exception handler
1919
from utilidades_ui import GerenciadorResponsividade, UtiliadadesGraficos # import UI utilities
2020
from lugar_geometrico_raizes import AnalisadorLGR, ErroValidacaoLGR
21+
from tema_config import GerenciadorTemas, gerenciador_temas
22+
23+
CORES = gerenciador_temas.obter_cores()
24+
25+
# Configuração do tema inicial
26+
ctk.set_appearance_mode(CORES["mode"])
27+
ctk.set_default_color_theme("blue")
28+
2129

2230
class GerenciadorTemas:
2331
"""Gerencia temas claro e escuro com persistência"""
@@ -533,8 +541,8 @@ def configurar_atalhos(self):
533541
self.bind("<Alt-F4>", lambda e: self._on_closing())
534542

535543
# Atalhos de teclado para acessibilidade
536-
self.bind("<Control-plus>", lambda e: self.aumentar_fonte())
537-
self.bind("<Control-minus>", lambda e: self.diminuir_fonte())
544+
self.bind("<Control-plus>", lambda e: self.aumentar_fonte_global())
545+
self.bind("<Control-minus>", lambda e: self.diminuir_fonte_global())
538546
self.bind("<Control-t>", lambda e: self.alternar_tema())
539547
self.bind("<Control-h>", lambda e: self.mostrar_ajuda())
540548
self.bind("<Control-c>", lambda e: self.toggle_alto_contraste())
@@ -826,7 +834,7 @@ def mostrar_painel_configuracoes(self):
826834
ctk.CTkButton(
827835
frame_acess,
828836
text="🔤 Aumentar Fonte (Ctrl++)",
829-
command=self.aumentar_fonte,
837+
command=self.aumentar_fonte_global,
830838
width=250,
831839
height=40,
832840
font=("Segoe UI", self.scale_font(14), "bold"),
@@ -837,7 +845,7 @@ def mostrar_painel_configuracoes(self):
837845
ctk.CTkButton(
838846
frame_acess,
839847
text="🔡 Diminuir Fonte (Ctrl+-)",
840-
command=self.diminuir_fonte,
848+
command=self.diminuir_fonte_global,
841849
width=250,
842850
height=40,
843851
font=("Segoe UI", self.scale_font(14), "bold"),
@@ -913,34 +921,45 @@ def toggle_alto_contraste(self):
913921
else:
914922
self.aplicar_tema("high_contrast")
915923

916-
def aumentar_fonte(self):
917-
"""Aumenta o tamanho das fontes do sistema"""
918-
# Obtem o tamanho atual e adiciona um valor fixo ou proporcional
924+
def aumentar_fonte_global(self):
925+
"""Aumenta o tamanho das fontes do sistema em todos os frames ativos"""
926+
# Ajusta o tamanho base das fontes
919927
if self.font_corpo.cget("size") < 20: # Limite para evitar fontes gigantes
920928
self.font_titulo.configure(size=self.font_titulo.cget("size") + 2)
921929
self.font_subtitulo.configure(size=self.font_subtitulo.cget("size") + 2)
922930
self.font_corpo.configure(size=self.font_corpo.cget("size") + 1)
923931
self.font_label.configure(size=self.font_label.cget("size") + 1)
924932
self.font_pequeno.configure(size=self.font_pequeno.cget("size") + 1)
925-
logger.info("Fontes aumentadas")
933+
934+
# Atualiza fontes em módulos abertos
935+
for widget in self.winfo_children():
936+
if isinstance(widget, FrameBase):
937+
widget.atualizar_fontes()
938+
939+
logger.info("Fontes aumentadas globalmente")
926940

927-
def diminuir_fonte(self):
928-
"""Diminui o tamanho das fontes do sistema"""
929-
# Obtem o tamanho atual e subtrai um valor fixo ou proporcional
941+
def diminuir_fonte_global(self):
942+
"""Diminui o tamanho das fontes do sistema em todos os frames ativos"""
930943
if self.font_corpo.cget("size") > 10: # Limite para evitar fontes muito pequenas
931944
self.font_titulo.configure(size=self.font_titulo.cget("size") - 2)
932945
self.font_subtitulo.configure(size=self.font_subtitulo.cget("size") - 2)
933946
self.font_corpo.configure(size=self.font_corpo.cget("size") - 1)
934947
self.font_label.configure(size=self.font_label.cget("size") - 1)
935948
self.font_pequeno.configure(size=self.font_pequeno.cget("size") - 1)
936-
logger.info("Fontes diminuídas")
949+
950+
# Atualiza fontes em módulos abertos
951+
for widget in self.winfo_children():
952+
if isinstance(widget, FrameBase):
953+
widget.atualizar_fontes()
954+
955+
logger.info("Fontes diminuídas globalmente")
937956

938957
def resetar_fonte(self):
939958
"""Reseta as fontes para o tamanho padrão"""
940959
self.font_titulo.configure(size=20)
941960
self.font_subtitulo.configure(size=16)
942961
self.font_corpo.configure(size=14)
943-
self.font_label.configure(size=10)
962+
self.font_label.configure(size=12)
944963
self.font_pequeno.configure(size=10)
945964
logger.info("Fontes resetadas")
946965

@@ -1071,7 +1090,7 @@ def mostrar_erro(self, mensagem):
10711090
text_color=CORES["erro"]
10721091
).pack(pady=(20, 10))
10731092

1074-
ctk.CTkTextbox(
1093+
erro_textbox = ctk.CTkTextbox(
10751094
janela_erro,
10761095
font=self.font_corpo,
10771096
text_color=CORES["texto_principal"],
@@ -1080,11 +1099,10 @@ def mostrar_erro(self, mensagem):
10801099
height=100,
10811100
wrap="word",
10821101
activate_scrollbars=True
1083-
).pack(pady=10, padx=20, fill="both", expand=True)
1084-
1085-
# Insere a mensagem no Textbox (que acabamos de criar)
1086-
janela_erro.winfo_children()[-1].insert("1.0", mensagem)
1087-
janela_erro.winfo_children()[-1].configure(state="disabled")
1102+
)
1103+
erro_textbox.pack(pady=10, padx=20, fill="both", expand=True)
1104+
erro_textbox.insert("1.0", mensagem)
1105+
erro_textbox.configure(state="disabled")
10881106

10891107
ctk.CTkButton(
10901108
janela_erro,
@@ -1121,6 +1139,11 @@ def recriar_interface(self):
11211139
# Fechar painel de configurações se estiver aberto
11221140
if self.config_visivel:
11231141
self.toggle_configuracoes()
1142+
1143+
# Atualizar fontes dos frames de módulos abertos
1144+
for widget in self.winfo_children():
1145+
if isinstance(widget, FrameBase):
1146+
widget.atualizar_fontes()
11241147

11251148
def trocar_para_frame(self, frame_class, *args, **kwargs):
11261149
"""
@@ -1143,14 +1166,13 @@ def trocar_para_frame(self, frame_class, *args, **kwargs):
11431166
self.frame_atual.grid(row=0, column=0, sticky="nsew")
11441167

11451168
# Fade in
1146-
self.after(50)
1147-
self.attributes("-alpha", 1.0)
1169+
self.after(50, lambda: self.attributes("-alpha", 1.0)) # Usar lambda para garantir execução assíncrona
11481170

11491171
def voltar_para_menu(self):
11501172
"""Volta para o menu principal com transição"""
11511173
self.trocar_para_frame(TelaPrincipal)
11521174

1153-
# Aumentar e diminuir fonte já foram refatorados acima em SistemaTCC
1175+
# Métodos de fonte globais definidos em aumentar_fonte_global e diminuir_fonte_global
11541176

11551177
# Este método abrir_janela foi atualizado acima, removendo a lógica "lgr"
11561178
# def abrir_janela(self, tipo_janela, titulo): ...
@@ -1453,6 +1475,11 @@ def voltar_menu(self):
14531475
"""Volta para o menu principal"""
14541476
self.controlador.voltar_para_menu()
14551477

1478+
def atualizar_fontes(self):
1479+
"""Atualiza fontes dos widgets deste frame (se necessário)"""
1480+
# Exemplo: Se houver labels, botões, etc. com fontes específicas
1481+
pass # Deve ser implementado nas subclasses se necessário
1482+
14561483
class FrameCriterio(FrameBase):
14571484
def __init__(self, parent, controlador, titulo):
14581485
self.numerador = []
@@ -2240,7 +2267,7 @@ def plotar_grafico(self):
22402267
self.canvas_grafico.draw()
22412268

22422269
canvas_widget = self.canvas_grafico.get_tk_widget()
2243-
canvas_widget.grid(row=0, column=0, sticky="nsew", padx=0, pady=0)
2270+
canvas_widget.grid(row=0, column=0, sticky="nsew")
22442271
canvas_widget.grid_propagate(True)
22452272

22462273
toolbar_frame = ctk.CTkFrame(self.grafico_container, fg_color="transparent")
@@ -2272,11 +2299,6 @@ def mostrar_erro(self, mensagem):
22722299
self.texto_resultados.insert("end", "• Denominador: 1 2 4\n")
22732300
self.texto_resultados.insert("end", " (representa: G(s) = 4 / (s² + 2s + 4))\n")
22742301

2275-
2276-
# ==================================================================
2277-
# ================== CLASSE JANELALGR ATUALIZADA ===================
2278-
# ==================================================================
2279-
22802302
class JanelaLGR(FrameBase):
22812303
"""Frame para análise do Lugar Geométrico das Raízes (agora herda de FrameBase)"""
22822304

0 commit comments

Comments
 (0)