【问题标题】:How to replace window TKInter如何更换窗口TKInter
【发布时间】:2018-05-30 18:06:15
【问题描述】:

我希望将当前窗口替换为内容,而不是打开一个新窗口。这是我的代码:

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()

正如您所见,每次按下按钮都会打开一个新窗口。我希望替换当前窗口。正如您所看到的,每个按钮按下都会打开一个新窗口。我希望替换当前窗口。

感谢您的帮助。

【问题讨论】:

    标签: python python-3.x tkinter python-3.5


    【解决方案1】:

    由于代码的设计方式,您会获得多个窗口。您有三个主要例程:adminLogin()CheckAdmin()Signup()。这些例程中的每一个都会创建一个新的“根”或“主”窗口,并调用Tk(),并且每次调用时都会这样做。您的应用程序应该只创建一个主窗口——一次调用Tk()。然后您可以将该主窗口传递给您的三个函数中的每一个。或将其用作全局。

    您还可以通过调用.grid_forget().grid_remove() 来隐藏或删除使用.grid() 放置的小部件。

    【讨论】:

    • 感谢加里的信息!
    【解决方案2】:

    我已重写代码以替换当前窗口,但我不确定这是否是您要求的。请尝试一下,它确实会为每个函数调用替换窗口,但仍保留一个根窗口。

    #%%
    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()
    

    【讨论】:

    • 嗨,格雷斯感谢您的回复。似乎有一些缩进和注释不在同一行错误中。我假设你是这个意思? pastebin.com/raw/7CXb28Wd 如果是这样,我会收到以下错误:“NameError: name 'f2' is not defined”
    • 嗨 qtt qtt 您发送的链接没有正确的版本,所以我在这里重新粘贴了正确的链接。它工作得很好,没有任何错误。 pastebin.com/tYh9kz4J
    • 嗨 qtt qtt,在这里查看正确的链接版本pastebin.com/tYh9kz4J,您粘贴的那个不正确。这个工作非常好,没有任何错误
    【解决方案3】:

    不是在 CheckAdmin() 中创建一个新窗口,而是销毁 f1,然后在 ArootA 内创建一个新框架或更改 ArootA。

    例如CheckAdmin()无效的情况:

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

    这也要求 f1 是一个全局变量。我还需要在 adminLogin() 末尾添加 ArootA.mainloop() 以打开一个窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2013-01-08
      相关资源
      最近更新 更多