verschiedene Klassen auf dieselben Variablen zugreifen lassen

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
fickAdmiral
User
Beiträge: 5
Registriert: Mittwoch 25. November 2020, 21:35

Hi

bin noch sehr neu in Python und komme nicht weiter..

ich habe diese kleine app, welche zwischen frames hin und herwechseln kann:

Code: Alles auswählen

class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)        

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold")
        self.txt_font = tkfont.Font(family='Helvetica', size=12)
        self.title("MyTest2")
        self.geometry('600x300')       

        # the container is where we'll stack a bunch of frames
        # on top of each other, then the one we want visible
        # will be raised above the others
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (Page_logIn, Page_Content, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("Page_logIn")

    def show_frame(self, page_name):

        '''Show a frame for the given page name'''

        frame = self.frames[page_name]
        frame.tkraise()     
        
        
class Page_logIn(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller

        # - header title
        canvas_width = 600
        canvas_height = 100

        canvas = tk.Canvas(self, width = canvas_width, height = canvas_height, bd=0, highlightthickness=0, relief='ridge')
        canvas.pack()

        self.img = tk.PhotoImage(file = "images/bg.png")
        canvas.create_image(-20, 0, anchor = "nw", image = self.img)
        canvas.create_text(canvas_width / 2 , canvas_height / 2, font=("Helvetica", 34, 'bold'), text="Portal V2", fill="#FFFFFF")


        # - title
        label = tk.Label(self, text = "Willkommen", font = controller.txt_font)
        label.pack(side="top", pady=10)  

        # - login form

        labelframeLogin = tk.LabelFrame(self, text = "Bitte authentifizeren Sie Ihren Zugriff")
        labelframeLogin.pack(expand="yes")               

        labelUser = tk.Label(labelframeLogin, text='Benutzer:')  
        labelUser.pack(padx=10, pady=10, side='left', fill='y')

        self.controller.entryUser = tk.Entry(labelframeLogin)          
        self.controller.entryUser.pack(padx=10, pady=10, side='left', fill='y')       

        labelPwd = tk.Label(labelframeLogin, text='Passwort:')  
        labelPwd.pack(padx=10, pady=10, side='left', fill='y')

        self.controller.entryPwd = tk.Entry(labelframeLogin)  
        self.controller.entryPwd.pack(padx=10, pady=10, side='left', fill='y')               

        # - login button       
        button1 = tk.Button(self, text = "Einloggen", width = 20, command = lambda: controller.doLogin(self.controller.entryUser.get(), self.controller.entryPwd.get()))
        button1.pack(padx=10, pady=10)  

        self.controller.labelLoginMsg = tk.Label(self, text="", fg="#FF0000")  
        self.controller.labelLoginMsg.pack(padx=10, pady=10,  fill="x")    
 
soweit so gut.. jetzt habe ich da aber noch weitere Klassen für weitere Frames und ich möchte dass alle eine gemeinsame daten-"Basis" nutzen .. so wie in C+ als wenn ich mir eine static class anlege und und einfach mit myStaticClass.myVar darauf zugreife.. z.b. sollen bei einem erfolgreichen login, die user-daten in mehreren variablen gespeichert werden, welche wiederrum überall zugänglich sind (lesen/schreiben)
class user:
user_name = "test"
user_fname = ""
user_userid = ""
user_customerid = ""
user_groupid = ""
jetzt mache ich irgendwo im code sowas hier

Code: Alles auswählen

print(user.user_name)
            user.user_name = x["USER_DESC"]
            user.user_fname = x["LOGIN"]
            user.user_userid = x["USER_ID"]
            user.user_customerid = x["CUSTOMER_ID"]
            user.user_groupid = x["GROUP_ID"]          
            print(user.user_name)
das erste print() gibt mir "test" aus.. logisch.. das zweite gibt mir den wert den es zugewiesen bekommen hat, aus... soweit klar.. aber nachdem ich später in einer anderen klasse print(user.user_name) mache, gibt er mir wieder "test" aus (?)

da gibts doch bestimmt eine adequate lösung für(?). könnte mich freundlicherweise jemand in die richtie richtung schubsen? :)
Sirius3
User
Beiträge: 17809
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich kenne zwar kein C+, aber auch dort wird man keine statischen Klassen für solche Zwecke benutzen. Du brauchst eine gemeinsame Instanz, die Du allen Frames übergibst und in der Du die Attribute anlegen kannst. controller wäre so eine Instanz.
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Hallo,

ich würde für den User eine Klasse schreiben und diese dann einfach den anderen Klassen mitgeben.

Im Prinzip so:

Ein Objekt aus der Klasse User erzeugen:

Objekt.User = Klasse.User(self, user_name="Jogi",group_id="Fibu")

Beim Erzeugen der anderen Objekte, das Objekt User einfach mitgeben (die __init__ muss halt entsprechend angepasst sein).

Objekt.Frame = Klasse.Frame(self, Objekt.User)

Objekt.Page = Klasse.Page(self, Objekt.User)

Wenn du jetzt innerhalb vom Objekt.Frame am Objekt.User etwas änderst, dann bekommt das Objekt.Page die Änderung mit, weil die letztendlich auch auf das gleiche Objekt Objekt.User zugreift.

Ich habe das zum Beispiel bei meinem Haushaltsbuch mit der Datenbankanbindung gemacht. Es gibt eine Klasse Datenbank, die ein Objekt erzeugt, das an alle anderen Klassen weitergeben wird. Ich müsste ja sonst wahrscheinlich 100x den gleichen Code für den Zugriff auf die Datenbank schreiben. Wenn sich was ändern, dann müsste ich 100 Stellen ändern. So muss ich die Änderung nur an einer Stelle machen und ist gleichzeitig an 100 anderen Stellen geändert (und hoffentlich funktioniert danach noch alles LOL)

mfg
Sirius3
User
Beiträge: 17809
Registriert: Sonntag 21. Oktober 2012, 17:20

@bfm: was soll denn diese Schreibweise Objekt.User oder Klasse.Frame? Das ist ja kein Python. Die Klasse heißt nur User und eine Instanz davon ist dann z.B. user:

Code: Alles auswählen

user = User(user_name="Jogi", group_id="Fibu")
frame = Frame(user)
Antworten