optimize performance 06-05-2025-23:00
This commit is contained in:
parent
dba6138aa7
commit
9a4d8b3506
Binary file not shown.
@ -119,6 +119,89 @@ class LxTools(tk.Tk):
|
||||
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
@staticmethod
|
||||
def center_window_cross_platform(window, width, height):
|
||||
"""
|
||||
Centers a window on the primary monitor in a way that works on both X11 and Wayland
|
||||
|
||||
Args:
|
||||
window: The tkinter window to center
|
||||
width: Window width
|
||||
height: Window height
|
||||
"""
|
||||
# Calculate the position before showing the window
|
||||
|
||||
# First attempt: Try to use GDK if available (works on both X11 and Wayland)
|
||||
try:
|
||||
import gi
|
||||
gi.require_version('Gdk', '3.0')
|
||||
from gi.repository import Gdk
|
||||
|
||||
display = Gdk.Display.get_default()
|
||||
monitor = display.get_primary_monitor() or display.get_monitor(0)
|
||||
geometry = monitor.get_geometry()
|
||||
scale_factor = monitor.get_scale_factor()
|
||||
|
||||
# Calculate center position on primary monitor
|
||||
x = geometry.x + (geometry.width - width // scale_factor) // 2
|
||||
y = geometry.y + (geometry.height - height // scale_factor) // 2
|
||||
|
||||
# Set window geometry
|
||||
window.geometry(f"{width}x{height}+{x}+{y}")
|
||||
return
|
||||
except (ImportError, AttributeError):
|
||||
pass
|
||||
|
||||
# Second attempt: Try xrandr for X11
|
||||
try:
|
||||
import subprocess
|
||||
output = subprocess.check_output(["xrandr", "--query"], universal_newlines=True)
|
||||
|
||||
# Parse the output to find the primary monitor
|
||||
primary_info = None
|
||||
for line in output.splitlines():
|
||||
if "primary" in line:
|
||||
parts = line.split()
|
||||
for part in parts:
|
||||
if "x" in part and "+" in part:
|
||||
primary_info = part
|
||||
break
|
||||
break
|
||||
|
||||
if primary_info:
|
||||
# Parse the geometry: WIDTHxHEIGHT+X+Y
|
||||
geometry = primary_info.split("+")
|
||||
dimensions = geometry[0].split("x")
|
||||
primary_width = int(dimensions[0])
|
||||
primary_height = int(dimensions[1])
|
||||
primary_x = int(geometry[1])
|
||||
primary_y = int(geometry[2])
|
||||
|
||||
# Calculate center position on primary monitor
|
||||
x = primary_x + (primary_width - width) // 2
|
||||
y = primary_y + (primary_height - height) // 2
|
||||
|
||||
# Set window geometry
|
||||
window.geometry(f"{width}x{height}+{x}+{y}")
|
||||
return
|
||||
except (subprocess.SubprocessError, ImportError, IndexError, ValueError):
|
||||
pass
|
||||
|
||||
# Final fallback: Use standard Tkinter method
|
||||
screen_width = window.winfo_screenwidth()
|
||||
screen_height = window.winfo_screenheight()
|
||||
|
||||
# Try to make an educated guess for multi-monitor setups
|
||||
# If screen width is much larger than height, assume multiple monitors side by side
|
||||
if screen_width > screen_height * 1.8: # Heuristic for detecting multiple monitors
|
||||
# Assume primary monitor is on the left half
|
||||
screen_width = screen_width // 2
|
||||
|
||||
x = (screen_width - width) // 2
|
||||
y = (screen_height - height) // 2
|
||||
window.geometry(f"{width}x{height}+{x}+{y}")
|
||||
|
||||
|
||||
@staticmethod
|
||||
def get_file_name(path: Path, i: int = 5) -> List[str]:
|
||||
"""
|
||||
|
45
new_window_for_add_trace_test.py
Normal file
45
new_window_for_add_trace_test.py
Normal file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import tkinter as tk
|
||||
|
||||
class MainWindow(tk.Tk):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.title("Trace-Test-Window")
|
||||
self.geometry("400x300")
|
||||
self.text_label = tk.StringVar()
|
||||
self.text_forground = tk.StringVar(value="red")
|
||||
self.text_label.set("This is the main window")
|
||||
self.label = tk.Label(self, textvariable=self.text_label)
|
||||
self.label.grid(row=0, column=0, padx=10, pady=10)
|
||||
self.label.grid_remove()
|
||||
|
||||
self.button_text = tk.StringVar()
|
||||
self.button_text.set("Drück für andere Text anzeige")
|
||||
self.button = tk.Button(self, textvariable=self.button_text, command=self.toggle_lable)
|
||||
self.button.grid(row=1, column=0, padx=10, pady=10)
|
||||
|
||||
self.text_label.trace_add("write", self.update_label)
|
||||
self.text_forground.trace_add("write", self.update_label)
|
||||
|
||||
def update_label(self, *args):
|
||||
self.label.configure(foreground=self.text_forground.get())
|
||||
|
||||
if self.text_label.get():
|
||||
self.label.grid()
|
||||
else:
|
||||
self.label.grid_remove()
|
||||
|
||||
def toggle_lable(self):
|
||||
|
||||
if 'main window' in self.text_label.get():
|
||||
self.text_label.set("gewechseltes label")
|
||||
self.button_text.set("Drück für main window")
|
||||
else:
|
||||
self.text_label.set("This is the main window")
|
||||
self.button_text.set("Drück für andere Text anzeige")
|
||||
|
||||
if __name__ == "__main__":
|
||||
window = MainWindow()
|
||||
window.mainloop()
|
138
wirepy.py
138
wirepy.py
@ -29,17 +29,22 @@ class Wirepy(tk.Tk):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Hide the window initially
|
||||
self.withdraw()
|
||||
|
||||
self.my_tool_tip = None
|
||||
self.x_width = AppConfig.UI_CONFIG["window_size"][0]
|
||||
self.y_height = AppConfig.UI_CONFIG["window_size"][1]
|
||||
self.monitor_center_x = int(self.winfo_screenwidth() / 2 - (self.x_width / 2))
|
||||
self.monitor_center_y = int(self.winfo_screenheight() / 2 - (self.y_height / 2))
|
||||
self.resizable(AppConfig.UI_CONFIG["resizable_window"][0], AppConfig.UI_CONFIG["resizable_window"][1])
|
||||
|
||||
# Set the window size
|
||||
self.geometry(f"{self.x_width}x{self.y_height}")
|
||||
self.resizable(AppConfig.UI_CONFIG["resizable_window"][0],
|
||||
AppConfig.UI_CONFIG["resizable_window"][1])
|
||||
self.title(AppConfig.UI_CONFIG["window_title"])
|
||||
self.geometry(f"{self.x_width}x{self.y_height}+{self.monitor_center_x}+{self.monitor_center_y}")
|
||||
|
||||
self.columnconfigure(0, weight=1)
|
||||
self.rowconfigure(0, weight=1)
|
||||
self.tk.call("source", f"{AppConfig.SYSTEM_PATHS["tcl_path"]}/water.tcl")
|
||||
self.tk.call("source", f"{AppConfig.SYSTEM_PATHS['tcl_path']}/water.tcl")
|
||||
ConfigManager.init(AppConfig.SETTINGS_FILE)
|
||||
theme = ConfigManager.get("theme")
|
||||
ThemeManager.change_theme(self, theme)
|
||||
@ -50,8 +55,15 @@ class Wirepy(tk.Tk):
|
||||
# Set it as the window icon
|
||||
self.iconphoto(True, self.wg_icon)
|
||||
|
||||
# Add the widgets
|
||||
FrameWidgets(self).grid()
|
||||
|
||||
# Center the window on the primary monitor
|
||||
LxTools.center_window_cross_platform(self, self.x_width, self.y_height)
|
||||
|
||||
# Now show the window after it has been positioned
|
||||
self.after(10, self.deiconify)
|
||||
|
||||
|
||||
class FrameWidgets(ttk.Frame):
|
||||
"""
|
||||
@ -364,17 +376,6 @@ class FrameWidgets(ttk.Frame):
|
||||
)
|
||||
)
|
||||
|
||||
def tooltip(self, tip) -> None:
|
||||
"""
|
||||
Aktualisiert die Tooltip-Einstellung im ConfigManager
|
||||
Args:
|
||||
tip (bool): True zum Deaktivieren, False zum Aktivieren von Tooltips
|
||||
"""
|
||||
# Beachten Sie die umgekehrte Logik: tip=True bedeutet Tooltips deaktivieren
|
||||
ConfigManager.set("tooltip", not tip)
|
||||
# Aktualisieren Sie die lokale Variable für sofortige Wirkung
|
||||
self.tooltip_state = not tip
|
||||
|
||||
@staticmethod
|
||||
def about() -> None:
|
||||
"""
|
||||
@ -389,107 +390,6 @@ class FrameWidgets(ttk.Frame):
|
||||
"Use without warranty!\n")
|
||||
|
||||
LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_vpn"], AppConfig.IMAGE_PATHS["icon_vpn"], _("Info"), msg_t, _("Go to Wire-Py git"), link_btn)
|
||||
|
||||
def update_ui_for_update_status(self, res):
|
||||
"""Update UI elements based on update check result"""
|
||||
print(f"Updating UI for result: {res}") # Debug output
|
||||
|
||||
# First, clean up any existing UI elements
|
||||
if hasattr(self, 'update_btn') and self.update_btn.winfo_exists():
|
||||
self.update_btn.grid_forget()
|
||||
|
||||
# Reset all variables to ensure fresh state
|
||||
self.update_label.set("")
|
||||
self.update_tooltip.set("")
|
||||
self.update_foreground.set("black")
|
||||
|
||||
if res == "False":
|
||||
self.set_update.set(value=1)
|
||||
self.update_label.set(_("Update search off"))
|
||||
self.update_tooltip.set(_("Updates you have disabled"))
|
||||
self.update_foreground.set("red")
|
||||
|
||||
# Display the label
|
||||
self.updates_lb.configure(
|
||||
textvariable=self.update_label,
|
||||
foreground=self.update_foreground.get()
|
||||
)
|
||||
self.updates_lb.grid(column=4, columnspan=3, row=0, padx=10)
|
||||
Tooltip(self.updates_lb, self.update_tooltip.get(), self.tooltip_state)
|
||||
|
||||
elif res == "No Internet Connection!":
|
||||
self.update_label.set(_("No Server Connection!"))
|
||||
self.update_foreground.set("red")
|
||||
|
||||
# Display the label
|
||||
self.updates_lb.configure(
|
||||
textvariable=self.update_label,
|
||||
foreground=self.update_foreground.get()
|
||||
)
|
||||
self.updates_lb.grid(column=4, columnspan=3, row=0, padx=10)
|
||||
|
||||
elif res == "No Updates":
|
||||
self.update_label.set(_("No Updates"))
|
||||
self.update_tooltip.set(_("Congratulations! Wire-Py is up to date"))
|
||||
self.update_foreground.set("black")
|
||||
|
||||
# Display the label
|
||||
self.updates_lb.configure(
|
||||
textvariable=self.update_label,
|
||||
foreground=self.update_foreground.get()
|
||||
)
|
||||
self.updates_lb.grid(column=4, columnspan=3, row=0, padx=10)
|
||||
Tooltip(self.updates_lb, self.update_tooltip.get(), self.tooltip_state)
|
||||
|
||||
else:
|
||||
# We have an update available
|
||||
self.set_update.set(value=0)
|
||||
update_text = f"Update {res} {_('available!')}"
|
||||
|
||||
# Hide the label if it's visible
|
||||
if self.updates_lb.winfo_ismapped():
|
||||
self.updates_lb.grid_forget()
|
||||
|
||||
# Create or update the update button
|
||||
if not hasattr(self, 'update_btn') or not self.update_btn.winfo_exists():
|
||||
# Create the update button if it doesn't exist yet
|
||||
self.update_btn = ttk.Menubutton(self.menu_frame, text=update_text)
|
||||
self.update_btn.grid(column=4, columnspan=3, row=0, padx=0)
|
||||
Tooltip(self.update_btn, _("Click to download new version"), self.tooltip_state)
|
||||
|
||||
self.download = tk.Menu(self, relief="flat")
|
||||
self.update_btn.configure(menu=self.download, style="Toolbutton")
|
||||
self.download.add_command(
|
||||
label=_("Download"),
|
||||
command=lambda: GiteaUpdate.download(
|
||||
f"{AppConfig.DOWNLOAD_URL}/{res}.zip",
|
||||
res,
|
||||
AppConfig.IMAGE_PATHS["icon_info"],
|
||||
AppConfig.IMAGE_PATHS["icon_vpn"],
|
||||
AppConfig.IMAGE_PATHS["icon_error"],
|
||||
AppConfig.IMAGE_PATHS["icon_msg"]
|
||||
)
|
||||
)
|
||||
else:
|
||||
# Update the existing update button
|
||||
self.update_btn.configure(text=update_text)
|
||||
# Make sure it's visible
|
||||
self.update_btn.grid(column=4, columnspan=3, row=0, padx=0)
|
||||
|
||||
# Update the download command
|
||||
if hasattr(self, 'download'):
|
||||
self.download.entryconfigure(
|
||||
0, # First entry in the menu
|
||||
command=lambda: GiteaUpdate.download(
|
||||
f"{AppConfig.DOWNLOAD_URL}/{res}.zip",
|
||||
res,
|
||||
AppConfig.IMAGE_PATHS["icon_info"],
|
||||
AppConfig.IMAGE_PATHS["icon_vpn"],
|
||||
AppConfig.IMAGE_PATHS["icon_error"],
|
||||
AppConfig.IMAGE_PATHS["icon_msg"]
|
||||
)
|
||||
)
|
||||
|
||||
def update_setting(self, update_res) -> None:
|
||||
"""write off or on in file
|
||||
Args:
|
||||
@ -532,15 +432,12 @@ class FrameWidgets(ttk.Frame):
|
||||
# If tooltips are disabled, the menu option should be to enable them
|
||||
self.tooltip_label.set(_("Enable Tooltips"))
|
||||
|
||||
|
||||
def tooltips_toggle(self):
|
||||
"""Toggles tooltips on/off and updates the menu label"""
|
||||
# Toggle the boolean state
|
||||
new_bool_state = not self.tooltip_state.get()
|
||||
|
||||
# Save the converted value in the configuration
|
||||
ConfigManager.set("tooltips", str(new_bool_state))
|
||||
print(f"Tooltips are now: {new_bool_state} in ConfigManager")
|
||||
# Update the tooltip_state variable for immediate effect
|
||||
self.tooltip_state.set(new_bool_state)
|
||||
|
||||
@ -551,7 +448,6 @@ class FrameWidgets(ttk.Frame):
|
||||
# This assumes it's the third item (index 2) in your menu
|
||||
self.settings.entryconfigure(1, label=self.tooltip_label.get())
|
||||
|
||||
|
||||
def update_theme_label(self) -> str:
|
||||
"""Update the theme label based on current theme"""
|
||||
current_theme = ConfigManager.get("theme")
|
||||
|
Loading…
x
Reference in New Issue
Block a user