tk.Button return

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Hallo

Leider habe ich noch ein Problem mit tkinter:

ich habe eine kleine GUI hier soll ausgewählt werden um welche Art von User es sich bei dem gegebenen Username handelt. Beim hier angegebnen Beispiel habe ich versucht für den User eine neue Zeile im DataFrame anzulegen. Dies hat auch funktioniert allerdings wenn ich diesen Dataframe später außerhalb der Klasse bzw. Funktionen aufrufe fehlt mir die hinzugefügte Zeile.

Ich ahbe auch schon versucht nur die newUserGroup zurückzugeben über return oder definition einer globalen Variable aber leider bekomme ich diesen wert nicht aus der Funktion heraus.

Könnt ihr mir vielleicht helfen ? Dies kann doch nicht so schwer sein.

Code: Alles auswählen

        
        NotDefineUser = 'Peter'
        Test = ''
        class Application(tk.Frame):

                def __init__(self, master=None):
                        tk.Frame.__init__(self, master)
                        self.pack()
                        Test = self.createWidgets()
                def createWidgets(self):
                        tk.Label(self, text="User is not listed in CustomerList.\nPlease select customer group for :\n\n" + NotDefineUser + "\n").pack()
                        tk.Button(self, text=TestUser', command=lambda: self.ButtonClick('TestUser', CustomerProfiles)).pack()
                        tk.Button(self, text='CommercialUser', command=lambda: self.ButtonClick('CommercialUser', CustomerProfiles)).pack()

                def ButtonClick(self,newUserGroup, CustomerProfilesDFmini):
                        print newUserGroup
                        newrow = pd.Series([NotDefineUser,'[new]',newUserGroup], index=['customerId', ' Customer Group ', 'CustomerType'])
                        CustomerProfiles = CustomerProfiles.append(newrow,ignore_index=True)
                        root.destroy()
                        return newUserGroup
 
        root = tk.Tk()
        app = Application(master=root)
        app.master.title('Set correct Customergroup') 
        app.mainloop()
        
        print CustomerProfiles
Vielen Dank

Florian
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Hi habe hier eine Lösung gefunden :

https://stackoverflow.com/questions/250 ... ide-the-cl

ich habe meine Variable in tk nun self.content genannt und konnte diese ausserhalb von tk mit app.content aufrufen :-)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@sbfly: Event-Methoden haben keine Rückgabewerte, wohin sollte der Wert auch zurückgegeben werden, Du hast ja gar keinen Einfluß auf den Aufrufer. Ähnlich hat `createWidget` gar keinen Rückgabewert, den Du aber in __init__ an `Test` bindest.

`pack` sollte immer vom Elternwidget aufgerufen werden. Besser partial als lambda benutzen.

Code: Alles auswählen

import Tkinter as tk
from functools import partial
        
class Application(tk.Frame):
    NOT_DEFINED_USER = "Peter"
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="User is not listed in CustomerList.\n"
            "Please select customer group for :\n\n"
            "{}\n".format(self.NOT_DEFINED_USER)).pack()
        tk.Button(self, text='TestUser', command=partial(self.button_click, 'TestUser')).pack()
        tk.Button(self, text='CommercialUser', command=partial(self.button_click, 'CommercialUser')).pack()
        self.customer_profiles = pd.DataFrame([], columns=['CustomerId', 'CustomerGroup', 'CustomerType'])

    def button_click(self, new_user_group):
        print new_user_group
        self.customer_profiles.append({
            'CustomerId': self.NOT_DEFINED_USER,
            'CustomerGroup': '[new]',
            'CustomerType': new_user_group,
        }, ignore_index=True)

def main():
    root = tk.Tk()
    root.title('Set correct Customergroup') 
    app = Application(master=root)
    app.pack()
    app.mainloop()

if __name__ == '__main__':
    main()
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Vielen Dank für den Tip

Gruß

flo
Antworten