Как вернуть значение из одного класса в другой? - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь вернуть entry_username из класса Window1 в класс с именем Window2.

Мой полный код находится внизу

МойЦель состоит в том, чтобы показать внутри Window2 метку, которая показывает имя пользователя, который только что вошел в систему с Window1

Я использую ноутбук в Windows2, имея в виду.

Вот что я пробовалвнутри Window2:

self.User = Label(main, text = Window1().entry_username.get())

Но это возвращает мне ошибку:

TypeError: __init__() missing 1 required positional argument: 'master'

Мой файл паролей:

test:1

def main():
    root = Tk()
    app = Window1(root)

    root.mainloop()

class Window1:
    def __init__(self,master):
        self.master = master
        self.master.title("User Log In")
        self.master.geometry('400x150')
        self.frame = Frame(self.master)
        self.frame.pack(fill="both", expand=True)


        self.label_username = Label(self.frame, text="Username: ",font=("bold",16))
        self.entry_username = Entry(self.frame, font = ("bold", 14))
        self.label_password = Label(self.frame, text="Password: ",font=("bold",16))
        self.entry_password = Entry(self.frame, show="*", font = ("bold", 14))

        self.label_username.pack()
        self.entry_username.pack()
        self.label_password.pack()
        self.entry_password.pack()

        self.logbtn = Button(self.frame, text="Login", font = ("bold", 10), command=self._login_btn_clicked)
        self.logbtn.pack()



    def _login_btn_clicked(self):
        # print("Clicked")
        username = self.entry_username.get()
        password = self.entry_password.get()

        # print(username, password)
        account_list = [line.split(":", maxsplit=1) for line in open("passwords.txt")]
        # list of 2-tuples. Usersnames with colons inside not supported.
        accounts = {key: value.rstrip() for key, value in account_list}
        # Convert to dict[username] = password, and slices off the line ending.
        # Does not support passwords ending in whitespace.
        if accounts[username] == password:
            self.master.withdraw()
            self.newWindow = Toplevel(self.master)
            self.app = Window2(self.newWindow)

        else:
            self.entry_username.delete(0,"end")



class Window2:
    def __init__(self,master):
        notebook = ttk.Notebook(master)

        notebook.pack(expand = 1, fill = "both")
        #Frames
        main = ttk.Frame(notebook)

        notebook.add(main, text='Main-Screen')




if __name__ == '__main__':
    main()

Обновление: 30/09/2019 Это правильно?

def main():
    root = Tk()
    app = Window1(root)

    root.mainloop()

class Window1:
    def __init__(self,master,username): #added code
        self.username = username#added code 2

        self.master = master
        self.master.title("User Log In")
        self.master.geometry('400x150')
        self.frame = Frame(self.master)
        self.frame.pack(fill="both", expand=True)

        username = 'KOB' #added code 3
        window_1_instance = Window1(username) # added code 4

        self.label_username = Label(self.frame, text="Username: ",font=("bold",16))
        self.entry_username = Entry(self.frame, font = ("bold", 14))
        self.label_password = Label(self.frame, text="Password: ",font=("bold",16))
        self.entry_password = Entry(self.frame, show="*", font = ("bold", 14))

        self.label_username.pack()
        self.entry_username.pack()
        self.label_password.pack()
        self.entry_password.pack()

        self.logbtn = Button(self.frame, text="Login", font = ("bold", 10), command=self._login_btn_clicked)
        self.logbtn.pack()



    def _login_btn_clicked(self):
        # print("Clicked")
        username = self.entry_username.get()
        password = self.entry_password.get()

        # print(username, password)
        account_list = [line.split(":", maxsplit=1) for line in open("passwords.txt")]
        # list of 2-tuples. Usersnames with colons inside not supported.
        accounts = {key: value.rstrip() for key, value in account_list}
        # Convert to dict[username] = password, and slices off the line ending.
        # Does not support passwords ending in whitespace.
        if accounts[username] == password:
            self.master.withdraw()
            self.newWindow = Toplevel(self.master)
            self.app = Window2(self.newWindow)

        else:
            self.entry_username.delete(0,"end")



class Window2:
    def __init__(self,master):
        notebook = ttk.Notebook(master)

        notebook.pack(expand = 1, fill = "both")
        #Frames
        main = ttk.Frame(notebook)

        notebook.add(main, text='Main-Screen')

        self.User = Label(main, text=window_1_instance.username)#added code 5


if __name__ == '__main__':
    main()

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Window1 - это название всего класса. Вам нужен единственный экземпляр объекта класса, а затем извлеките переменную экземпляра из него.

Например,

class Window1:

    def __init__(self, username):
        self.username = username

...

username = 'KOB'
window_1_instance = Window1(username)

....

self.User = Label(main, text=window_1_instance.username)

В этой строке кода:

self.User = Label(main, text = Window1().entry_username.get())

Window1() создает экземпляр класса, такой же, как я делал выше, только без передачи его в переменную. Поскольку вы определили конструктор Window1 (метод __init__), который будет принимать master в качестве параметра, вам нужно изменить эту строку на:

self.User = Label(main, text = Window1(master=<instance of master>).entry_username.get())

Это именно то, о чем говорит ошибкаВы:

TypeError: __init__() missing 1 required positional argument: 'master'
0 голосов
/ 29 сентября 2019

Два способа:

  1. Прямой доступ к значению из вызывающего класса, например print(foo.x)
  2. Создание метода получения в первом классе и вызов метода получения из второго типа, например k = foo.getVal()

Базовый пример передачи значения между классами обоими методами:

class foo():
    def __init__(self):
        self.x = 42
    def getVal(self):
      return self.x

class bar(object):
    def __init__(self, foo):
        print(foo.x)
        k = foo.getVal()
        print(k)

a = foo()
b = bar(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...