2017-12-16 25 views
1

新しいウィンドウを開く代わりに、現在のウィンドウを内容に置き換えてください。ここに私のコードです:ウィンドウの交換方法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() 

ボタンを押すごとに、新しいウィンドウが開きます。代わりに現在のウィンドウを置き換えてください。各ボタンを押すごとに新しいウィンドウが開きます。代わりに現在のウィンドウを置き換えてください。

ありがとうございました。

答えて

1

CheckAdmin()で新しいウィンドウを作成する代わりに、f1を破棄し、ArootAの内部に新しいフレームを作成するか、ArootAを変更します。 CheckAdminの無効な場合、例えば

():

もグローバルようにF1を必要
f1.destroy() # Removes everything currently inside ArootA. 
    ArootA.geometry('550x450') 
    ArootA.title('Error') 
    rlbl = Label(ArootA, text='\n[!] Invalid Login') 
    rlbl.pack() 

。また、ウィンドウを開くためにadminLogin()の最後にArootA.mainloop()を追加する必要がありました。

+0

ありがとう@ sn8wman、これは機能します! –

0

私は現在のウィンドウを置き換えるコードを書き直しましたが、あなたが求めているのかどうかはわかりません。それを試してみると、各関数呼び出しのウィンドウが置き換えられますが、1つのルートウィンドウは保持されます。

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

こんにちは、グレースは返事をありがとう。インデントとコメントには同じ行の誤りがないようです。あなたはこれを意味すると思いますか? https://pastebin.com/raw/7CXb28Wdもしそうなら、これらのエラーが出ます: "NameError:名前 'f2'が定義されていません" –

+0

こんにちはqtt qttあなたが送信したリンクは正しいバージョンを持っていますので、ここに1つ。何のエラーもなく非常にうまく動作します。 https://pastebin.com/tYh9kz4J –

+0

こんにちはqtt qtt、正しいリンクバージョンをここで確認してくださいhttps://pastebin.com/tYh9kz4J、ペーストするものが正しくありません。これはエラーなしで非常に細かく動作します –

1

コードが設計されているため、複数のウィンドウが表示されています。主なルーチンは、adminLogin()CheckAdmin()Signup()の3つです。これらのルーチンはそれぞれ、新しい "ルート"または "マスター"ウィンドウを作成し、Tk()への呼び出しを行い、呼び出されるたびに実行します。アプリケーションでは、1つのマスターウィンドウしか作成しないでください.1つはTk()です。そして、そのマスターウィンドウをあなたの3つの機能のそれぞれに渡すことができます。または、グローバルとして使用してください。

.grid()で配置したウィジェットを非表示にするには、.grid_forget()または.grid_remove()を呼び出してください。

+0

情報ありがとうゲーリー! –

関連する問題