add message box
This commit is contained in:
parent
d51d2e994e
commit
363f4fcdca
|
@ -1,4 +1,10 @@
|
||||||
|
CTkMessagebox==2.7
|
||||||
customtkinter==5.2.2
|
customtkinter==5.2.2
|
||||||
darkdetect==0.8.0
|
darkdetect==0.8.0
|
||||||
|
future==1.0.0
|
||||||
|
iso8601==2.1.0
|
||||||
packaging==24.1
|
packaging==24.1
|
||||||
|
pillow==10.4.0
|
||||||
pyserial==3.5
|
pyserial==3.5
|
||||||
|
PyYAML==6.0.1
|
||||||
|
serial==0.0.97
|
||||||
|
|
80
src/main.py
80
src/main.py
|
@ -1,9 +1,9 @@
|
||||||
import customtkinter as ctk
|
import customtkinter as ctk
|
||||||
|
import messagebox
|
||||||
|
|
||||||
import serial
|
import serial
|
||||||
import serial.tools
|
import serial.tools
|
||||||
import serial.tools.list_ports as ls_ports
|
import serial.tools.list_ports as ls_ports
|
||||||
import serial.tools.list_ports
|
|
||||||
|
|
||||||
from typing import Optional, Any
|
from typing import Optional, Any
|
||||||
import functools
|
import functools
|
||||||
|
@ -14,9 +14,10 @@ class App(ctk.CTk):
|
||||||
__window_height = 1350
|
__window_height = 1350
|
||||||
__column_weight = [1, 9, 3]
|
__column_weight = [1, 9, 3]
|
||||||
serial_status = False
|
serial_status = False
|
||||||
serial_baudrate = 115200
|
serial_baudrate = 9600
|
||||||
gain_values = [0.0 for i in range(5)]
|
gain_default = [1.30, 0.70, 1.10, 2.20, 0.50]
|
||||||
gain_default = [1.3, 0.7, 1.1, 2.2, 0.5]
|
gain_values = gain_default.copy()
|
||||||
|
gain_values_store = gain_default.copy()
|
||||||
gain_enable = [True for i in range(5)]
|
gain_enable = [True for i in range(5)]
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
@ -29,13 +30,19 @@ class App(ctk.CTk):
|
||||||
# appearance and font
|
# appearance and font
|
||||||
ctk.set_appearance_mode("dark")
|
ctk.set_appearance_mode("dark")
|
||||||
ctk.set_default_color_theme("dark-blue")
|
ctk.set_default_color_theme("dark-blue")
|
||||||
ctk.set_window_scaling(0.8)
|
|
||||||
# ctk.set_widget_scaling(2.0)
|
|
||||||
self.font = ctk.CTkFont(family="", size=17)
|
self.font = ctk.CTkFont(family="", size=17)
|
||||||
|
|
||||||
# get the screen dimension
|
# get the screen dimension
|
||||||
screen_width = self.winfo_screenwidth()
|
screen_width = self.winfo_screenwidth()
|
||||||
screen_height = self.winfo_screenheight()
|
screen_height = self.winfo_screenheight()
|
||||||
|
|
||||||
|
# high dpi support
|
||||||
|
if screen_width >= 3840 and screen_height >= 2160:
|
||||||
|
ctk.set_widget_scaling(2.0)
|
||||||
|
messagebox.isHighDIP = True
|
||||||
|
else:
|
||||||
|
ctk.set_window_scaling(0.8)
|
||||||
|
|
||||||
# find the center point
|
# find the center point
|
||||||
center_x = int(screen_width / 2 - width / 2)
|
center_x = int(screen_width / 2 - width / 2)
|
||||||
center_y = int(screen_height / 2 - height / 2)
|
center_y = int(screen_height / 2 - height / 2)
|
||||||
|
@ -89,7 +96,7 @@ class App(ctk.CTk):
|
||||||
self.baud_combobox.grid(column=1, row=1, sticky=ctk.EW, pady=10, padx=20)
|
self.baud_combobox.grid(column=1, row=1, sticky=ctk.EW, pady=10, padx=20)
|
||||||
# create Set Button
|
# create Set Button
|
||||||
self.send_button = ctk.CTkButton(
|
self.send_button = ctk.CTkButton(
|
||||||
top_frame, text="设置", font=self.font, command=self.setISP
|
top_frame, text="应用", font=self.font, command=self.setISP
|
||||||
)
|
)
|
||||||
self.send_button.grid(column=2, row=1, sticky=ctk.EW, pady=10, padx=10)
|
self.send_button.grid(column=2, row=1, sticky=ctk.EW, pady=10, padx=10)
|
||||||
return None
|
return None
|
||||||
|
@ -100,22 +107,35 @@ class App(ctk.CTk):
|
||||||
stringVar.set(f"{value:.2f}")
|
stringVar.set(f"{value:.2f}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def switchSlider(i: int, slider: ctk.CTkSlider) -> None:
|
def switchSlider(i: int, slider: ctk.CTkSlider, value: ctk.StringVar) -> None:
|
||||||
if slider.cget("state") == "normal":
|
if slider.cget("state") == "normal":
|
||||||
self.gain_values[i] = self.gain_default[i]
|
self.gain_values[i] = self.gain_default[i]
|
||||||
|
self.gain_values_store[i] = slider.get()
|
||||||
|
|
||||||
|
value.set(f"{self.gain_default[i]:.2f}")
|
||||||
|
slider.set(self.gain_default[i])
|
||||||
slider.configure(button_color="grey")
|
slider.configure(button_color="grey")
|
||||||
slider.configure(state="disabled")
|
slider.configure(state="disabled")
|
||||||
else:
|
else:
|
||||||
self.gain_values[i] = slider.get()
|
self.gain_values[i] = slider.get()
|
||||||
|
|
||||||
|
value.set(f"{self.gain_values_store[i]:.2f}")
|
||||||
|
slider.set(self.gain_values_store[i])
|
||||||
slider.configure(button_color="#1f538d")
|
slider.configure(button_color="#1f538d")
|
||||||
slider.configure(state="normal")
|
slider.configure(state="normal")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def switchCorrection(i: int) -> None:
|
def switchCorrection(i: int, slider: ctk.CTkSlider) -> None:
|
||||||
if self.gain_enable[i]:
|
if self.gain_enable[i]:
|
||||||
self.gain_enable[i] = False
|
self.gain_enable[i] = False
|
||||||
|
|
||||||
|
slider.configure(button_color="grey")
|
||||||
|
slider.configure(state="disabled")
|
||||||
else:
|
else:
|
||||||
self.gain_enable[i] = True
|
self.gain_enable[i] = True
|
||||||
|
|
||||||
|
slider.configure(button_color="#1f538d")
|
||||||
|
slider.configure(state="normal")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
text = [
|
text = [
|
||||||
|
@ -125,7 +145,7 @@ class App(ctk.CTk):
|
||||||
"伽马校正系数",
|
"伽马校正系数",
|
||||||
"饱和度调整系数",
|
"饱和度调整系数",
|
||||||
]
|
]
|
||||||
gain_min = [-2.0, -2.0, -2.0, 0.0, -1.0]
|
gain_min = [0.0, 0.0, 0.0, 0.0, -1.0]
|
||||||
gain_max = [2.0, 2.0, 2.0, 5.0, 1.0]
|
gain_max = [2.0, 2.0, 2.0, 5.0, 1.0]
|
||||||
fg_clolor = [
|
fg_clolor = [
|
||||||
"#4d140b",
|
"#4d140b",
|
||||||
|
@ -162,7 +182,6 @@ class App(ctk.CTk):
|
||||||
gain_frame[i],
|
gain_frame[i],
|
||||||
text=text[i],
|
text=text[i],
|
||||||
font=self.font,
|
font=self.font,
|
||||||
command=functools.partial(switchCorrection, i),
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
gain_checkbox[i - 3].select()
|
gain_checkbox[i - 3].select()
|
||||||
|
@ -177,9 +196,15 @@ class App(ctk.CTk):
|
||||||
gain_str.append(
|
gain_str.append(
|
||||||
ctk.StringVar(gain_slider[i], f"{self.gain_default[i]:.2f}")
|
ctk.StringVar(gain_slider[i], f"{self.gain_default[i]:.2f}")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# set command
|
||||||
gain_slider[i].configure(
|
gain_slider[i].configure(
|
||||||
command=functools.partial(setGain, i=i, stringVar=gain_str[i])
|
command=functools.partial(setGain, i=i, stringVar=gain_str[i])
|
||||||
)
|
)
|
||||||
|
if i >= 3:
|
||||||
|
gain_checkbox[i - 3].configure(
|
||||||
|
command=functools.partial(switchCorrection, i, gain_slider[i])
|
||||||
|
)
|
||||||
|
|
||||||
# gain value
|
# gain value
|
||||||
ctk.CTkLabel(gain_frame[i], text=str(gain_min[i]), font=self.font).pack(
|
ctk.CTkLabel(gain_frame[i], text=str(gain_min[i]), font=self.font).pack(
|
||||||
|
@ -202,7 +227,9 @@ class App(ctk.CTk):
|
||||||
ctk.CTkButton(
|
ctk.CTkButton(
|
||||||
data_frame,
|
data_frame,
|
||||||
text="使用推荐配置",
|
text="使用推荐配置",
|
||||||
command=functools.partial(switchSlider, i=i, slider=gain_slider[i]),
|
command=functools.partial(
|
||||||
|
switchSlider, i=i, slider=gain_slider[i], value=gain_str[i]
|
||||||
|
),
|
||||||
font=self.font,
|
font=self.font,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -232,13 +259,17 @@ class App(ctk.CTk):
|
||||||
print(self.select_port)
|
print(self.select_port)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
print("Please Select Serial Port")
|
print("Please Select Serial Port")
|
||||||
|
messagebox.showError("Please Select Serial Port")
|
||||||
else:
|
else:
|
||||||
if not self.serial_status:
|
if not self.serial_status:
|
||||||
try:
|
try:
|
||||||
self.serial = serial.Serial(self.select_port, self.serial_baudrate)
|
self.serial = serial.Serial(self.select_port, self.serial_baudrate)
|
||||||
self.serial.open()
|
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
print("Failed to Connect Serial")
|
print("Please Select Serial Port")
|
||||||
|
messagebox.showError("Please Select Serial Port")
|
||||||
|
except serial.serialutil.SerialException:
|
||||||
|
print("Can't Control the Serial Port")
|
||||||
|
messagebox.showError("Can't Control the Serial Port")
|
||||||
else:
|
else:
|
||||||
self.serial_status = True
|
self.serial_status = True
|
||||||
self.serial_button_text.set("断开连接")
|
self.serial_button_text.set("断开连接")
|
||||||
|
@ -249,6 +280,7 @@ class App(ctk.CTk):
|
||||||
self.serial.close()
|
self.serial.close()
|
||||||
except Exception:
|
except Exception:
|
||||||
print("Failed to Close Serial")
|
print("Failed to Close Serial")
|
||||||
|
messagebox.showError("Failed to Close Serial")
|
||||||
else:
|
else:
|
||||||
self.serial_status = False
|
self.serial_status = False
|
||||||
self.serial_button_text.set("连接")
|
self.serial_button_text.set("连接")
|
||||||
|
@ -263,6 +295,7 @@ class App(ctk.CTk):
|
||||||
self.serial.open()
|
self.serial.open()
|
||||||
except Exception:
|
except Exception:
|
||||||
print("Failed to Set Serial Baudrate")
|
print("Failed to Set Serial Baudrate")
|
||||||
|
messagebox.showError("Failed to Set Serial Baudrate")
|
||||||
else:
|
else:
|
||||||
print("Succeed to Set Serial Baudrate")
|
print("Succeed to Set Serial Baudrate")
|
||||||
else:
|
else:
|
||||||
|
@ -272,22 +305,27 @@ class App(ctk.CTk):
|
||||||
def switchSign(i: int) -> str:
|
def switchSign(i: int) -> str:
|
||||||
match i:
|
match i:
|
||||||
case 0:
|
case 0:
|
||||||
return 'r'
|
return "cmdr"
|
||||||
case 1:
|
case 1:
|
||||||
return 'g'
|
return "cmdg"
|
||||||
case 2:
|
case 2:
|
||||||
return 'b'
|
return "cmdb"
|
||||||
case 3:
|
case 3:
|
||||||
return 'a'
|
return "cmda"
|
||||||
case 4:
|
case 4:
|
||||||
return 's'
|
return "cmds"
|
||||||
case _:
|
case _:
|
||||||
return 'error'
|
return "error"
|
||||||
|
|
||||||
|
def toAscii(num: float) -> str:
|
||||||
|
return chr(int(num))
|
||||||
|
|
||||||
if self.serial_status:
|
if self.serial_status:
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
if self.gain_enable[i]:
|
if self.gain_enable[i]:
|
||||||
self.serial.write(f"{switchSign(i)}{bin(int(self.gain_values[i]))}{bin(int(self.gain_values[i] % 1 * 256))}")
|
bytes = f"{switchSign(i)}{toAscii(self.gain_values[i])}{toAscii(self.gain_values[i] % 1 * 256)}"
|
||||||
|
print(f"Send:{bytes}")
|
||||||
|
self.serial.write(bytes.encode())
|
||||||
else:
|
else:
|
||||||
print("Please Connect to Serial")
|
print("Please Connect to Serial")
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
from typing import Literal
|
||||||
|
from CTkMessagebox import CTkMessagebox
|
||||||
|
|
||||||
|
isHighDIP = False
|
||||||
|
|
||||||
|
class Message(CTkMessagebox):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
master: any = None,
|
||||||
|
width: int = 400,
|
||||||
|
height: int = 200,
|
||||||
|
title: str = "CTkMessagebox",
|
||||||
|
message: str = "This is a CTkMessagebox!",
|
||||||
|
option_1: str = "OK",
|
||||||
|
option_2: str = None,
|
||||||
|
option_3: str = None,
|
||||||
|
options: list = ...,
|
||||||
|
border_width: int = 1,
|
||||||
|
border_color: str = "default",
|
||||||
|
button_color: str = "default",
|
||||||
|
bg_color: str = "default",
|
||||||
|
fg_color: str = "default",
|
||||||
|
text_color: str = "default",
|
||||||
|
title_color: str = "default",
|
||||||
|
button_text_color: str = "default",
|
||||||
|
button_width: int = None,
|
||||||
|
button_height: int = None,
|
||||||
|
cancel_button_color: str = None,
|
||||||
|
cancel_button: str = None,
|
||||||
|
button_hover_color: str = "default",
|
||||||
|
icon: str = "info",
|
||||||
|
icon_size: tuple = None,
|
||||||
|
corner_radius: int = 15,
|
||||||
|
justify: str = "right",
|
||||||
|
font: tuple = None,
|
||||||
|
header: bool = False,
|
||||||
|
topmost: bool = True,
|
||||||
|
fade_in_duration: int = 0,
|
||||||
|
sound: bool = False,
|
||||||
|
wraplength: int = 0,
|
||||||
|
option_focus: Literal[1] | Literal[2] | Literal[3] = None,
|
||||||
|
isHighDPI: bool = False,
|
||||||
|
):
|
||||||
|
super().__init__(
|
||||||
|
master,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
title,
|
||||||
|
message,
|
||||||
|
option_1,
|
||||||
|
option_2,
|
||||||
|
option_3,
|
||||||
|
options,
|
||||||
|
border_width,
|
||||||
|
border_color,
|
||||||
|
button_color,
|
||||||
|
bg_color,
|
||||||
|
fg_color,
|
||||||
|
text_color,
|
||||||
|
title_color,
|
||||||
|
button_text_color,
|
||||||
|
button_width,
|
||||||
|
button_height,
|
||||||
|
cancel_button_color,
|
||||||
|
cancel_button,
|
||||||
|
button_hover_color,
|
||||||
|
icon,
|
||||||
|
icon_size,
|
||||||
|
corner_radius,
|
||||||
|
justify,
|
||||||
|
font,
|
||||||
|
header,
|
||||||
|
topmost,
|
||||||
|
fade_in_duration,
|
||||||
|
sound,
|
||||||
|
wraplength,
|
||||||
|
option_focus,
|
||||||
|
)
|
||||||
|
if isHighDPI:
|
||||||
|
self._set_scaling(1.7, 1.7)
|
||||||
|
|
||||||
|
def showError(message:str)->None:
|
||||||
|
Message(title="Error", message=message, icon="cancel", isHighDPI=isHighDIP)
|
Loading…
Reference in New Issue