von Holgi » 12.09.2025, 15:12
dieses Script merkt sich die letzte Position:
Stopwatch_last_position.pyw
Code: Alles auswählen
import tkinter as tk
import time
import sys
import json
import os
class StoppuhrWidget:
def __init__(self):
self.root = tk.Tk()
self.root.title("Stoppuhr Widget")
self.root.configure(bg='#2b2b2b')
self.root.attributes('-topmost', True)
self.root.overrideredirect(True)
self.root.resizable(False, False)
# Konfiguration laden oder Standardposition verwenden
self.config_datei = "stoppuhr_config.json"
self.position = self.lade_konfiguration()
# Fensterposition setzen
self.root.geometry(f"+{self.position['x']}+{self.position['y']}")
# Variablen initialisieren
self.laufend = False
self.startzeit = 0
self.verstrichene_zeit = 0
# Titel-Leiste
title_bar = tk.Frame(self.root, bg='#3b3b3b', relief='raised', bd=0)
title_bar.pack(fill=tk.X)
title_label = tk.Label(title_bar, text="Stoppuhr", bg='#3b3b3b', fg='white')
title_label.pack(side=tk.LEFT, padx=5, pady=2)
close_button = tk.Button(title_bar, text="×", command=self.beenden,
bg='#3b3b3b', fg='white', bd=0, font=("Arial", 12),
activebackground='#ff5555', activeforeground='white')
close_button.pack(side=tk.RIGHT, padx=2, pady=0)
# Zeit-Anzeige
self.zeit_anzeige = tk.Label(self.root, text="00:00:00", font=("Arial", 24, "bold"),
fg="#00ffaa", bg="#2b2b2b", pady=10)
self.zeit_anzeige.pack(fill=tk.X, padx=10)
# Button-Frame
button_frame = tk.Frame(self.root, bg="#2b2b2b")
button_frame.pack(pady=(0, 10))
# Buttons
self.start_button = tk.Button(button_frame, text="Start", command=self.start,
bg="#4CAF50", fg="white", font=("Arial", 10),
width=6, relief=tk.FLAT)
self.start_button.pack(side=tk.LEFT, padx=5)
self.pause_button = tk.Button(button_frame, text="Pause", command=self.pause,
bg="#FF9800", fg="white", font=("Arial", 10),
width=6, relief=tk.FLAT)
self.pause_button.pack(side=tk.LEFT, padx=5)
self.pause_button.config(state=tk.DISABLED)
self.reset_button = tk.Button(button_frame, text="Reset", command=self.reset,
bg="#F44336", fg="white", font=("Arial", 10),
width=6, relief=tk.FLAT)
self.reset_button.pack(side=tk.LEFT, padx=5)
# Variablen für das Ziehen des Fensters
self.x = 0
self.y = 0
# Ermöglicht das Ziehen des Fensters über die Titelleiste
title_bar.bind("<ButtonPress-1>", self.start_ziehen)
title_bar.bind("<B1-Motion>", self.ziehen)
# Bindungen für das Speichern der Position beim Schließen
self.root.protocol("WM_DELETE_WINDOW", self.beenden)
self.root.mainloop()
def lade_konfiguration(self):
standard_position = {
'x': self.root.winfo_screenwidth() - 220,
'y': 50
}
if os.path.exists(self.config_datei):
try:
with open(self.config_datei, 'r') as f:
return json.load(f)
except:
return standard_position
return standard_position
def speichere_konfiguration(self):
with open(self.config_datei, 'w') as f:
json.dump(self.position, f)
def start_ziehen(self, event):
self.x = event.x
self.y = event.y
def ziehen(self, event):
deltax = event.x - self.x
deltay = event.y - self.y
x = self.root.winfo_x() + deltax
y = self.root.winfo_y() + deltay
self.root.geometry(f"+{x}+{y}")
self.position = {'x': x, 'y': y}
def beenden(self):
self.speichere_konfiguration()
self.root.destroy()
sys.exit()
def start(self):
if not self.laufend:
self.laufend = True
self.startzeit = time.time() - self.verstrichene_zeit
self.aktualisiere_zeit()
self.start_button.config(state=tk.DISABLED)
self.pause_button.config(state=tk.NORMAL)
def pause(self):
if self.laufend:
self.laufend = False
self.verstrichene_zeit = time.time() - self.startzeit
self.start_button.config(state=tk.NORMAL)
self.pause_button.config(state=tk.DISABLED)
def reset(self):
self.laufend = False
self.verstrichene_zeit = 0
self.zeit_anzeige.config(text="00:00:00")
self.start_button.config(state=tk.NORMAL)
self.pause_button.config(state=tk.DISABLED)
def aktualisiere_zeit(self):
if self.laufend:
self.verstrichene_zeit = time.time() - self.startzeit
stunden = int(self.verstrichene_zeit // 3600)
minuten = int((self.verstrichene_zeit % 3600) // 60)
sekunden = int(self.verstrichene_zeit % 60)
zeit_string = f"{stunden:02d}:{minuten:02d}:{sekunden:02d}"
self.zeit_anzeige.config(text=zeit_string)
self.root.after(100, self.aktualisiere_zeit)
# Widget starten
if __name__ == "__main__":
StoppuhrWidget()
dieses Script merkt sich die letzte Position:
Stopwatch_last_position.pyw
[code]import tkinter as tk
import time
import sys
import json
import os
class StoppuhrWidget:
def __init__(self):
self.root = tk.Tk()
self.root.title("Stoppuhr Widget")
self.root.configure(bg='#2b2b2b')
self.root.attributes('-topmost', True)
self.root.overrideredirect(True)
self.root.resizable(False, False)
# Konfiguration laden oder Standardposition verwenden
self.config_datei = "stoppuhr_config.json"
self.position = self.lade_konfiguration()
# Fensterposition setzen
self.root.geometry(f"+{self.position['x']}+{self.position['y']}")
# Variablen initialisieren
self.laufend = False
self.startzeit = 0
self.verstrichene_zeit = 0
# Titel-Leiste
title_bar = tk.Frame(self.root, bg='#3b3b3b', relief='raised', bd=0)
title_bar.pack(fill=tk.X)
title_label = tk.Label(title_bar, text="Stoppuhr", bg='#3b3b3b', fg='white')
title_label.pack(side=tk.LEFT, padx=5, pady=2)
close_button = tk.Button(title_bar, text="×", command=self.beenden,
bg='#3b3b3b', fg='white', bd=0, font=("Arial", 12),
activebackground='#ff5555', activeforeground='white')
close_button.pack(side=tk.RIGHT, padx=2, pady=0)
# Zeit-Anzeige
self.zeit_anzeige = tk.Label(self.root, text="00:00:00", font=("Arial", 24, "bold"),
fg="#00ffaa", bg="#2b2b2b", pady=10)
self.zeit_anzeige.pack(fill=tk.X, padx=10)
# Button-Frame
button_frame = tk.Frame(self.root, bg="#2b2b2b")
button_frame.pack(pady=(0, 10))
# Buttons
self.start_button = tk.Button(button_frame, text="Start", command=self.start,
bg="#4CAF50", fg="white", font=("Arial", 10),
width=6, relief=tk.FLAT)
self.start_button.pack(side=tk.LEFT, padx=5)
self.pause_button = tk.Button(button_frame, text="Pause", command=self.pause,
bg="#FF9800", fg="white", font=("Arial", 10),
width=6, relief=tk.FLAT)
self.pause_button.pack(side=tk.LEFT, padx=5)
self.pause_button.config(state=tk.DISABLED)
self.reset_button = tk.Button(button_frame, text="Reset", command=self.reset,
bg="#F44336", fg="white", font=("Arial", 10),
width=6, relief=tk.FLAT)
self.reset_button.pack(side=tk.LEFT, padx=5)
# Variablen für das Ziehen des Fensters
self.x = 0
self.y = 0
# Ermöglicht das Ziehen des Fensters über die Titelleiste
title_bar.bind("<ButtonPress-1>", self.start_ziehen)
title_bar.bind("<B1-Motion>", self.ziehen)
# Bindungen für das Speichern der Position beim Schließen
self.root.protocol("WM_DELETE_WINDOW", self.beenden)
self.root.mainloop()
def lade_konfiguration(self):
standard_position = {
'x': self.root.winfo_screenwidth() - 220,
'y': 50
}
if os.path.exists(self.config_datei):
try:
with open(self.config_datei, 'r') as f:
return json.load(f)
except:
return standard_position
return standard_position
def speichere_konfiguration(self):
with open(self.config_datei, 'w') as f:
json.dump(self.position, f)
def start_ziehen(self, event):
self.x = event.x
self.y = event.y
def ziehen(self, event):
deltax = event.x - self.x
deltay = event.y - self.y
x = self.root.winfo_x() + deltax
y = self.root.winfo_y() + deltay
self.root.geometry(f"+{x}+{y}")
self.position = {'x': x, 'y': y}
def beenden(self):
self.speichere_konfiguration()
self.root.destroy()
sys.exit()
def start(self):
if not self.laufend:
self.laufend = True
self.startzeit = time.time() - self.verstrichene_zeit
self.aktualisiere_zeit()
self.start_button.config(state=tk.DISABLED)
self.pause_button.config(state=tk.NORMAL)
def pause(self):
if self.laufend:
self.laufend = False
self.verstrichene_zeit = time.time() - self.startzeit
self.start_button.config(state=tk.NORMAL)
self.pause_button.config(state=tk.DISABLED)
def reset(self):
self.laufend = False
self.verstrichene_zeit = 0
self.zeit_anzeige.config(text="00:00:00")
self.start_button.config(state=tk.NORMAL)
self.pause_button.config(state=tk.DISABLED)
def aktualisiere_zeit(self):
if self.laufend:
self.verstrichene_zeit = time.time() - self.startzeit
stunden = int(self.verstrichene_zeit // 3600)
minuten = int((self.verstrichene_zeit % 3600) // 60)
sekunden = int(self.verstrichene_zeit % 60)
zeit_string = f"{stunden:02d}:{minuten:02d}:{sekunden:02d}"
self.zeit_anzeige.config(text=zeit_string)
self.root.after(100, self.aktualisiere_zeit)
# Widget starten
if __name__ == "__main__":
StoppuhrWidget()[/code]