Как закрыть несколько окон Tkinter одной кнопкой - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь построить приложение на Python.Первый UGI запрашивает имя пользователя и пароль.Затем появляется второе окно tk, если вход выполнен успешно с помощью кнопки «ОК».После того, как пользователь нажмет кнопку okay, оба окна tk (одно, запрашивающее имя пользователя и пароль и окно успешного входа в систему) исчезнут, и программа продолжит работу.

Я очень застрял в возможности нажать кнопку «ОК» и закрыть «оба» окна.Буду благодарен за любые идеи, спасибо!

Все коды работают нормально.команда для выполнения функции LoginSuccessful в CheckLogin может выполнить print("ANCD"), но она не закрывает два окна tk.

#import packages
import time
import openpyxl
from openpyxl import load_workbook
import tkinter as tk
from tkinter import *
import sys

def Function():

    global user1
    user1 = 'testing'
    password1 = '0000' 



    def Login_form():
        global username
        global password
        global rootA


        rootA = Tk() 
        rootA.title('User Authentication')

        msgbox1 = Label(rootA, text='Please Login\n') 
        msgbox1.grid(sticky=E) 

        username = Label(rootA, text='Username: ') 
        password = Label(rootA, text='Password: ')
        username.grid(row=1, sticky=W)
        password.grid(row=2, sticky=W)

        username = Entry(rootA) 
        password = Entry(rootA, show='*') 
        username.grid(row=1, column=1)
        password.grid(row=2, column=1)

        login_btn = Button(rootA, text='Login', command=CheckLogin) 
        exit_btn=Button(rootA, text='Exit',command=sys.exit)
        login_btn.grid(row=4, column=1)
        exit_btn.grid(row=4, column=2)
        rootA.mainloop()


    def CheckLogin():

        if username.get() == user1 and password.get() == password1: 
            rootA = Tk()
            rootA.title('Authentication Cehck')
            rootA.geometry('150x100') # Makes the window a certain size
            rlbl = Label(rootA, text='\n Logged In') 
            okay_btn=Button(rootA, text='Okay',command=LoginSuccessful)
            okay_btn.pack()
            #LoginSuccessful()

        else:
            r = Tk()
            r.title('Authentication Cehck')
            r.geometry('150x160')
            rlbl = Label(r, text='\n Invalid Login')
            rlbl.pack()
            okay_btn=Button(r, text='Try Again',command=r.destroy)
            okay_btn.pack()
            exit_btn=Button(r, text='Exit',command=sys.exit)
            exit_btn.pack()
            #r.mainloop()

    def LoginSuccessful ():
        rootA.destroy
        print("ANCD")


    def Insert_Rows():
        for rows in range (len(All_Users_Sheet)):
            if rows == 0: 
                rows +1 
                continue
            if All_Users_Sheet[rows][10].value == None:
                break
            else:
                print(All_Users_Sheet[rows][10].value)
                print(type(All_Users_Sheet[rows][10].value))



    Login_form()

Function()

Есть ли способ, который после проверки имени пользователяи пароль, если он правильный, закрыть все окна tk, нажав кнопку, и продолжить выполнение оставшихся задач?

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Вы должны создать только один экземпляр Tk.Если вам нужно дополнительное окно, используйте Toplevel.

def CheckLogin():

    if username.get() == user1 and password.get() == password1:
        rootA = Toplevel()
        rootA.title('Authentication Check')
        ...

    else:
        r = Toplevel()
        ...
0 голосов
/ 09 июня 2019

у меня есть одно решение.

from tkinter import *
global user1
user1 = 'testing'
password1 = '0000'

def combine_funcs(*funcs):
    def combined_func(*args, **kwargs):
        for f in funcs:
            f(*args, **kwargs)
    return combined_func


def Login_form():
    global username
    global password
    global rootA


    rootA = Tk()
    rootA.title('User Authentication')

    msgbox1 = Label(rootA, text='Please Login\n')
    msgbox1.grid(sticky=E)

    username = Label(rootA, text='Username: ')
    password = Label(rootA, text='Password: ')
    username.grid(row=1, sticky=W)
    password.grid(row=2, sticky=W)

    username = Entry(rootA)
    password = Entry(rootA, show='*')
    username.grid(row=1, column=1)
    password.grid(row=2, column=1)

    login_btn = Button(rootA, text='Login', command=CheckLogin)
    exit_btn=Button(rootA, text='Exit',command=rootA.destroy)
    login_btn.grid(row=4, column=1)
    exit_btn.grid(row=4, column=2)
    rootA.mainloop()


def CheckLogin():
    global rootA
    if username.get() == user1 and password.get() == password1:
        rootA = Tk()
        rootA.title('Authentication Cehck')
        rootA.geometry('150x100') # Makes the window a certain size
        rlbl = Label(rootA, text='\n Logged In')
        okay_btn=Button(rootA, text='Okay',command=LoginSuccessful)
        okay_btn.pack()
        #LoginSuccessful()

    else:
        r = Tk()
        r.title('Authentication Cehck')
        r.geometry('150x160')
        rlbl = Label(r, text='\n Invalid Login')
        rlbl.pack()
        okay_btn=Button(r, text='Try Again',command=r.destroy)
        okay_btn.pack()
        exit_btn=Button(r, text='Exit',command= combine_funcs(rootA.destroy, r.destroy))
        exit_btn.pack()
        #r.mainloop()

def LoginSuccessful ():
    rootA.destroy
    print("ANCD")


def Insert_Rows():
    for rows in range (len(All_Users_Sheet)):
        if rows == 0:
            rows +1
            continue
        if All_Users_Sheet[rows][10].value == None:
            break
        else:
            print(All_Users_Sheet[rows][10].value)
            print(type(All_Users_Sheet[rows][10].value))



Login_form()

пожалуйста, не спрашивайте насчет деф., ** kwargs) возвращаем комбинированный_функц, он просто решает проблему

...