Python Entwicklung Typeitin Schritt für Schritt

Ich bin bei der Entwicklung einer Anwendung. Und da ich von unterschiedlichen Standorten arbeite bzw. lerne publiziere ich die Schritte / den Vorgang. Ich arbeite mit Linux und der Sprache Python. Python kann natürlich auch unter Windows genutzt werden. Nur nicht irritiert sein, wenn hier nur Screens des System Linux erscheinen. Zur Code-Bearbeitung verwende ich meist VSCode. Ausführen des Programms über den Terminal. Um mit dieser Anleitung zu arbeiten sollten Grundkenntnisse vorhanden sein. Vielleicht auch einfach nur den Schritt lesen und selbst versuchen, die Lösung auszuführen bzw. zu entwickeln

  1. Test, ob Python erfolgreich installiert ist und funktioniert:
michi@sysvorOrt ~ $ python
Python 3.12.8 (main, Dec 11 2024, 10:41:19) [GCC 14.2.1 20241116] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print ("Test")
Test
>>> 

Um mit einer grafischen Oberfläche zu entwickeln muss ein Modul von Python wie tkinter installiert sein. Ich arbeite in dieser Anleitung mit tk ( = tkinter)

2. Ein Grundfenster erstellen

from tkinter import *
root=Tk()

root.title("Typeitin")
root.geometry('350x400')
root.mainloop()

3. Datei ausführbar machen
chmod 777 ausführen


4. Ausführung testen

5. Ein Eingabefeld erstellen

from tkinter import *
root=Tk()

root.title("Typeitin")
root.geometry('350x400')

eingabefeld=Text(root,height=5, width=20)
eingabefeld.pack()


root.mainloop()

6. Button erstellen

7. Aktion mit Button verbinden, erst einmal nur eine Infoausgabe als Text

from tkinter import *
root=Tk()

root.title("Typeitin")
root.geometry('350x400')

def ok_geben():
    print("ok, Eintrag wurde hinzugefügt")
def abbrechen():
    print ("Vorgang wurde abgebrochen")    

eingabefeld=Text(root,height=5, width=20)
eingabefeld.pack()
bestaetigung=Button(root, text="ok", action=ok_geben())
bestaetigung.pack()
abbrechen=Button(root,text="Abbrechen", action=abbrechen())
abbrechen.pack()

root.mainloop()

8. Dateimenü erstellen – erst einmal nur mit Textinfo



from tkinter import *
root=Tk()

root.title("Typeitin")
root.geometry('350x400')

def speichern():

    print("ok, Eintrag wurde hinzugefügt")
def abbrechen():
    print ("Vorgang wurde abgebrochen")    

def about():
	print("mady by Mandy Seider")

def NewFile():
	print("Neue Datei")
def OpenFile():
        print("Datei öffnen")

eingabefeld=Text(root,height=5, width=20)
eingabefeld.pack()
bestaetigung=Button(root, text="Eintrag speichern", action=speichern())
bestaetigung.pack()
abbrechen=Button(root,text="Abbrechen", action=abbrechen())
abbrechen.pack()

menu = Menu(root)
root.config(menu=menu)
filemenu=Menu(menu)
menu.add_cascade(label="Datei", menu=filemenu)
filemenu.add_command(label="Neu", command=NewFile)
filemenu.add_command(label="Öffnen...", command=OpenFile)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)

helpmenu = Menu(menu)
menu.add_cascade(label="Hilfe", menu=helpmenu)
helpmenu.add_command(label="Über...", command=about)
root.mainloop()

Aktion mit dem Dateimenü verbinden

from tkinter import *
from tkinter import filedialog
root=Tk()

root.title("Typeitin")
root.geometry('350x400')

def speichern():
    print("ok, Eintrag wurde hinzugefügt")

def abbrechen():
    print ("Vorgang wurde abgebrochen")    

def about():
    print("made by Mandy Seider")

def NewFile():
    print("Neue Datei")

def OpenFile():
    dateiname=filedialog.askopenfilename()
    print("Datei ",dateiname,"geöffnet")

eingabefeld=Text(root,height=5, width=20)
eingabefeld.pack()
bestaetigung=Button(root, text="Eintrag speichern", command=speichern)
bestaetigung.pack()
abbrechen=Button(root,text="Abbrechen", command=abbrechen)
abbrechen.pack()

menu = Menu(root)
root.config(menu=menu)
filemenu=Menu(menu)
menu.add_cascade(label="Datei", menu=filemenu)
filemenu.add_command(label="Neu", command=NewFile)
filemenu.add_command(label="Öffnen...", command=OpenFile)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)

helpmenu = Menu(menu)
menu.add_cascade(label="Hilfe", menu=helpmenu)
helpmenu.add_command(label="Über...", command=about)
root.mainloop()

Pop-Up mit Hinweis erstellen

Um ein Pop-up zu erstellen, das Informationen wie „Datei wurde gespeichert“ anzeigt, können Sie die messagebox-Funktion von Tkinter verwenden.

messagebox.showwarning("Warnung", "Bitte geben Sie zuerst eine Abkürzung ein.")

Speichern der Einträge in einer Datei

from tkinter import *
from tkinter import filedialog
from tkinter import messagebox

root = Tk()
root.title("Typeitin")
root.geometry('350x400')

def speichern():
    datei = filedialog.asksaveasfile(defaultextension=".txt")
    if datei:
        datei.write(abkuerzung.get('1.0', 'end') + "\n")
        datei.write(text_gesamt.get('1.0', 'end'))
        datei.close()
        messagebox.showinfo(
            title="Änderung",
            message="Änderung wurde gespeichert",
            icon="info"
        )

def abbrechen():
    if messagebox.askyesno("Abbrechen", "Möchten Sie wirklich abbrechen?"):
        root.destroy()

def about():
    messagebox.showinfo("Über", "Made by Mandy Seider")

def NewFile():
    abkuerzung.delete('1.0', 'end')
    text_gesamt.delete('1.0', 'end')

def OpenFile():
    dateiname = filedialog.askopenfilename()
    if dateiname:
        with open(dateiname, 'r') as datei:
            inhalt = datei.read()
            abkuerzung.delete('1.0', 'end')
            text_gesamt.delete('1.0', 'end')
            # Hier nehmen wir an, dass die erste Zeile die Abkürzung ist
            abkuerzung.insert('1.0', inhalt.split('\n')[0])
            text_gesamt.insert('1.0', '\n'.join(inhalt.split('\n')[1:]))

abkuerzung = Text(root, height=2, width=20)
abkuerzung.pack()
text_gesamt = Text(root, height=4, width=20)
text_gesamt.pack()

bestaetigung = Button(root, text="Eintrag speichern", command=speichern)
bestaetigung.pack()
abbrechen = Button(root, text="Abbrechen", command=abbrechen)
abbrechen.pack()

menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="Datei", menu=filemenu)
filemenu.add_command(label="Neu", command=NewFile)
filemenu.add_command(label="Öffnen...", command=OpenFile)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)

helpmenu = Menu(menu)
menu.add_cascade(label="Hilfe", menu=helpmenu)
helpmenu.add_command(label="Über...", command=about)

root.mainloop()

Es sollen mit einem Rechtsklick neue Buttons erstellt werden

Die Werte der Eingabe der Abkürzung und des Textes sollen in einer Datei gespeichert werden

from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
import json

root = Tk()
root.title("Typeitin")
root.geometry('350x400')

# Dictionary  zur Speicherung von Abkürzungen und den dazugehörigen Texten
text_dict = {}

def speichern():
    global text_dict
    abk = abkuerzung.get('1.0', 'end-1c').strip()
    text = text_gesamt.get('1.0', 'end-1c').strip()
    if abk and text:
        text_dict[abk] = text
        datei = filedialog.asksaveasfile(defaultextension=".json")
        if datei:
            json.dump(text_dict, datei)
            datei.close()
            messagebox.showinfo(
                title="Änderung",
                message="Änderung wurde gespeichert",
                icon="info"
            )
    else:
        messagebox.showwarning("Warnung", "Bitte geben Sie sowohl eine Abkürzung als auch einen Text ein.")

def abbrechen():
    if messagebox.askyesno("Abbrechen", "Möchten Sie wirklich abbrechen?"):
        root.destroy()

def about():
    messagebox.showinfo("Über", "Made by Mandy Seider")

def NewFile():
    global text_dict
    text_dict = {}
    abkuerzung.delete('1.0', 'end')
    text_gesamt.delete('1.0', 'end')

def OpenFile():
    global text_dict
    dateiname = filedialog.askopenfilename(filetypes=[("JSON Files", "*.json")])
    if dateiname:
        with open(dateiname, 'r') as datei:
            text_dict = json.load(datei)
        abkuerzung.delete('1.0', 'end')
        text_gesamt.delete('1.0', 'end')

def insert_text(abk):
    if abk in text_dict:
        root.clipboard_clear()
        root.clipboard_append(text_dict[abk])
        messagebox.showinfo("Text kopiert", f"Der Text für '{abk}' wurde in die Zwischenablage kopiert. Sie können ihn nun mit Strg+V einfügen.")
    else:
        messagebox.showwarning("Nicht gefunden", f"Kein Text für '{abk}' gefunden.")

def create_new_button(event):
    abk = abkuerzung.get('1.0', 'end-1c').strip()
    if abk:
        new_button = Button(root, text=abk, command=lambda a=abk: insert_text(a))
        new_button.place(x=event.x, y=event.y)
    else:
        messagebox.showwarning("Warnung", "Bitte geben Sie zuerst eine Abkürzung ein.")

root.bind("<Button-3>", create_new_button)

scrollbar = Scrollbar(master=root)
scrollbar.place(x=280, y=8, width=10, height=197)

abkuerzung = Text(root, height=2, width=20)
abkuerzung.pack()
text_gesamt = Text(root, height=4, width=20)
text_gesamt.pack()

bestaetigung = Button(root, text="Eintrag speichern", command=speichern)
bestaetigung.pack()
abbrechen = Button(root, text="Abbrechen", command=abbrechen)
abbrechen.pack()

menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="Datei", menu=filemenu)
filemenu.add_command(label="Neu", command=NewFile)
filemenu.add_command(label="Öffnen...", command=OpenFile)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)

helpmenu = Menu(menu)
menu.add_cascade(label="Hilfe", menu=helpmenu)
helpmenu.add_command(label="Über...", command=about)

root.mainloop()

Die Daten werden in einer JSON-Datei gespeichert. Das Design wurde angepasst. Die Buttons angeordnet.

Oder in einer pickle

from tkinter import *
import pickle
import re
import tkinter.messagebox

# Dictionary initialisieren
try:
    russisch_dict = {
        "сбн.": "fM",
        "уб": "Abn",
        "пр.": "Zun"
    }
except Exception as e:
    tkinter.messagebox.showerror(title="Fehler", message=f"Fehler beim Initialisieren: {str(e)}")

# Speichern des Dictionaries
with open('russisch-dict.pkl', 'wb') as f:
    pickle.dump(russisch_dict, f)

def hinzufuegen():
    # Werte aus den Eingabefeldern holen
    russisch = eingabefeld_russisch.get("1.0", END).strip()
    deutsch = eingabefeld_deutsch.get("1.0", END).strip()

    # Überprüfen, ob beide Felder ausgefüllt sind
    if russisch and deutsch:
        russisch_dict[russisch] = deutsch  # Eintrag ins Dictionary hinzufügen
        print(f"Eintrag hinzugefügt: {russisch} -> {deutsch}")
        tkinter.messagebox.showinfo(title="Eintrag ok", message="Eintrag erfolgreich hinzugefügt")
        print("Aktuelles Dictionary:", russisch_dict)
        # Felder leeren
        eingabefeld_russisch.delete("1.0", END)
        eingabefeld_deutsch.delete("1.0", END)
        
        # Dictionary nach jedem Hinzufügen speichern
        with open('russisch-dict.pkl', 'wb') as f:
            pickle.dump(russisch_dict, f)
    else:
        print("Bitte beide Felder ausfüllen!")

def uebersetzen():
    # Eingabetext aus dem Eingabefeld holen
    eingabe_text = eingabefeld.get("1.0", END).strip()
    
    # Text in Zeilen aufteilen
    zeilen = eingabe_text.split('\n')
    
    uebersetzt = []

    for zeile in zeilen:
        # Teile jede Zeile in Elemente
        elemente = re.findall(r'\d+pb-?|\d+aum|an\.mág\.de|\w+\.?|\([^)]*\)|:', zeile)
        
        uebersetzt_zeile = []
        for element in elemente:
            if element.isdigit() or element == ':' or element.startswith('('):
                uebersetzt_zeile.append(element)
            else:
                # Übersetze zusammengesetzte Elemente
                uebersetztes_element = element
                for key, value in russisch_dict.items():
                    uebersetztes_element = uebersetztes_element.replace(key, value)
                uebersetzt_zeile.append(uebersetztes_element)
        
        uebersetzt.append(' '.join(uebersetzt_zeile))
    
    ergebnis = '\n'.join(uebersetzt)
    ausgabefeld.delete("1.0", END)
    ausgabefeld.insert(END, ergebnis)

def felder_loeschen():
    eingabefeld.delete("1.0", END)
    ausgabefeld.delete("1.0", END)

def kopieren():
    root.clipboard_clear()
    root.clipboard_append(ausgabefeld.get("1.0", END))

# GUI erstellen
root = Tk()
root.title("Häkelanleitung Übersetzer")
root.geometry("500x1000")

eingabefeld = Text(root, height=20, width=50)
eingabefeld.pack(pady=10)

top_frame = Frame(root)
top_frame.pack(pady=5)

# Buttons in der oberen Reihe
bestaetigung = Button(top_frame, text="Auf deutsch übersetzen", command=uebersetzen)
bestaetigung.pack(side=LEFT, padx=5)

kopieren_button = Button(top_frame, text="Übersetzung kopieren", command=kopieren)
kopieren_button.pack(side=LEFT, padx=5)

loeschen_button = Button(top_frame, text="Eingaben löschen", command=felder_loeschen)
loeschen_button.pack(side=LEFT, padx=5)

# Abbrechen-Button in einer separaten Reihe
abbrechen_button = Button(root, text="Abbrechen", command=root.destroy)
abbrechen_button.pack(pady=5)

# Ausgabefeld
ausgabefeld = Text(root, height=20, width=50)
ausgabefeld.pack(pady=10)

Label(root, text="russischer Begriff:").pack(pady=5)
eingabefeld_russisch = Text(root, height=2, width=30)
eingabefeld_russisch.pack(pady=10)

Label(root, text="Deutsche Übersetzung:").pack(pady=5)
eingabefeld_deutsch = Text(root, height=2, width=30)
eingabefeld_deutsch.pack(pady=10)

Button(root, text="Hinzufügen", command=hinzufuegen).pack(pady=10)

root.mainloop()

Hinweis : der gesamte Code passt nicht mehr auf eine Seite des Visual Studio Code. Da die Farbmarkierung aber zur Übersicht beiträgt hab ich mehrere Screens gemacht.

Eine Option hinzufügen mit denen die Einträge des Dictonarys angezeigt werden können.

from tkinter import *
import tkinter as tk
import pickle
import re
import tkinter.messagebox

# Dictionary initialisieren
try:
    russisch_dict = {
        "сбн.": "fM",
        "уб": "Abn",
        "пр.": "Zun"
    }
except Exception as e:
    tkinter.messagebox.showerror(title="Fehler", message=f"Fehler beim Initialisieren: {str(e)}")

# Speichern des Dictionaries
with open('russisch-dict.pkl', 'wb') as f:
    pickle.dump(russisch_dict, f)

def hinzufuegen():
    # Werte aus den Eingabefeldern holen
    russisch = eingabefeld_russisch.get("1.0", END).strip()
    deutsch = eingabefeld_deutsch.get("1.0", END).strip()

    # Überprüfen, ob beide Felder ausgefüllt sind
    if russisch and deutsch:
        russisch_dict[russisch] = deutsch  # Eintrag ins Dictionary hinzufügen
        print(f"Eintrag hinzugefügt: {russisch} -> {deutsch}")
        tkinter.messagebox.showinfo(title="Eintrag ok", message="Eintrag erfolgreich hinzugefügt")
        print("Aktuelles Dictionary:", russisch_dict)
        # Felder leeren
        eingabefeld_russisch.delete("1.0", END)
        eingabefeld_deutsch.delete("1.0", END)
        
        # Dictionary nach jedem Hinzufügen speichern
        with open('russisch-dict.pkl', 'wb') as f:
            pickle.dump(russisch_dict, f)
    else:
        print("Bitte beide Felder ausfüllen!")

def uebersetzen():
    # Eingabetext aus dem Eingabefeld holen
    eingabe_text = eingabefeld.get("1.0", END).strip()
    
    # Text in Zeilen aufteilen
    zeilen = eingabe_text.split('\n')
    
    uebersetzt = []

    for zeile in zeilen:
        # Teile jede Zeile in Elemente
        elemente = re.findall(r'\d+pb-?|\d+aum|an\.mág\.de|\w+\.?|\([^)]*\)|:', zeile)
        
        uebersetzt_zeile = []
        for element in elemente:
            if element.isdigit() or element == ':' or element.startswith('('):
                uebersetzt_zeile.append(element)
            else:
                # Übersetze zusammengesetzte Elemente
                uebersetztes_element = element
                for key, value in russisch_dict.items():
                    uebersetztes_element = uebersetztes_element.replace(key, value)
                uebersetzt_zeile.append(uebersetztes_element)
        
        uebersetzt.append(' '.join(uebersetzt_zeile))
    
    ergebnis = '\n'.join(uebersetzt)
    ausgabefeld.delete("1.0", END)
    ausgabefeld.insert(END, ergebnis)

def felder_loeschen():
    eingabefeld.delete("1.0", END)
    ausgabefeld.delete("1.0", END)

def kopieren():
    root.clipboard_clear()
    root.clipboard_append(ausgabefeld.get("1.0", END))
def show_dictionary():
    try:
        with open('russisch-dict.pkl', 'rb') as f:
            loaded_dict = pickle.load(f)
        
        popup = tk.Toplevel()
        popup.title("Dictionary Inhalt")
        
        text_widget = tk.Text(popup, wrap=tk.WORD, width=40, height=20)
        text_widget.pack(padx=10, pady=10)
        
        for key, value in loaded_dict.items():
            text_widget.insert(tk.END, f"{key}: {value}\n")
        
        text_widget.config(state=tk.DISABLED)
        
    except FileNotFoundError:
        messagebox.showerror("Fehler", "Die Dictionary-Datei wurde nicht gefunden.")
    except Exception as e:
        messagebox.showerror("Fehler", f"Fehler beim Laden des Dictionaries: {str(e)}")


# GUI erstellen
root = Tk()
root.title("Häkelanleitung Übersetzer")
root.geometry("500x1000")

eingabefeld = Text(root, height=20, width=50)
eingabefeld.pack(pady=10)

top_frame = Frame(root)
top_frame.pack(pady=5)

# Buttons in der oberen Reihe
bestaetigung = Button(top_frame, text="Auf deutsch übersetzen", command=uebersetzen)
bestaetigung.pack(side=LEFT, padx=5)

kopieren_button = Button(top_frame, text="Übersetzung kopieren", command=kopieren)
kopieren_button.pack(side=LEFT, padx=5)

loeschen_button = Button(top_frame, text="Eingaben löschen", command=felder_loeschen)
loeschen_button.pack(side=LEFT, padx=5)

# Abbrechen-Button in einer separaten Reihe
abbrechen_button = Button(root, text="Abbrechen", command=root.destroy)
abbrechen_button.pack(pady=5)

# Ausgabefeld
ausgabefeld = Text(root, height=20, width=50)
ausgabefeld.pack(pady=10)

Label(root, text="russischer Begriff:").pack(pady=5)
eingabefeld_russisch = Text(root, height=2, width=30)
eingabefeld_russisch.pack(pady=10)

Label(root, text="Deutsche Übersetzung:").pack(pady=5)
eingabefeld_deutsch = Text(root, height=2, width=30)
eingabefeld_deutsch.pack(pady=10)

Button(root, text="Hinzufügen", command=hinzufuegen).pack(pady=10)

# Button zum Anzeigen des Dictionaries
show_dict_button = Button(root, text="Dictionary anzeigen", command=show_dictionary)
show_dict_button.pack(pady=5)

root.mainloop()

Das Dictonary soll aktualisiert werden wenn der Eintrag hinzugefügt wurde, damit das Programm nicht immer neu gestartet werden muss

Ich habe noch ein Kontextmenü hinzugefügt und auf json umgestellt

from tkinter import *
import tkinter as tk
import json
import re
import tkinter.messagebox

# Dictionary initialisieren
try:
    with open('russisch-dict.json', 'r', encoding='utf-8') as f:
        russisch_dict = json.load(f)
except FileNotFoundError:
    russisch_dict = {
        "сбн.": "fM",
        "уб": "Abn",
        "пр.": "Zun"
    }
    with open('russisch-dict.json', 'w', encoding='utf-8') as f:
        json.dump(russisch_dict, f, ensure_ascii=False, indent=4)
except Exception as e:
    tkinter.messagebox.showerror(title="Fehler", message=f"Fehler beim Initialisieren: {str(e)}")

def hinzufuegen():
    # Werte aus den Eingabefeldern holen
    russisch = eingabefeld_russisch.get("1.0", END).strip()
    deutsch = eingabefeld_deutsch.get("1.0", END).strip()

    # Überprüfen, ob beide Felder ausgefüllt sind
    if russisch and deutsch:
        russisch_dict[russisch] = deutsch  # Eintrag ins Dictionary hinzufügen
        print(f"Eintrag hinzugefügt: {russisch} -> {deutsch}")
        tkinter.messagebox.showinfo(title="Eintrag ok", message="Eintrag erfolgreich hinzugefügt")
        print("Aktuelles Dictionary:", russisch_dict)
        # Felder leeren
        eingabefeld_russisch.delete("1.0", END)
        eingabefeld_deutsch.delete("1.0", END)
        
        # Dictionary nach jedem Hinzufügen speichern
        with open('russisch-dict.json', 'w', encoding='utf-8') as f:
            json.dump(russisch_dict, f, ensure_ascii=False, indent=4)
    else:
        print("Bitte beide Felder ausfüllen!")

def uebersetzen():
    # Eingabetext aus dem Eingabefeld holen
    eingabe_text = eingabefeld.get("1.0", END).strip()
    
    # Text in Zeilen aufteilen
    zeilen = eingabe_text.split('\n')
    
    uebersetzt = []

    for zeile in zeilen:
        # Teile jede Zeile in Elemente
        elemente = re.findall(r'\d+pb-?|\d+aum|an\.mág\.de|\w+\.?|\([^)]*\)|:', zeile)
        
        uebersetzt_zeile = []
        for element in elemente:
            if element.isdigit() or element == ':' or element.startswith('('):
                uebersetzt_zeile.append(element)
            else:
                # Übersetze zusammengesetzte Elemente
                uebersetztes_element = element
                for key, value in russisch_dict.items():
                    uebersetztes_element = uebersetztes_element.replace(key, value)
                uebersetzt_zeile.append(uebersetztes_element)
        
        uebersetzt.append(' '.join(uebersetzt_zeile))
    
    ergebnis = '\n'.join(uebersetzt)
    ausgabefeld.delete("1.0", END)
    ausgabefeld.insert(END, ergebnis)

def felder_loeschen():
    eingabefeld.delete("1.0", END)
    ausgabefeld.delete("1.0", END)

def kopieren():
    root.clipboard_clear()
    root.clipboard_append(ausgabefeld.get("1.0", END))

def show_dictionary():
    try:
        with open('russisch-dict.json', 'r', encoding='utf-8') as f:
            loaded_dict = json.load(f)
        
        popup = tk.Toplevel()
        popup.title("Dictionary Inhalt")
        
        text_widget = tk.Text(popup, wrap=tk.WORD, width=40, height=20)
        text_widget.pack(padx=10, pady=10)
        
        for key, value in loaded_dict.items():
            text_widget.insert(tk.END, f"{key}: {value}\n")
        
        text_widget.config(state=tk.DISABLED)
        
    except FileNotFoundError:
        messagebox.showerror("Fehler", "Die Dictionary-Datei wurde nicht gefunden.")
    except Exception as e:
        messagebox.showerror("Fehler", f"Fehler beim Laden des Dictionaries: {str(e)}")
import tkinter as tk

def create_popup_menu(widget):
    menu = tk.Menu(widget, tearoff=0)
    menu.add_command(label="Ausschneiden", command=lambda: widget.event_generate("<<Cut>>"))
    menu.add_command(label="Kopieren", command=lambda: widget.event_generate("<<Copy>>"))
    menu.add_command(label="Einfügen", command=lambda: widget.event_generate("<<Paste>>"))
    return menu

def show_popup_menu(event):
    widget = event.widget
    menu = create_popup_menu(widget)
    menu.tk_popup(event.x_root, event.y_root)

#GUI


root = Tk()
root.title("Häkelanleitung Übersetzer")
root.geometry("500x1000")

text_field = tk.Text(root)
text_field.pack()

text_field.bind("<Button-3>", show_popup_menu)
       



eingabefeld = Text(root, height=20, width=50)
eingabefeld.pack(pady=10)

top_frame = Frame(root)
top_frame.pack(pady=5)

# Buttons in der oberen Reihe
bestaetigung = Button(top_frame, text="Auf deutsch übersetzen", command=uebersetzen)
bestaetigung.pack(side=LEFT, padx=5)

kopieren_button = Button(top_frame, text="Übersetzung kopieren", command=kopieren)
kopieren_button.pack(side=LEFT, padx=5)

loeschen_button = Button(top_frame, text="Eingaben löschen", command=felder_loeschen)
loeschen_button.pack(side=LEFT, padx=5)

# Abbrechen-Button in einer separaten Reihe
abbrechen_button = Button(root, text="Abbrechen", command=root.destroy)
abbrechen_button.pack(pady=5)

# Ausgabefeld
ausgabefeld = Text(root, height=20, width=50)
ausgabefeld.pack(pady=10)

Label(root, text="russischer Begriff:").pack(pady=5)
eingabefeld_russisch = Text(root, height=2, width=30)
eingabefeld_russisch.pack(pady=10)

Label(root, text="Deutsche Übersetzung:").pack(pady=5)
eingabefeld_deutsch = Text(root, height=2, width=30)
eingabefeld_deutsch.pack(pady=10)

Button(root, text="Hinzufügen", command=hinzufuegen).pack(pady=10)

# Button zum Anzeigen des Dictionaries
show_dict_button = Button(root, text="Dictionary anzeigen", command=show_dictionary)
show_dict_button.pack(pady=5)
# Beispielaufruf
show_dictionary()
# GUI erstellen
root.mainloop()