Wenn ich meinen Code ausführe, erhalte ich diesen Fehler: < /p>
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\sandw\AppData\Local\Programs\Python\Python313\Lib\tkinter\__init__.py", line 2074, in __call__
return self.func(*args)
~~~~~~~~~^^^^^^^
File "d:\BluCerulean\app.py", line 483, in calendar_window
CW(self, self.settings.get("user"), master=cal_win)
~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\BluCerulean\calendar_editor.py", line 42, in __init__
self.cal = TKCal(left_frame, selectmode='day', date_pattern='yyyy-mm-dd', font=("Segoe UI", 14))
~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\sandw\AppData\Local\Programs\Python\Python313\Lib\site-packages\tkcalendar\calendar_.py", line 224, in __init__
ttk.Frame.__init__(self, master, class_=classname, cursor=curs, name=name)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\sandw\AppData\Local\Programs\Python\Python313\Lib\site-packages\ttkbootstrap\style.py", line 5209, in __init__
self.configure(style=ttkstyle)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
File "C:\Users\sandw\AppData\Local\Programs\Python\Python313\Lib\site-packages\tkcalendar\calendar_.py", line 1612, in configure
self[item] = value
~~~~^^^^^^
File "C:\Users\sandw\AppData\Local\Programs\Python\Python313\Lib\site-packages\tkcalendar\calendar_.py", line 517, in __setitem__
if key not in self._properties:
^^^^^^^^^^^^^^^^
AttributeError: 'Calendar' object has no attribute '_properties'
< /code>
liegt daran, dass mein tkcalendar keinen Kalender in eine ttkbootstrap -App einfügen kann?
# ---------------- CALENDAR ----------------
def calendar_window(self):
# Ensure root is visible
if not self.root.winfo_viewable():
self.root.deiconify()
# Open the calendar in a Toplevel
cal_win = Toplevel(self.root)
cal_win.title("Blu Cerulean - Calendar")
cal_win.state("zoomed")
from calendar_editor import CalendarWindow as CW
# Pass the App instance, user, and the Toplevel as parent
CW(self, self.settings.get("user"), master=cal_win)
if __name__ == "__main__":
root = Tk()
app = App(root)
root.mainloop()
< /code>
Und dies ist mein calendar_editor.py Code (das Erstellen des Kalenderfensters) < /p>
import os
import json
import tkinter as tk
from tkinter import Toplevel, simpledialog, messagebox, Frame, Label, Button, Listbox, Text, END
from tkcalendar import Calendar as TKCal
from tkinter import ttk # plain ttk
REMINDERS_FILENAME = "reminders.json"
class CalendarWindow:
def __init__(self, app, username, master=None):
self.app = app
self.username = username or "guest"
self.app_folder = getattr(app, 'app_folder', os.getcwd())
self.cal_folder = os.path.join(self.app_folder, 'calendar', self.username)
os.makedirs(self.cal_folder, exist_ok=True)
self.reminders_path = os.path.join(self.cal_folder, REMINDERS_FILENAME)
self.reminders = self._load_reminders()
# Use the passed parent if provided, else create new Toplevel
self.win = master if master is not None else Toplevel(app.root)
self.win.title("Blu Cerulean - Calendar")
self.win.state("zoomed") # maximize
# Main frames
main_frame = Frame(self.win) # plain Frame, not ttkbootstrap
main_frame.pack(fill="both", expand=True, padx=10, pady=10)
left_frame = Frame(main_frame)
left_frame.grid(row=0, column=0, sticky="nsew", padx=(0,10))
right_frame = Frame(main_frame)
right_frame.grid(row=0, column=1, sticky="nsew")
main_frame.columnconfigure(0, weight=1)
main_frame.columnconfigure(1, weight=1)
main_frame.rowconfigure(0, weight=1)
# Calendar (plain tkcalendar inside plain Frame)
self.cal = TKCal(left_frame, selectmode='day', date_pattern='yyyy-mm-dd', font=("Segoe UI", 14))
self.cal.pack(fill="both", expand=True)
self.cal.bind("", lambda e: self.refresh_list())
# Listbox + description frame
list_desc_frame = Frame(right_frame)
list_desc_frame.pack(fill="both", expand=True)
# Listbox
list_frame = Frame(list_desc_frame)
list_frame.pack(side="top", fill="both", expand=True)
self.list_label = Label(list_frame, text="Reminders for selected day:")
self.list_label.pack(anchor="w")
self.listbox = Listbox(list_frame)
self.listbox.pack(fill="both", expand=True)
self.listbox.bind("", lambda e: self.show_description())
# Description box
desc_frame = Frame(list_desc_frame)
desc_frame.pack(side="top", fill="both", expand=True, pady=(10,0))
desc_label = Label(desc_frame, text="Description:")
desc_label.pack(anchor="w")
self.desc_text = Text(desc_frame, height=6)
self.desc_text.pack(fill="both", expand=True)
# Buttons
btn_frame = Frame(right_frame)
btn_frame.pack(side="bottom", pady=10, fill="x")
Button(btn_frame, text="Add Reminder", command=self.add_reminder).pack(side="left", padx=5)
Button(btn_frame, text="Delete Selected", command=self.delete_reminder).pack(side="left", padx=5)
Button(btn_frame, text="Refresh", command=self.refresh_list).pack(side="left", padx=5)
Button(btn_frame, text="Add Description", command=self.add_description).pack(side="left", padx=5)
Button(btn_frame, text="Edit Description", command=self.edit_description).pack(side="left", padx=5)
Button(btn_frame, text="Remove Description", command=self.remove_description).pack(side="left", padx=5)
self.refresh_list()
# ---------------- Reminder management ----------------
def _load_reminders(self):
if os.path.exists(self.reminders_path):
try:
with open(self.reminders_path, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception:
return {}
return {}
def _save_reminders(self):
try:
os.makedirs(self.cal_folder, exist_ok=True)
with open(self.reminders_path, 'w', encoding='utf-8') as f:
json.dump(self.reminders, f, indent=2)
except Exception as e:
messagebox.showerror("Error", f"Failed to save reminders: {e}")
def refresh_list(self):
self.listbox.delete(0, END)
self.desc_text.delete("1.0", END)
date = self.cal.get_date()
day_reminders = self.reminders.get(date, [])
for rem in day_reminders:
self.listbox.insert(END, f"{rem.get('title', '')}: {rem.get('description','')}")
def add_reminder(self):
date = self.cal.get_date()
title = simpledialog.askstring("Add Reminder", f"Reminder title for {date}:")
if title:
description = self.desc_text.get("1.0", END).strip()
self.reminders.setdefault(date, [])
self.reminders[date].append({"title": title, "description": description})
self._save_reminders()
self.refresh_list()
self.desc_text.delete("1.0", END)
def delete_reminder(self):
selection = self.listbox.curselection()
if not selection: return
date = self.cal.get_date()
index = selection[0]
try:
self.reminders[date].pop(index)
if not self.reminders[date]: del self.reminders[date]
self._save_reminders()
self.refresh_list()
self.desc_text.delete("1.0", END)
except Exception as e:
messagebox.showerror("Error", f"Failed to delete reminder: {e}")
# ---------------- Description management ----------------
def show_description(self):
selection = self.listbox.curselection()
if not selection: return
date = self.cal.get_date()
index = selection[0]
description = self.reminders[date][index].get("description", "")
self.desc_text.delete("1.0", END)
self.desc_text.insert("1.0", description)
def add_description(self):
selection = self.listbox.curselection()
if not selection: messagebox.showinfo("Info", "Select a reminder first."); return
date = self.cal.get_date()
index = selection[0]
desc = self.desc_text.get("1.0", END).strip()
if not desc: messagebox.showinfo("Info", "Enter a description to add."); return
if self.reminders[date][index].get("description","").strip():
messagebox.showinfo("Info", "Description already exists. Use Edit Description instead."); return
self.reminders[date][index]["description"] = desc
self._save_reminders()
self.refresh_list()
self.listbox.selection_set(index)
def edit_description(self):
selection = self.listbox.curselection()
if not selection: messagebox.showinfo("Info", "Select a reminder first."); return
date = self.cal.get_date()
index = selection[0]
if not self.reminders[date][index].get("description","").strip():
messagebox.showerror("Error", "Description not found."); return
desc = self.desc_text.get("1.0", END).strip()
if not desc: messagebox.showinfo("Info", "Enter a description to update."); return
self.reminders[date][index]["description"] = desc
self._save_reminders()
self.refresh_list()
self.listbox.selection_set(index)
def remove_description(self):
selection = self.listbox.curselection()
if not selection: messagebox.showinfo("Info", "Select a reminder first."); return
date = self.cal.get_date()
index = selection[0]
if not self.reminders[date][index].get("description","").strip():
messagebox.showerror("Error", "Description not found."); return
self.reminders[date][index]["description"] = ""
self._save_reminders()
self.refresh_list()
self.listbox.selection_set(index)
# ---------------- Test Run ----------------
if __name__ == '__main__':
root = tk.Tk()
root.withdraw()
class DummyApp:
def __init__(self, root): self.root=root; self.app_folder=os.getcwd()
app = DummyApp(root)
CalendarWindow(app, "testuser")
root.mainloop()
< /code>
Es wäre also großartig, wenn ich Hilfe bekommen würde, ich habe versucht, mein Kalenderfenster in einen TTK -Frame zu setzen, aber das hat auch nicht funktioniert. Ich weiß ehrlich gesagt nicht, warum dies geschieht, das erste Mal, dass dieser Fehler in diesen Fehler gestoßen ist, meine Programmfreunde gefragt, sie hatten keine Antworten, und ich fragte sogar mehrere KI, ohne Erfolg. Ich brauche dieses Projekt so schnell wie möglich, also bitte Leute.
Verfällt mein Tkcalendar mit Ttkbootstrap? ⇐ Python
-
- Similar Topics
- Replies
- Views
- Last post
-
-
So einschränken Sie den Tkcalendar, um nur bestimmte Wochentage auszuwählen
by Anonymous » » in Python - 0 Replies
- 11 Views
-
Last post by Anonymous
-