-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinsert_methods_correctly.py
More file actions
203 lines (176 loc) · 7.73 KB
/
Copy pathinsert_methods_correctly.py
File metadata and controls
203 lines (176 loc) · 7.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#!/usr/bin/env python3
"""
Insere os métodos faltantes DENTRO da classe SpeedScan, antes do final da classe.
"""
import shutil
import re
from pathlib import Path
MAIN_FILE = Path("core/main.py")
BACKUP_FILE = Path("core/main.py.bak.correct")
# Métodos a serem inseridos (com indentação de 4 espaços)
METHODS = """
# =========================================================================
# Métodos do gerenciador de processos
# =========================================================================
def _check_process_queue(self):
try:
while True:
procs = self.proc_manager.callback_queue.get_nowait()
self._update_process_tree(procs)
except:
pass
self.after(500, self._check_process_queue)
def _update_process_tree(self, procs):
for row in self.process_tree.get_children():
self.process_tree.delete(row)
for p in procs:
values = (
p['pid'], p['name'],
f"{p['cpu_percent']:.1f}",
f"{p['memory_percent']:.1f}",
p['status'], p['username'] or '', p['nice'],
p.get('create_time_str', '')
)
self.process_tree.insert('', 'end', iid=str(p['pid']), values=values)
def _refresh_process_list(self):
procs = self.proc_manager.get_process_list()
self._update_process_tree(procs)
def _on_filter_change(self, event=None):
term = self.filter_entry.get()
self.proc_manager.set_filter(term)
def _on_sort_change(self, choice=None):
self.proc_manager.set_sort(self.sort_var.get(), self.reverse_var.get())
def _sort_by_column(self, col):
current_sort = self.proc_manager.sort_by
if current_sort == col:
self.proc_manager.reverse = not self.proc_manager.reverse
else:
self.proc_manager.sort_by = col
self.proc_manager.reverse = True
self.sort_var.set(col)
self.reverse_var.set(self.proc_manager.reverse)
def _kill_selected_process(self):
selected = self.process_tree.selection()
if not selected:
return
pid = int(selected[0])
if self.proc_manager.kill_process(pid):
self._refresh_process_list()
self.show_toast(f"Processo {pid} finalizado.")
else:
self.show_toast(f"Erro ao finalizar processo {pid}.", duration=3000)
def _suspend_selected_process(self):
selected = self.process_tree.selection()
if not selected:
return
pid = int(selected[0])
if self.proc_manager.suspend_process(pid):
self._refresh_process_list()
self.show_toast(f"Processo {pid} suspenso.")
else:
self.show_toast(f"Erro ao suspender processo {pid}.", duration=3000)
def _resume_selected_process(self):
selected = self.process_tree.selection()
if not selected:
return
pid = int(selected[0])
if self.proc_manager.resume_process(pid):
self._refresh_process_list()
self.show_toast(f"Processo {pid} continuado.")
else:
self.show_toast(f"Erro ao continuar processo {pid}.", duration=3000)
def _set_nice_selected(self):
selected = self.process_tree.selection()
if not selected:
return
pid = int(selected[0])
nice_val = self.nice_var.get()
if self.proc_manager.set_nice(pid, nice_val):
self._refresh_process_list()
self.show_toast(f"Nice do processo {pid} alterado para {nice_val}.")
else:
self.show_toast(f"Erro ao alterar nice do processo {pid}.", duration=3000)
def _on_process_double_click(self, event):
selected = self.process_tree.selection()
if not selected:
return
pid = int(selected[0])
self.show_toast(f"Detalhes do PID {pid} em breve.", duration=2000)
# =========================================================================
# Métodos do histórico
# =========================================================================
def _on_period_change(self, choice):
self._update_graphs()
def _on_metric_change(self, choice):
self._update_graphs()
def _update_graphs(self):
pass
# =========================================================================
# Métodos da IA
# =========================================================================
def _update_ai_suggestions(self):
sugestoes = self.ai_proactive.get_summary()
if hasattr(self, 'ai_sugestoes_text'):
self.ai_sugestoes_text.delete("1.0", "end")
self.ai_sugestoes_text.insert("1.0", sugestoes)
"""
def main():
print("🔧 Inserindo métodos dentro da classe SpeedScan...")
if not MAIN_FILE.exists():
print("❌ core/main.py não encontrado!")
return
shutil.copy(MAIN_FILE, BACKUP_FILE)
print(f"✅ Backup: {BACKUP_FILE}")
with open(MAIN_FILE, "r", encoding="utf-8") as f:
lines = f.readlines()
# Procurar a última linha da classe (antes do if __name__)
# Estratégia: encontrar a última linha que não está indentada (nível 0) após a definição da classe
# E que seja antes de "if __name__"
insert_index = None
in_class = False
class_indent = 0
for i, line in enumerate(lines):
if re.match(r'^class SpeedScan\(ctk\.CTk\):', line):
in_class = True
# a indentação da classe é 0, os métodos internos têm indentação maior
continue
if in_class:
# Verificar se a linha tem indentação menor que a dos métodos (fim da classe)
# Consideramos que a classe termina quando encontramos uma linha não indentada
# (ou com indentação 0) e que não seja comentário ou linha em branco
stripped = line.lstrip()
if stripped and not stripped.startswith('#'):
indent = len(line) - len(stripped)
if indent <= class_indent:
# Encontramos uma linha com indentação menor ou igual à da classe
# Isso pode ser o final da classe
# Mas precisamos garantir que não é um método ou atributo
# Vamos verificar se é algo como "if __name__" ou outra definição
if 'if __name__' in line or 'def ' not in line:
insert_index = i
break
if insert_index is None:
# Se não encontrar, procurar por "if __name__"
for i, line in enumerate(lines):
if 'if __name__' in line:
insert_index = i
break
if insert_index is None:
print("❌ Não foi possível localizar o local de inserção.")
return
# Inserir os métodos antes da linha encontrada
methods_lines = METHODS.splitlines(True)
# Ajustar indentação: os métodos já têm 4 espaços no início, mas precisamos garantir
# que estejam no mesmo nível dos outros métodos (provavelmente 4 ou 8 espaços)
# Vamos usar a indentação da linha anterior (que deve ser um método)
# Como fallback, usamos 4 espaços.
indent = ' '
methods_lines_indented = [indent + line if line.strip() and not line.startswith(' ') else line for line in methods_lines]
new_lines = lines[:insert_index] + methods_lines_indented + lines[insert_index:]
with open(MAIN_FILE, "w", encoding="utf-8") as f:
f.writelines(new_lines)
print("✅ Métodos inseridos corretamente dentro da classe!")
print("▶️ Execute 'python -m core.main' para testar.")
print("🧹 Após testar, pode excluir este script.")
if __name__ == "__main__":
main()