2017-12-16 8 views
1

Ich möchte, dass das aktuelle Fenster durch den Inhalt ersetzt wird, anstatt ein neues Fenster zu öffnen. Hier ist mein Code:So ersetzen Sie das Fenster TKInter

from tkinter import * 

def adminLogin(): 
    global AnameEL 
    global ApwordEL # More globals :D 
    global ArootA 

    ArootA = Tk() # This now makes a new window. 
    ArootA.geometry('1280x720') 
    ArootA.title('Admin login') # This makes the window title 'login' 

    f1 = Frame(width=200, height=200, background="#D3D3D3") 
    f2 = Frame(ArootA, width=400, height=200) 

    f1.pack(fill="both", expand=True, padx=0, pady=0) 
    f2.place(in_=f1, anchor="c", relx=.5, rely=.5) 

    AnameL = Label(f2, text='Username: ') # More labels 
    ApwordL = Label(f2, text='Password: ') #^
    AnameL.grid(row=1, sticky=W) 
    ApwordL.grid(row=2, sticky=W) 

    AnameEL = Entry(f2) # The entry input 
    ApwordEL = Entry(f2, show='*') 
    AnameEL.grid(row=1, column=1) 
    ApwordEL.grid(row=2, column=1) 

    AloginB = Button(f2, text='Login', command=CheckAdmin) # This makes the login button, which will go to the CheckLogin def. 
    AloginB.grid(columnspan=2, sticky=W) 

def CheckAdmin(): 
    if AnameEL.get() == "test" and ApwordEL.get() == "123" : # Checks to see if you entered the correct data. 
     r = Tk() # Opens new window 
     r.title('Sucess') 
     loginC = Button(r, text='Add new login', command=Signup) 
     loginC.grid(columnspan=2, sticky=W) 
     r.mainloop() 
    else: 
     r = Tk() 
     r.title('Error') 
     r.geometry('550x450') 
     rlbl = Label(r, text='\n[!] Invalid Login') 
     rlbl.pack() 
     r.mainloop() 

def Signup(): # This is the signup definition, 
    global pwordE # These globals just make the variables global to the entire script, meaning any definition can use them 
    global nameE 
    global roots 

    roots = Tk() # This creates the window, just a blank one. 
    roots.title('Signup') # This renames the title of said window to 'signup' 
    intruction = Label(roots, text='Please Enter new Credidentials\n') # This puts a label, so just a piece of text saying 'please enter blah' 
    intruction.grid(row=0, column=0, sticky=E) # This just puts it in the window, on row 0, col 0. If you want to learn more look up a tkinter tutorial :) 

    nameL = Label(roots, text='New Username: ') # This just does the same as above, instead with the text new username. 
    pwordL = Label(roots, text='New Password: ') # ^^ 
    nameL.grid(row=1, column=0, sticky=W) # Same thing as the instruction var just on different rows. :) Tkinter is like that. 
    pwordL.grid(row=2, column=0, sticky=W) # ^^ 

    nameE = Entry(roots) # This now puts a text box waiting for input. 
    pwordE = Entry(roots, show='*') # Same as above, yet 'show="*"' What this does is replace the text with *, like a password box :D 
    nameE.grid(row=1, column=1) # You know what this does now :D 
    pwordE.grid(row=2, column=1) # ^^ 

    signupButton = Button(roots, text='Signup', command=FSSignup) # This creates the button with the text 'signup', when you click it, the command 'fssignup' will run. which is the def 
    signupButton.grid(columnspan=2, sticky=W) 
    roots.mainloop() # This just makes the window keep open, we will destroy it soon 

adminLogin() 

Wie Sie an jeder Taste sehen können, drücken Sie ein neues Fenster geöffnet wird. Ich möchte, dass das aktuelle Fenster stattdessen ersetzt wird. Wie Sie an jeder Taste sehen können, drücken Sie ein neues Fenster wird geöffnet. Ich möchte, dass das aktuelle Fenster stattdessen ersetzt wird.

Danke für die Hilfe.

Antwort

1

Anstatt ein neues Fenster in CheckAdmin() zu erstellen, zerstöre f1 und erstelle dann einen neuen Rahmen innerhalb von ArootA oder ändere ArootA.

Zum Beispiel in dem ungültigen Fall von CheckAdmin():

f1.destroy() # Removes everything currently inside ArootA. 
    ArootA.geometry('550x450') 
    ArootA.title('Error') 
    rlbl = Label(ArootA, text='\n[!] Invalid Login') 
    rlbl.pack() 

Welche auch f1 erfordert eine ganze Welt umspannt. Ich musste auch ArootA.mainloop() am Ende von adminLogin() hinzufügen, um ein Fenster zu öffnen.

+0

Danke @ sn8wman, das funktioniert! –

0

Ich habe den Code neu geschrieben, um das aktuelle Fenster zu ersetzen, aber ich bin mir nicht sicher, ob das das ist, wonach Sie fragen. Bitte versuchen Sie es, es ersetzt das Fenster für jeden Funktionsaufruf, aber immer noch ein Root-Fenster.

#%% 
from tkinter import * 

def adminLogin(): 
    global AnameEL 
    global ApwordEL # More globals :D 
    global ArootA 

    AnameL = Label(f2, text='Username: ') # More labels 
    ApwordL = Label(f2, text='Password: ') #^
    AnameL.grid(row=1, sticky=W) 
    ApwordL.grid(row=2, sticky=W) 

    AnameEL = Entry(f2) # The entry input 
    ApwordEL = Entry(f2, show='*') 
    AnameEL.grid(row=1, column=1) 
    ApwordEL.grid(row=2, column=1) 

    AloginB = Button(f2, text='Login', command=CheckAdmin) # This makes the 
    login button, which will go to the CheckLogin def. 
    AloginB.grid(columnspan=2, sticky=W) 


def CheckAdmin(): 
    if AnameEL.get() == "test" and ApwordEL.get() == "123" : # Checks to see 
    if you entered the correct data. 
    f2.destroy() 
    #r = Tk() # Opens new window 
    loginL = Label(f3, text = 'Success!!!') 
    loginC = Button(f3, text='Add new login', command=Signup) 
    loginL.grid(row = 2, column=0, sticky=W) 
    loginC.grid(columnspan=2, sticky=E) 
    #r.mainloop() 
else: 
    f2.destroy() 
    #r = Tk() # Opens new window 
    loginL2 = Label(f3, text = 'Error!!') 
    ribl = Label(f3, text='\n[!] Invalid Login') 
    loginL2.grid(row = 2, column=0, sticky=W) 
    ribl.grid(row = 3, column=0, sticky=W) 

    #.mainloop() 


def Signup(): # This is the signup definition, 
    global pwordE # These globals just make the variables global to the 
    entire script, meaning any definition can use them 
    global nameE 
    global roots 

    f3.destroy() 
    #r = Tk() # Opens new window 
    loginL3 = Label(f4, text = 'Signup!!!') # This renames the title of said 
    window to 'signup' 
    loginL3.grid(row = 0, column=50, sticky=W) 

    intruction = Label(f4, text='Please Enter new Credidentials\n') # This 
    puts a label, so just a piece of text saying 'please enter blah' 
    intruction.grid(row=2, column=0, sticky=E) # This just puts it in the 
    window, on row 0, col 0. If you want to learn more look up a tkinter 
    tutorial :) 

    nameL = Label(f4, text='New Username: ') # This just does the same as 
    above, instead with the text new username. 
    pwordL = Label(f4, text='New Password: ') # ^^ 
    nameL.grid(row=3, column=0, sticky=W) # Same thing as the instruction 
    var just on different rows. :) Tkinter is like that. 
    pwordL.grid(row=4, column=0, sticky=W) # ^^ 

    nameE = Entry(f4) # This now puts a text box waiting for input. 
    pwordE = Entry(f4, show='*') # Same as above, yet 'show="*"' What this 
    does is replace the text with *, like a password box :D 
    nameE.grid(row=3, column=1) # You know what this does now :D 
    pwordE.grid(row=4, column=1) # ^^ 

    signupButton = Button(f4, text='Signup', command=FSSignup) # This 
    creates 
    the button with the text 'signup', when you click it, the command 
    'fssignup' 
    will run. which is the def 
    signupButton.grid(columnspan=2, sticky=W) 
    roots.mainloop() # This just makes the window keep open, we will 
    destroy it soon 

    ArootA = Tk() # This now makes a new window. 
    ArootA.geometry('1280x720') 
    ArootA.title('Admin login') # This makes the window title 'login' 

    f1 = Frame(width=200, height=200, background="#D3D3D3") 
    f2 = Frame(ArootA, width=400, height=200) 

    f2.pack(fill='both', expand=True, padx=0, pady=0, side = TOP) 
    #f2.place(in_=f1, anchor="c", relx=.5, rely=.5) 
    f3 = Frame(ArootA, width=550, height=450) 
    f3.pack(fill='both', expand=True, padx=0, pady=0, side = TOP) 
    f4 = Frame(ArootA, width=550, height=450) 
    f4.pack(fill='both', expand=True, padx=0, pady=0, side = TOP) 

    adminLogin() 

    ArootA.mainloop() 
+0

Hallo Grace danke für die Antwort. Es scheint einige Einrückungen und Kommentare zu geben, die nicht auf den gleichen Zeilenfehlern liegen. Ich nehme an, du hast das gemeint? https://pastebin.com/raw/7CXb28Wd Wenn ja, bekomme ich diese Fehler: "NameError: Name 'f2' ist nicht definiert" –

+0

Hallo qtt qtt Der Link, den Sie gesendet haben, hat nicht die richtige Version, also habe ich das Recht eingefügt Einer hier. Es funktioniert sehr gut ohne Fehler. https://pastebin.com/tYh9kz4J –

+0

Hallo qtt qtt, überprüfen Sie die richtige Link-Version hier https://pastebin.com/tYh9kz4J, die Sie einfügen ist nicht korrekt. Dieser funktioniert sehr gut ohne Fehler –

1

Sie erhalten mehrere Fenster, weil Ihr Code so konzipiert ist. Sie haben drei Hauptroutinen: adminLogin(), CheckAdmin() und Signup(). Jede dieser Routinen erstellt ein neues "root" - oder "master" -Fenster mit einem Aufruf an Tk(), und sie tun es jedes Mal, wenn sie aufgerufen werden. Ihre Anwendung sollte nur ein einziges Hauptfenster erstellen - einen Aufruf an Tk(). Und dann können Sie dieses Hauptfenster an jede Ihrer drei Funktionen übergeben. Oder benutze es als global.

Sie können Widgets, die Sie mit .grid() platziert haben, auch ausblenden oder entfernen, indem Sie .grid_forget() oder .grid_remove() anrufen.

+0

Danke für die Info Gary! –