Jun-09-2020, 02:19 AM
The code below runs 3 threads.
how can I stop them (especially print_to_box) without freezing the program?
This is the handler:
how can I stop them (especially print_to_box) without freezing the program?
This is the handler:
def thread_handler(self, host): threads = [] wt = threading.Thread(target=self.write_to_file, args=(host,)) pt = threading.Thread(target=self.print_to_box, args=(host,)) dt = threading.Thread(target=self.delete_default_lines, args=()) threads.append(wt) threads.append(pt) threads.append(dt) for t in threads: t.start()
import tkinter.scrolledtext as scrolledtext from threading import Lock, Event import multiprocessing as mp import subprocess as sub import tkinter as tk import threading import shutil import signal import time import sys import os import io class GUI(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) # self.geometry("860x528") self.title("GUI Project") self.resizable(0, 0) menu = tk.Frame(self, relief="solid") container = tk.Frame(self, relief="solid", bg="purple") menu.pack(side="left", fill="both", expand=True) container.pack(side="right", fill="y", expand=True) menu.grid_rowconfigure(0, weight=1) container.grid_rowconfigure(0, weight=1) container.grid_rowconfigure(1, weight=1) container.grid_rowconfigure(2, weight=1) container.grid_rowconfigure(3, weight=1) container.grid_rowconfigure(4, weight=1) container.grid_rowconfigure(5, weight=1) container.grid_rowconfigure(6, weight=1) container.grid_columnconfigure(0, weight=1) container.grid_columnconfigure(1, weight=2) container.grid_columnconfigure(2, weight=2) container.grid_columnconfigure(3, weight=2) container.grid_columnconfigure(4, weight=2) container.grid_columnconfigure(5, weight=2) container.grid_columnconfigure(6, weight=2) self.frames = ["Menu", "CmdCli", "FutureFeature", "FutureFeature2", "FutureFeature3"] self.frames[0] = Menu(parent=menu, controller=self) self.frames[1] = CmdCli(parent=container, controller=self) self.frames[2] = FutureFeature(parent=container, controller=self) self.frames[3] = FutureFeature2(parent=container, controller=self) self.frames[4] = FutureFeature3(parent=container, controller=self) self.frames[0].grid(row=0, column=0, sticky="nsew") self.frames[1].grid(row=0, column=0, sticky="nsew") self.frames[2].grid(row=0, column=0, sticky="nsew") self.frames[3].grid(row=0, column=0, sticky="nsew") self.frames[4].grid(row=0, column=0, sticky="nsew") self.show_frame(1) def show_frame(self, page_name): frame = self.frames[page_name] print(frame) frame.tkraise() frame.grid(row=0, column=0, sticky="nsew") class Menu(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent, bg="black") self.controller = controller ping_test_button = tk.Button(self, text="CLI CMD", bg="skyblue1", pady=30, command=lambda: controller.show_frame(1)) future_feature1_button = tk.Button(self, text="FutureFeature", bg="dark violet", pady=30, command=lambda: controller.show_frame(2)) future_feature2_button = tk.Button(self, text="FutureFeature2", bg="pale goldenrod", pady=30, command=lambda: controller.show_frame(3)) future_feature3_button = tk.Button(self, text="FutureFeature3", bg="green", pady=30, command=lambda: controller.show_frame(4)) app_exit = tk.Button(self, text="Quit", bg="gray40", pady=30, command=lambda: self.terminate()) ping_test_button.pack(fill="both", expand=True) future_feature1_button.pack(fill="both", expand=True) future_feature2_button.pack(fill="both", expand=True) future_feature3_button.pack(fill="both", expand=True) app_exit.pack(fill="both", expand=True) @staticmethod def terminate(): while True: path = fr'c:/users/{os.getlogin()}/desktop/Gui-Skeleton' try: shutil.rmtree(path) exit() except OSError as err: print(f"Error Deleting tmp folder! {err}") exit() class CmdCli(tk.Frame): file = fr'c:/users/{os.getlogin()}/Desktop/default.txt' newfile = fr'c:/users/{os.getlogin()}/Desktop/Gui-Skeleton/default-tmp.txt' lastfile = fr'c:/users/{os.getlogin()}/Desktop/logger.txt' def __init__(self, parent, controller): tk.Frame.__init__(self, parent, bg="skyblue1") self.controller = controller self.command_label = tk.Label(self, text="Enter Command : ", padx=7, pady=5, bg="skyblue1") self.command_input_box = tk.Entry(self) self.command_input_box.bind('<Return>', lambda e: self.thread_handler(self.command_input_box.get())) self.submit_button = tk.Button(self, text="Submit", width=10, height=1, command=lambda: self.thread_handler(self.command_input_box.get())) self.clear_field_button = tk.Button(self, text="Clear Field", width=10, padx=2, command=lambda: self.clear_boxes(self.command_input_box)) self.clear_file_button = tk.Button(self, text="Clear File", width=10, command=lambda: open(self.lastfile, 'w+').close()) self.clear_window_button = tk.Button(self, text="Clear Window", width=10, command=lambda: self.clean_window()) self.stop_button = tk.Button(self, text="Stop", padx=20, command=lambda: self.stop_process()) self.grid_columnconfigure(0, minsize=20, weight=0) self.grid_columnconfigure(1, minsize=20, weight=2) self.grid_columnconfigure(2, minsize=5, weight=3) self.grid_columnconfigure(3, minsize=20, weight=2) self.grid_rowconfigure(0, minsize=50, weight=0) self.grid_rowconfigure(1, minsize=20, weight=0) self.grid_rowconfigure(2, minsize=30, weight=0) self.grid_rowconfigure(3, minsize=10, weight=0) self.grid_rowconfigure(4, minsize=10, weight=0) self.grid_rowconfigure(5, minsize=10, weight=0) self.command_label.grid(row=0, column=1, sticky="nsew") self.command_input_box.grid(row=1, column=1, sticky="nsew") self.clear_window_button.grid(row=3, column=1, sticky="w") self.clear_file_button.grid(row=3, column=1, sticky="n") self.clear_field_button.grid(row=1, column=1, sticky="e") self.submit_button.grid(row=3, column=1, sticky="se") self.stop_button.place(x=510, y=106) self.text_widget() def clear_files(self): open(self.file, 'w+').close() def text_widget(self): self.text_window = tk.scrolledtext.ScrolledText(self, bg="slategray1") self.text_window.insert(tk.END, "") self.text_window.config(state=tk.NORMAL) self.text_window.grid(row=5, column=1, rowspan=3, sticky="nsew") def stop_process(self): pass @staticmethod def clear_boxes(url_input): url_input.delete(0, "end") def clean_window(self): self.text_window.delete("1.0", tk.END) self.text_window.insert("1.0", ">>") def thread_handler(self, host): threads = [] wt = threading.Thread(target=self.write_to_file, args=(host,)) pt = threading.Thread(target=self.print_to_box, args=(host,)) dt = threading.Thread(target=self.delete_default_lines, args=()) threads.append(wt) threads.append(pt) threads.append(dt) for t in threads: t.start() def check_path_and_create_default_txt(): path = fr'c:/users/{os.getlogin()}/desktop/Gui-Skeleton' try: if os.path.isdir(path): file = open(fr'c:/users/{os.getlogin()}/Desktop/Gui-Skeleton/default-tmp.txt', 'w+') file.close() pass else: os.mkdir(path) file = open(fr'c:/users/{os.getlogin()}/Desktop/Gui-Skeleton/default-tmp.txt', 'w+') file.close() pass except OSError as err: print(f"[!] Operation failed! {err}") def start_logger_file(): with open(fr'c:/users/{os.getlogin()}/desktop/logger.txt', 'w+'): pass def main(): print("Main Gui Thread") t2 = threading.Thread(name="Check Path and Create default-tmp", target=check_path_and_create_default_txt, args=()) t3 = threading.Thread(name="Start Listening File", target=start_logger_file) print("Starting Thread: Check Path \n Starting Thread: Listening file") t2.start() print(threading.get_ident()) t3.start() print(threading.get_ident()) # check_path_and_create_default_txt() # start_logger_file() app = GUI() app.mainloop() app.quit() if __name__ == "__main__": # lock = threading.Lock() # lock.acquire() t = threading.Thread(name="Main GUI", target=main, args=()) t.daemon = False t.start()