рамка не поднимается при использовании frame.tkraise () - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь поднять рамку «Поиск» над рамкой «Логин», когда пользователь нажимает кнопку «Войти». Я думаю, что это может иметь какое-то отношение к тому, как я складываю свои фреймы, но я не уверен, что это такое.

Я проверил, запускается ли функция show_frame после того, как пользователь нажимает кнопку «Войти», ида, но рамка не поднимается.

import tkinter as tk

class App(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        root = tk.Frame(self)

        self.screen_w = root.winfo_screenwidth()
        self.screen_h = root.winfo_screenheight()

        self.frames = {}
        for F in (Login, Search):
            page_name = F.__name__
            frame = F(parent=root, controller=self)
            self.frames[page_name] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("Search")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

class Login(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller

        self.screen_w = controller.screen_w
        self.screen_h = controller.screen_h

        self.display()

    def display(self):

        #login page (frame)
        self.login_page = tk.Frame(width=self.screen_w, height=self.screen_h, background="#ABEBC6")
        self.login_section = tk.Frame(width=100, height=100, background="#52BE80")

        self.login_page.pack()
        self.login_section.place(in_=self.login_page, anchor="c", relx = 0.5, rely = 0.5, relheight = 0.5, relwidth = 0.5)

        self.login_button = tk.Button(self.login_section, text='Login', fg = 'black', bg = 'green')
        self.login_button.place(relx = 0.5, rely = 0.55, relheight = 0.1, relwidth = 0.4, anchor = 'c')
        self.login_button.bind('<Button-1>', self.check_login)

    def check_login(self, event):

        self.controller.show_frame('Search')

class Search(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller

        self.screen_w = controller.screen_w
        self.screen_h = controller.screen_h

        self.display()

    def display(self):

            #search page (frame)
            self.search_page = tk.Frame(width=self.screen_w, height=self.screen_h, background="#85C1E9")
            self.search_section = tk.Frame(width=100, height=100, background="#5DADE2")

            self.search_page.pack()
            self.search_section.place(in_=self.search_page, relx = 0.5, rely = 0.5, relheight = 0.5, relwidth = 0.5, anchor = 'center')

if __name__ == "__main__":
    app = App()
    app.mainloop()

1 Ответ

0 голосов
/ 24 октября 2019

Корень вашей проблемы в том, что вы помещаете внутренние рамки в корневое окно, а не на страницу.

Вам необходимо изменить это:

self.login_page = tk.Frame(width=self.screen_w, height=self.screen_h, background="#ABEBC6")
self.login_section = tk.Frame(width=100, height=100, background="#52BE80")

... наэто (обратите внимание на параметр self при вызове Frame):

self.login_page = tk.Frame(self, width=self.screen_w, height=self.screen_h, background="#ABEBC6")
self.login_section = tk.Frame(self, width=100, height=100, background="#52BE80")

... и аналогично для страницы поиска

Это вызывает много других проблем, но это кореньпроблема. Каждый виджет, который вы создаете на каждой из ваших «страниц», должен находиться в рамке этой «страницы».

Другая проблема заключается в том, что вы создаете рамку с именем root внутри главного окна, иВы помещаете все остальное в root. Однако вы никогда не звоните pack, place или grid на root. Из-за этого ни один из ваших виджетов не будет отображаться.

Самое простое решение этой проблемы - позвонить по ней pack:

root.pack(fill="both", expand=True)

Вы также показываете "Поиск"страница при запуске, а не страница входа, поэтому кнопка входа никогда не будет отображаться.

Вам нужно позвонить self.show_frame("Login") вместо self.show_frame("Search") в вашем __init__.

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