Zugriff auf Funktionsrückgabewert bei .bind() an Entry-Widget

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Da gehen ja dauernd Fenster auf und wieder zu. Es geht *noch* einfacher, in dem man einfach eine ganz normale GUI-Anwendung programmiert, ereingnisbasiert, und nicht den Versuch unternimmt das irgendwie wieder in einen ”linearen” Programmablauf zwängen zu wollen.
Das Thema war aber: Zugriff auf Funktionsrückgabewert. Bei einer normalen GUI-Anwendung erhält man auch einen Wert aber es ist kein 'Funktionsrückgabewert', sondern ein Weitergabewert.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Terahnee hat geschrieben: Meine Frage ist nun: Wie kann ich mit diesen Daten weiterarbeiten? Ich umgehe das Problem momentan indem ich in der Eventhandler-Funktion die Ausgaben mache, aber das ist ja sicherlich nicht Sinn der Sache. Wenn ich die Datenbankabfrage mit einem "return" zurückgebe, wo landet das dann? Wie kann ich darauf zugreifen? Geht das überhaupt?
Du brauchst gar nicht das mit dem Eventhandler zu machen, um zu wissen was im Entry Feld steht.
Anstatt den eingescannten Wert an das Entryfeld zu übergeben und wegzuwerfen, kannst Du Dir ihn ja vorher merken. Außerdem kann man auch den Wert aus dem Entryfeld herauslesen ohne dass Return gedrückt wird und Du dann einen Eventhandler brauchst.

Es geht hier ganz ohne Return:

Code: Alles auswählen

import tkinter as tk

class Application(tk.Tk):
 
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        # widget definitions ===================================
        self.variable = tk.StringVar()
        self.entry = tk.Entry(self,textvariable = self.variable,state='readonly')
        self.entry.pack()
        self.entry.focus_set()


        # later
        self.variable.set(self.scan_barcode())

        # wie bekommt man heraus, was im entry Feld steht?

        # stattdessen geht es auch so

        value = self.scan_barcode()
        self.variable.set(value)

        # testen
        entry_value = self.entry.get()
        yes = value == entry_value

        print("{} == {} ? {}!".format(value,self.entry.get(),'ja' if yes else 'nein'))
        

    def scan_barcode(self):
        # wert zum testen
        return '34516896'
        

Application().mainloop()
Terahnee
User
Beiträge: 13
Registriert: Dienstag 8. August 2017, 13:48

Alfons Mittelmeyer hat geschrieben: Du brauchst gar nicht das mit dem Eventhandler zu machen, um zu wissen was im Entry Feld steht.
Anstatt den eingescannten Wert an das Entryfeld zu übergeben und wegzuwerfen, kannst Du Dir ihn ja vorher merken. Außerdem kann man auch den Wert aus dem Entryfeld herauslesen ohne dass Return gedrückt wird und Du dann einen Eventhandler brauchst.

Es geht hier ganz ohne Return:
Ich möchte es ja gerade mit einem Return machen, weil mir der Barcode-Scanner beim Scanvorgang direkt ein Return mitliefert. Das dient der Bequemlichkeit, da der Benutzer so nach Einlesen des Barcodes keinen Knopf mehr zu drücken braucht.

Dein Hinweis, dass man einen Wert aus einem Entryfeld natürlich an jeder Stelle lesen kann, hat mich aus meinem falschen Denken herausgebracht. Es funktioniert jetzt so wie es sollte! Vielen Dank an alle Beteiligten.
Antworten