CCCPaste

pyGUI_1.0.0

import tkinter as tk
from tkinter import ttk
from tkinter import *
import serial.tools.list_ports
import serial

# --- Serial Frame Global variables ---
serial_connection = None

# --- Transport Frame Global variables ---

# --- Defines for Serial Frame
def connect_serial():
    global serial_connection
    try:
        port = port_options.get()
        if not port:
            raise ValueError("No port selected")
        if port not in [port.device for port in serial.tools.list_ports.comports()]:
            raise ValueError(f"Selected port '{port}' is no longer available")
        
        baud_rate = baud_options.get()
        if not baud_rate:
            raise ValueError("No baud rate selected")
        
        serial_connection = serial.Serial(port, baud_rate)
        connect_button.config(state=tk.DISABLED)
        disconnect_button.config(state=tk.NORMAL)
        status_label.config(text=f"Connected to {port} at {baud_rate} baud")
        
        root.geometry("1080x720")  # Set the new width and height of the window
        
    except ValueError as ve:
        status_label.config(text=str(ve))
    except serial.SerialException:
        status_label.config(text="Failed to connect to serial port")

def disconnect_serial():
    global serial_connection
    if serial_connection is not None:
        serial_connection.close()
        connect_button.config(state=tk.NORMAL)
        disconnect_button.config(state=tk.DISABLED)
        status_label.config(text="Disconnected")
        
        # Restore the window size
        root.geometry("")  # Reset the window size to its default

def update_com_ports():    
    port_list = [port.device for port in serial.tools.list_ports.comports()]
    port_combo['values'] = port_list
    root.after(1000, update_com_ports)  # Schedule this function to run every 1000 milliseconds (1 second)


# --- Initialize Tkinter ---
root = tk.Tk()
img = PhotoImage(file='icon.png')
root.iconphoto(False, img)
root.title("Serial Monitor")

# --- Variables for Serial ---
#Frame Get available ports and baud rates
port_list = [port.device for port in serial.tools.list_ports.comports()]
baud_list = ["110", "300", "600", "1200", "2400", "4800", "9600", "14400", "19200", "38400", "57600", "115200", "128000", "256000"]

# Variables for selected options
port_options = tk.StringVar()
baud_options = tk.StringVar()

# --- Create Frames ---
left_frame = tk.Frame(root, bg="cyan")
right_frame = tk.Frame(root, bg="pink")
serial_frame = tk.Frame(left_frame, bg="blue")
transport_frame = tk.Frame(left_frame, bg="green")
transport2_frame = tk.Frame(right_frame, bg="yellow")

# --- Create Serial Widgets ---
serial_title = tk.Label(serial_frame, text="Serial Settings")  # Set label background color to blue
port_label = tk.Label(serial_frame, text="COM Port:")  # Set label background color to blue
baud_label = tk.Label(serial_frame, text="Baud Rate:")  # Set label background color to blue
port_combo = ttk.Combobox(serial_frame, textvariable=port_options, values=port_list, state="readonly")
baud_combo = ttk.Combobox(serial_frame, textvariable=baud_options, values=baud_list, state="readonly")
connect_button = tk.Button(serial_frame, text="Connect", command=connect_serial)
disconnect_button = tk.Button(serial_frame, text="Disconnect", command=disconnect_serial, state=tk.DISABLED)
status_label = tk.Label(serial_frame, text="")  # Set label background color to blue


# --- Create Transport Widgets ---
transport_title = tk.Label(transport_frame, text="Transport Controls", bg="green")
start_button = tk.Button(transport_frame, text="Start")
stop_button = tk.Button(transport_frame, text="Stop")

# --- Create test Widgets ---
transport2_title = tk.Label(transport2_frame, text="Transport Controls", bg="green")
start2_button = tk.Button(transport2_frame, text="Start")
stop2_button = tk.Button(transport2_frame, text="Stop")

# --- Publish Grid layout ---
left_frame.grid(row=0, column=0, padx=10, pady=10)
right_frame.grid(row=0, column=1, padx=10, pady=10)
serial_frame.grid(row=0, column=0, padx=10, pady=10) # Grid the serial frame
transport_frame.grid(row=1, column=0, padx=10, pady=10)
transport2_frame.grid(row=1, column=0, padx=10, pady=10)

# --- Publish Serial Widgets ---
serial_title.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
port_label.grid(row=1, column=0, padx=10, pady=5)
baud_label.grid(row=2, column=0, padx=10, pady=5)
port_combo.grid(row=1, column=1, padx=10, pady=5)
baud_combo.grid(row=2, column=1, padx=10, pady=5)
connect_button.grid(row=1, column=2, padx=10, pady=5)
disconnect_button.grid(row=2, column=2, padx=10, pady=5)
status_label.grid(row=3, column=0, columnspan=3, padx=10, pady=10)

# --- Publish Transport Widgets ---
transport_title.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
start_button.grid(row=1, column=1, padx=10, pady=5)
stop_button.grid(row=2, column=1, padx=10, pady=5)

# --- Publish Test Widgets ---
transport2_title.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
start2_button.grid(row=1, column=1, padx=10, pady=5)
stop2_button.grid(row=2, column=1, padx=10, pady=5)

update_com_ports()  # Starts the function to update COM ports periodically

# Start Tkinter event loop
root.mainloop()