94 lines
3.6 KiB
Python
94 lines
3.6 KiB
Python
# template.py
|
|
|
|
import ttkbootstrap as ttk
|
|
from ttkbootstrap.constants import *
|
|
from tkinter import ttk as tkttk
|
|
from datetime import datetime
|
|
import screeninfo
|
|
|
|
def create_gui():
|
|
screen = screeninfo.get_monitors()[0]
|
|
screen_width = int(screen.width * 0.75)
|
|
screen_height = int(screen.height * 0.75)
|
|
|
|
root = ttk.Window(title="Endurance Test Bench", themename="morph")
|
|
root.geometry(f"{screen_width}x{screen_height}")
|
|
root.resizable(True, True) # Allow resizing
|
|
|
|
# === Top control bar ===
|
|
top_frame = ttk.Frame(root, padding=10)
|
|
top_frame.pack(fill=X)
|
|
|
|
connect_btn = ttk.Button(top_frame, text="✅ Connect to CAN", bootstyle="success-outline")
|
|
connect_btn.pack(side=LEFT, padx=5)
|
|
|
|
disconnect_btn = ttk.Button(top_frame, text="❌ Disconnect", bootstyle="danger-outline")
|
|
disconnect_btn.pack(side=LEFT, padx=5)
|
|
|
|
graph_btn = ttk.Button(top_frame, text="🖥 Show Graphs", bootstyle="info-outline")
|
|
graph_btn.pack(side=RIGHT, padx=5)
|
|
|
|
# === Valve Overview Title ===
|
|
valve_title = ttk.Label(root, text="Valve Overview", font=("Helvetica", 16, "bold"), padding=(10, 5))
|
|
valve_title.pack(anchor=W)
|
|
|
|
# === Valve Tree Container ===
|
|
tree_container = ttk.Frame(root, padding=(10, 5))
|
|
tree_container.pack(fill=BOTH, expand=True)
|
|
|
|
# === Valve Treeview Widget ===
|
|
valve_columns = ("Node ID", "Serial No.", "Setpoint", "Feedback", "Drift")
|
|
valve_tree = tkttk.Treeview(tree_container, columns=valve_columns, show="tree headings", height=16)
|
|
|
|
# Style: Font and row size
|
|
style = ttk.Style()
|
|
style.configure("Treeview", font=("Segoe UI Emoji", 11), rowheight=28)
|
|
|
|
# Set column widths proportionally to screen size
|
|
# First column (tree column) for icons
|
|
valve_tree.heading("#0", text="Status")
|
|
valve_tree.column("#0", width=50, anchor="center", stretch=False)
|
|
|
|
# Other data columns
|
|
col_width = int(screen_width / (len(valve_columns) + 1)) # +1 because of the tree column
|
|
for col in valve_columns:
|
|
valve_tree.heading(col, text=col)
|
|
valve_tree.column(col, anchor='center', width=col_width, stretch=True)
|
|
|
|
valve_tree.pack(side=LEFT, fill=BOTH, expand=True)
|
|
|
|
# === Scrollbar ===
|
|
scrollbar = ttk.Scrollbar(tree_container, orient=VERTICAL, command=valve_tree.yview)
|
|
valve_tree.configure(yscrollcommand=scrollbar.set)
|
|
scrollbar.pack(side=RIGHT, fill=Y)
|
|
|
|
# === Feedback section ===
|
|
feedback_title = ttk.Label(root, text="System Feedback", font=("Helvetica", 12, "bold"), padding=(10, 10))
|
|
feedback_title.pack(anchor=W)
|
|
|
|
feedback_frame = ttk.Frame(root, padding=(10, 0))
|
|
feedback_frame.pack(fill=X, padx=10, pady=10)
|
|
|
|
pressure_frame = ttk.Labelframe(feedback_frame, text="Pressure Sensor", padding=10)
|
|
pressure_frame.pack(side=LEFT, fill=BOTH, expand=True, padx=5)
|
|
pressure_labels = []
|
|
for i in range(3):
|
|
lbl = ttk.Label(pressure_frame, text=f"Pressure {i+1}: 0 bar")
|
|
lbl.pack(anchor=W)
|
|
pressure_labels.append(lbl)
|
|
|
|
flow_frame = ttk.Labelframe(feedback_frame, text="Flowmeter", padding=10)
|
|
flow_frame.pack(side=LEFT, fill=BOTH, expand=True, padx=5)
|
|
flow_labels = []
|
|
for i in range(4):
|
|
lbl = ttk.Label(flow_frame, text=f"Flowmeter {i+1}: 0 L/h")
|
|
lbl.pack(anchor=W)
|
|
flow_labels.append(lbl)
|
|
|
|
pump_frame = ttk.Labelframe(feedback_frame, text="Pump RPM", padding=10)
|
|
pump_frame.pack(side=LEFT, fill=BOTH, expand=True, padx=5)
|
|
pump_rpm_label = ttk.Label(pump_frame, text="0", font=("Helvetica", 16))
|
|
pump_rpm_label.pack(anchor=W)
|
|
|
|
return root, connect_btn, disconnect_btn, graph_btn, valve_tree, pressure_labels, flow_labels, pump_rpm_label
|