-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
160 lines (129 loc) · 7.7 KB
/
main.py
File metadata and controls
160 lines (129 loc) · 7.7 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
import tkinter as tk
from tkterminal import Terminal
import subprocess
import threading
import os
class ScriptManager(tk.Tk):
def __init__(self):
super().__init__()
self.title("Script Manager")
self.geometry("800x600")
# Пути к скриптам
self.scripts = [
{'script': 'bots/bot1/main.py', 'name': 'Бот 1'},
{'script': 'bots/bot2/main.py', 'name': 'Бот 2'},
{'script': 'bots/bot3/main.py', 'name': 'Бот 3'},
{'script': 'bots/bot1/main.py', 'name': 'Бот 4'},
{'script': 'bots/bot2/main.py', 'name': 'Бот 5'},
{'script': 'bots/bot3/main.py', 'name': 'Бот 6'},
{'script': 'bots/bot2/main.py', 'name': 'Бот 7'},
{'script': 'bots/bot3/main.py', 'name': 'Бот 8'},
# Добавьте остальные скрипты
]
self.processes = [None] * len(self.scripts) # Список процессов для управления скриптами
self.terminals = [] # Список для хранения терминалов
self.status_labels = [] # Список для хранения меток статуса
self.toggle_buttons = [] # Список для хранения кнопок переключения
# Основной контейнер с прокруткой
container = tk.Frame(self)
container.pack(fill='both', expand=True)
# Создание фрейма для прокрутки
scrollable_frame = tk.Frame(container)
scrollable_frame.pack(fill='both', expand=True)
# Создание ползунка прокрутки
scrollbar = tk.Scrollbar(scrollable_frame)
scrollbar.pack(side='right', fill='y')
# Создание холста для прокрутки
canvas = tk.Canvas(scrollable_frame, yscrollcommand=scrollbar.set)
canvas.pack(side='left', fill='both', expand=True)
# Привязка прокрутки к холсту
scrollbar.config(command=canvas.yview)
# Основной контейнер для терминалов
self.terminal_frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=self.terminal_frame, anchor='nw')
for i, script in enumerate(self.scripts):
row = tk.Frame(self.terminal_frame)
row.pack(fill='x', padx=5, pady=5)
# Фрейм для метки, кнопки и статуса
label_frame = tk.Frame(row)
label_frame.pack(side='left', padx=5) # Установим метки слева
# Метка с названием скрипта
script_label = tk.Label(label_frame, text=script['name'], font=("Arial", 12, "bold"))
script_label.pack(side='top', padx=5) # Установим метку сверху
# Фрейм для кнопки и статуса
button_frame = tk.Frame(row)
button_frame.pack(side='left', padx=5) # Установим кнопки слева
# Кнопка запуска/остановки
toggle_button = tk.Button(button_frame, text="Запустить", command=lambda idx=i: self.toggle_script(idx), bg="green",
fg="white")
toggle_button.pack(side='top', padx=5)
self.toggle_buttons.append(toggle_button) # Сохраняем ссылку на кнопку
# Метка состояния
status_label = tk.Label(button_frame, text="Статус: Остановлен", fg="black")
status_label.pack(side='top', padx=5)
self.status_labels.append(status_label) # Сохраняем ссылки на метки состояния
# Создаем терминал для вывода каждого скрипта
terminal = Terminal(row, width=80, height=10)
terminal.pack(side='top', fill='both', expand=True) # Установим терминал на полный размер
self.terminals.append(terminal)
# Обновление области прокрутки
self.terminal_frame.update_idletasks()
canvas.config(scrollregion=canvas.bbox("all"))
# Обработка событий прокрутки мыши для всего окна
self.bind("<MouseWheel>", lambda event: self.on_mouse_wheel(event, canvas))
# Настройка изменения размера окна
self.bind("<Configure>", self.on_resize)
def on_resize(self, event):
# Обновление ширины терминала при изменении размера окна
for terminal in self.terminals:
terminal.config(width=self.winfo_width() - 50) # Установим ширину терминала
def on_mouse_wheel(self, event, canvas):
# Прокручиваем холст на величину прокрутки колеса мыши
canvas.yview_scroll(int(-1 * (event.delta // 120)), "units")
def toggle_script(self, index):
# Проверяем, если скрипт уже запущен
if self.processes[index] is None:
self.start_script(index)
else:
self.stop_script(index)
def start_script(self, index):
script_path = self.scripts[index]['script']
if os.path.exists(script_path):
# Запускаем скрипт в отдельном потоке
threading.Thread(target=self.run_script, args=(index,)).start()
self.status_labels[index].config(text="Статус: Запущен", fg="green") # Обновляем статус
self.toggle_buttons[index].config(text="Остановить", bg="red") # Меняем текст и цвет кнопки
else:
print(f"Скрипт {script_path} не найден.")
def run_script(self, index):
# Запускаем скрипт через subprocess
process = subprocess.Popen(
['python', self.scripts[index]['script']],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
bufsize=1
)
self.processes[index] = process
# Чтение вывода в терминал
while process.poll() is None:
output = process.stdout.readline()
if output:
self.terminals[index].insert(tk.END, output) # Используем insert для вывода текста
process.stdout.close()
process.stderr.close()
self.status_labels[index].config(text="Статус: Остановлен", fg="red") # Обновляем статус после завершения
self.toggle_buttons[index].config(text="Запустить", bg="green") # Меняем текст и цвет кнопки обратно
def stop_script(self, index):
# Останавливаем процесс, если он существует
if self.processes[index] is not None:
self.processes[index].terminate()
self.processes[index] = None
self.status_labels[index].config(text="Статус: Остановлен", fg="red") # Обновляем статус
self.toggle_buttons[index].config(text="Запустить", bg="green") # Меняем текст и цвет кнопки обратно
print(f"Скрипт {self.scripts[index]['script']} остановлен.")
else:
print(f"Скрипт не запущен.")
if __name__ == '__main__':
app = ScriptManager()
app.mainloop()