Tkinter eigenen Textdialog?

1 Antwort

1) Strings verfügen über keine Methode read. Das Einfügen in das Eingabefeld müsste daher stattdessen so aussehen:

l_winhalt.insert(0, notiz)

2) Zu dem Zeitpunkt, zu dem du die Eingabefelder ausliest, existieren sie längst nicht mehr.

Eine Lösung wäre eine andere Ausführungsreihenfolge der Operationen:

# ...

result = [l_wtitle.get(), l_winhalt.get()]
w_editnotiz.mainloop()

return result

Noch besser allerdings wäre es, du würdest die für tkinter herkömmliche Struktur verwenden. Je Anwendung gibt es nur ein einziges Root-Fenster, wenn du mehrere Fensterinstanzen brauchst, nutze das Frame-Widget. Für den Aufbau der GUI kann man objektorientiert arbeiten.

import tkinter as tk

class Dialogue:
  def __init__(self, window):
    self.window = window

  def cancel(self):
    self.window.destroy()

  def ok(self):
    self.window.destroy()

class NoteDialogue(Dialogue):
  def __init__(self, window, title):
    Dialogue.__init__(self, window)

    note = "Inhalt"

    title_label = tk.Label(self.window, text="Titel:")
    self.title_field = tk.Entry(self.window)
    self.title_field.insert(0, title)
    content_label = tk.Label(self.window, text="Inhalt:")
    self.content_field = tk.Entry(self.window)
    self.content_field.insert(0, note)
    save_button = tk.Button(self.window, text="Save" ,command=self.ok)
    cancel_button = tk.Button(self.window, text="Abbrechen" ,command=self.cancel)

    title_label.pack()
    self.title_field.pack()
    content_label.pack()
    self.content_field.pack()
    save_button.pack(fill="x")
    cancel_button.pack(fill="x")

  def get_inputs(self):
    return [self.title_field.get(), self.content_field.get()]

root = tk.Tk()

dialogue = NoteDialogue(root, "Test")
print(dialogue.get_inputs())

root.mainloop()