Eingabefenster vereinfachen

Fragen zu Tkinter.
Antworten
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Guten Morgen zusammen,

ich habe mir ein universell einsetzbares Eingabefenster für beliebige Werte programmiert. Die Funktion ist vorhanden, allerdings würde ich gerne den Aufruf in sofern vereinfachen, dass ich nur noch eine Zeile dafür benötige. Siehe dazu die Kennzeichnung im Code:

Code: Alles auswählen

from tkinter import *

class TkInputBox():
    # Initalisierung
    def __init__(self, parent, fenstertitel, fenstertext):
        top = self.top = Toplevel(parent)
        width  = 300
        height = 80
        ws = fenster.winfo_screenwidth()
        hs = fenster.winfo_screenheight()
        xpos = ws / 2 - width / 2
        ypos = hs / 2 - height / 2
        top.geometry("%dx%d+%d+%d" % (width, height, xpos, ypos))
        self.top.resizable(0,0)
        self.top.title(fenstertitel)
        self.top.grab_set()

        self.Label = Label(top, text=fenstertext)
        self.Label.pack(anchor="nw", padx=5)
        self.eingabewert = Entry(top, width=60)
        self.eingabewert.focus_set()
        self.eingabewert.pack(padx=5, anchor="w")
        self.AbbruchButton = Button(top, text='Abbrechen', command=self.abbruch)
        self.AbbruchButton.pack(side="right", pady=5)
        self.UebernehmenButton = Button(top, text='Übernehmen', command=self.uebernehmen)
        self.UebernehmenButton.pack(side="right", padx=0)

    # Eingabebox abbrechen
    def abbruch(self):
        self.top.destroy()

    # Wert aus Eingabebox übernehmen
    def uebernehmen(self):
        self.callback(self.eingabewert.get())
        self.top.destroy()

    # Callback-Funktion anlegen
    def set_callback(self, a_func):
        self.callback = a_func

if __name__=="__main__":
        
        # Vereinfachung von hier an bis ...
        def getEingabe():
            eingabeFenster = TkInputBox(fenster, "Eingabefenster...", "Hier steht der Hilfetext...")
            eingabeFenster.set_callback(WertEingabeBox)

        def WertEingabeBox(wert = ''):
            label['text'] = wert
        # .. hier hin (Vereinfachung auf eine Zeile)

        fenster = Tk()
        fenster.title("Beispiel für Eingabebox")

        label = Label(fenster, text='Hier erscheint die Eingabe der Eingabebox.')
        label.pack()
        button = Button(fenster,text='Eingabebox aufrufen', command=getEingabe)
        button.pack()

        fenster.mainloop()
Die Zeile könnte dann im Idealfall so aussehen:

Code: Alles auswählen

wert = TkInputBox(fenster, "Eingabefenster...", "Hier steht der Hilfetext...")
Könnte mir jemand sagen, wie ich die Klasse TkInputBox verändern muss?

Viele Grüße

snowflake
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Sternchenimporte sind böse, was Dir hier sicher schon der ein oder andere gesagt hat.
Du benutzt self.top und top in __init__ uneinheitlich. Die meisten Widgets, die Du erzeugst, müssen keine Attribute der Klasse sein. Auch Entry-Feld nicht, da Du das am besten über eine StringVar erledigst. Statt TopLevel solltest Du auch einen Dialog benutzen, oder Du greifst schon auf eine fertig Variante zurück: http://interactivepython.org/runestone/ ... boxes.html

`wert` ist immer das TkInputBox-Element, Du mußt also eine Funktion schreiben, die ein TkInputBox-Instanz erzeugt und wartet, bis sie wieder geschlossen ist. Du benutzt ja scheinbar einen Callback um die Eingabe zu übergeben. `callback` hat aber keinen Defaultwert, so dass es immer kracht, wenn man den vergißt, daher in `__init__` übergeben. Ein Setter wird in Python nicht gebraucht.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Guten Morgen Sirius3,

vielen Dank für Deine Antwort. Ich gehe dann wahrscheinlich dazu über und verwende die vorgefertigten Varianten (wusste nicht, dass es die gibt). Sind zwar nicht "eingedeutscht", aber dafür unkompliziert.

Nochmals vielen Dank und einen schönen Tag

snowflake
Antworten