Im trying to get auto-py-to-exe to make an executable from a py file. Since english is not my first language i do not realy understand what te do and what to put where. Google is not much of a help either. In the top of my file i have this:
import tkinter as tk
from tkinter import ttk
from tkcalendar import DateEntry
from ics import Calendar as ICalendar
from datetime import date
import re
import pickle
import os
when i try to us auto-py-to-exe or pyinstaller i keep getting warnings like these: 419084 WARNING: Library not found: could not resolve 'api-ms-win-crt-runtime-l1-1-0.dll'
I do not understand what i am seposed to do to get it to work properly. I think i need to make a reference to the missing dll en pyd files, but how and where i do not know.
this is my full code:
import tkinter as tk
from tkinter import ttk
from tkcalendar import DateEntry
from ics import Calendar as ICalendar
from datetime import date
import re
import pickle
import os
class CalendarApp:
def __init__(self, root):
self.root = root
self.root.title("Evenementen Kalender")
self.selected_date = date.today()
# Kalenderwidget
self.cal_frame = ttk.Frame(self.root)
self.cal_frame.pack(pady=10)
self.cal_label = ttk.Label(self.cal_frame, text="Selecteer een datum:")
self.cal_label.grid(row=0, column=0, columnspan=3)
self.cal = DateEntry(self.cal_frame, year=self.selected_date.year, month=self.selected_date.month, day=self.selected_date.day,
locale='nl_NL', date_pattern='dd-mm-y') # Set the date pattern here
self.cal.grid(row=1, column=0, columnspan=3)
self.cal.bind("<<DateEntrySelected>>", self.update_date)
# Evenementenframe
self.event_frame = ttk.Frame(self.root)
self.event_frame.pack(pady=10)
# Maak de Treeview-widget
self.tree = ttk.Treeview(self.event_frame, columns=("Datum", "Starttijd", "Eindtijd", "Evenement", "Locatie", "Attendees"), show="headings", selectmode="browse", height=15)
self.tree.grid(row=1, column=0, columnspan=3, pady=10)
self.tree.heading("#1", text="Datum")
self.tree.heading("#2", text="Starttijd")
self.tree.heading("#3", text="Eindtijd")
self.tree.heading("#4", text="Evenement")
self.tree.heading("#5", text="Locatie")
self.tree.heading("#6", text="Attendees")
# Stel de breedte van de kolommen in
self.tree.column("#1", width=100)
self.tree.column("#2", width=80)
self.tree.column("#3", width=80)
self.tree.column("#4", width=200)
self.tree.column("#5", width=80)
self.tree.column("#6", width=200)
self.initialize_date_entry()
self.load_events()
def initialize_date_entry(self):
"""Stelt het zoekveld in met de geselecteerde datum in het gewenste formaat."""
self.cal.set_date(self.selected_date.strftime("%d-%m-%Y"))
def update_date(self, event):
"""Wordt aangeroepen wanneer de datum wordt gewijzigd."""
self.selected_date = self.cal.get_date()
self.load_events()
def load_events(self):
try:
ics_url = "https-link-to-ICS-gereator"
with urlopen(ics_url) as response:
ics_data = response.read().decode('utf-8')
# Opgeslagen gegevens worden hier overschreven
with open('ics_data.txt', 'w') as f:
f.write(ics_data)
except Exception as e:
print(f"Fout bij het laden van de ics-data: {e}")
# Als er een fout optreedt bij het laden van de URL, laad dan de opgeslagen gegevens
self.load_events_from_file()
def load_events_from_file(self):
try:
with open('ics_data.txt', 'r') as f:
ics_data = f.read()
calendar = ICalendar(ics_data)
events = [event for event in calendar.events if hasattr(event, 'begin') and event.begin.date() >= self.selected_date]
events = sorted(events, key=lambda x: x.begin)
self.display_events(events)
except Exception as e:
print(f"Onverwachte fout bij het verwerken van evenementen: {e}")
def display_events(self, events):
self.tree.delete(*self.tree.get_children())
previous_end_time = None
previous_date = None
for event in events[:15]: # Alleen de eerste 15 evenementen
start_time = event.begin.strftime("%H:%M")
formatted_date = event.begin.strftime("%d-%m-%Y")
end_time = event.end.strftime("%H:%M") if hasattr(event, 'end') and event.end else ""
event_summary = getattr(event, 'summary', '') or getattr(event, 'name', '')
location = getattr(event, 'location', '') # Locatiegegevens ophalen
attendees = getattr(event, 'attendees', set()) # Attendees ophalen
is_all_day_event = (event.begin.hour == 8 and event.begin.minute == 30 and event.end.hour == 17 and event.end.minute == 30)
if is_all_day_event:
self.tree.insert("", "end", values=("", "", "", "", "", ""))
self.tree.insert("", "end", values=(formatted_date, start_time, end_time, event_summary, location, self.convert_attendees_to_str(attendees)))
elif previous_date is not None and event.begin.date() != previous_date:
self.tree.insert("", "end", values=("", "", "", "", "", ""))
elif not is_all_day_event and previous_end_time is not None and event.begin > previous_end_time:
self.tree.insert("", "end", values=("", "", "-" * 8, "pauze", "-" * 8, "-" * 8))
# Controleer of locatiegegevens aanwezig zijn en formatteer deze
if location:
location_parts = location.split(',')
lms_location = next((part.strip() for part in location_parts if part.strip().startswith("LMS") and len(part.strip()) == 7), None)
if lms_location:
location = lms_location
self.tree.insert("", "end", values=(formatted_date, start_time, end_time, event_summary, location, self.convert_attendees_to_str(attendees)))
previous_end_time = event.end
previous_date = event.begin.date()
def convert_attendees_to_str(self, attendees):
attendee_names = self.extract_attendee_names(attendees)
if len(attendee_names) > 3:
return ", ".join(attendee_names[:3]) + " (en meer)"
else:
return ", ".join(attendee_names)
def extract_attendee_names(self, attendees):
if isinstance(attendees, set):
attendee_names = []
for attendee in attendees:
match = re.search(r'CN=([^:]+)', str(attendee))
if match:
name = match.group(1)
if name.upper() != "BUFFE": # Voeg deze controle toe
attendee_names.append(name)
return attendee_names
else:
return []
if __name__ == "__main__":
root = tk.Tk()
app = CalendarApp(root)
root.mainloop()
I tried to read the documentation of auto-py-to-exe and pyinstaller, but do not really understand what tot do. In auto-py-to-exe i made a reference for "binaries" to the folder my DLL's are in. I made references to single DLL's in auto-py-to-exe.