Не могу создать новую метку: / относительно моей функции меню - есть ли лучший способ структурировать мой код или исправить? - PullRequest
0 голосов
/ 12 октября 2018
from tkinter import *

class Employee:
    """Create an employee"""
    def __init__(self, forename, surname):
        self.forename = forename
        self.surname = surname
        self.username = forename[0] + '.' + surname
        self.employeeID = 1
    def employeeUsername(self):
        """Generates a username using the forename and surname of the employee class"""
        return "{}".format(self.username)

root = Tk()

class GUI(Frame):

    def __init__(self,master):
        super().__init__(master) # confused.

        self.frame = Frame(master)

        self.lu = Label(self,text = "Username: ",fg ="black",bg="white",font=("Courier",13))
        self.lp = Label(self,text = "Password: ",fg ="black",bg="white",font=("Courier",13))

        self.eu = Entry(self)
        self.ep = Entry(self, show="*")

        self.lu.grid(row = 0, sticky = E)
        self.lp.grid(row = 1, sticky = E)
        self.eu.grid(row = 0, column = 1)
        self.ep.grid(row = 1,  column = 1)

        self.log = Button(self,text="Login", command=self.login)
        self.log.grid(columnspan = 2)

        self.pack()

    def menu(self):
        print("Y")

        self.ml = Label(self, text = "Option Menu", fg = "black", bg = "white", font = ("Courier",13))

        self.pack(side = TOP , fill = X)

    def login(self):
        '''Login page'''
        uname = self.eu.get()
        pword = self.ep.get()
        if len(uname) < 5 or len(pword) == 0:
            self.error = Label(self,text="Incorrect Password",fg ="black",bg="white",font=("Courier",10))
            self.error.grid(row = 3 ,column = 1)

        else:
            root.destroy()
            self.menu()

            print("X")



main = GUI(root)
root.mainloop()

1 Ответ

0 голосов
/ 12 октября 2018

В вашем коде много ошибок.

Если вы уничтожите корневое окно, вы уничтожите также все остальные виджеты.Поэтому вы больше не можете использовать свой метод self.menu.

Вы используете разные менеджеры геометрии, было бы лучше, если вы используете только один.

Вы упаковываете в себя неправильный виджет.Метод меню должен быть self.ml.pack (), а не self.pack ()

Ваш конструктор Gui использует super () без передачи self

from tkinter import *

class Employee:
    """Create an employee"""
    def __init__(self, forename, surname):
        self.forename = forename
        self.surname = surname
        self.username = forename[0] + '.' + surname
        self.employeeID = 1
    def employeeUsername(self):
        """Generates a username using the forename and surname of the employee class"""
        return "{}".format(self.username)

class GUI(Frame):

    def __init__(self,master):
        self.master = master
        Frame.__init__(self, self.master) #still confused?
        self.pack()    
        #self.frame = Frame(master)  it's pointless variable
        self.lu = Label(self,text = "Username: ",fg ="black",bg="white",font=("Courier",13))
        self.lp = Label(self,text = "Password: ",fg ="black",bg="white",font=("Courier",13))
        self.eu = Entry(self)
        self.ep = Entry(self, show="*")
        self.lu.grid(row = 0, sticky = E)
        self.lp.grid(row = 1, sticky = E)
        self.eu.grid(row = 0, column = 1)
        self.ep.grid(row = 1,  column = 1)
        self.log = Button(self,text="Login", command=self.login)
        self.log.grid(columnspan = 2)

    def menu(self):
        print("Y")
        self.my_label = Label(self.master, text="Option Menu", fg="black", bg="white") #font=("Courier",13)
        self.my_label.pack(side = TOP , fill = X)

    def login(self):
        '''Login page'''
        uname = self.eu.get()
        pword = self.ep.get()
        if len(uname) < 5 or len(pword) == 0:
            self.error = Label(self,text="Incorrect Password",fg ="black",bg="white",font=("Courier",10))
            self.error.grid(row = 3 ,column = 1)
        else:
            #root.destroy()
            self.menu()
            #or use self.menu2() for creating toplevel window
            print("X")

if __name__ == "__main__":
    root = Tk()
    main = GUI(root)
    root.mainloop()

Было бы лучше, если высоздайте окно Toplevel и поместите в него свой self.my_label.

вроде:

    def menu2(self):
        self.my_toplevel = Toplevel(self.master)
        self.my_label = Label(self.my_toplevel, text="Option Menu", fg="black", bg="white") #font=("Courier",13)
        self.my_label.pack(side = TOP , fill = X)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...