Как вызвать определенный экран в Tkinter, используя OOP - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь очистить свой код Tkinter, поместив его в классы, но не могу вызвать конкретный экран. Когда я использовал только функции, я везде использовал Something.place_forget(), чтобы перейти на следующую страницу. Все мои виджеты были определены в глобальной области видимости, поэтому это было необходимо, однако я ожидал, что смогу вызывать методы из класса, в котором я определил свои виджеты в их соответствующей локальной области.

tkinter imports[...]
from functools import partial

gui = Tk()
gui.geometry("700x700")
pagenumber = 1


class Input:

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

    def checkPage(self, page):
        global pagenumber
        pagenumber = page
        print(pagenumber)

    def mainscreen(self):
        global pagenumber
        button_input = Button(self.screen, text="Input", padx="50", pady="25", bg="lightgrey",
                              command=partial(self.checkPage, 2))
        [...]
        button_input.place(x="400", y="350")

    def infoPage(self):
        title_enter = Label(self.screen, text="Enter")
            [...]
        submit.place(x="290", y="420")

    def ingredientsPage(self):
        pass


inputscreen = Input(gui)

if pagenumber == 1:
    inputscreen.mainscreen()
elif pagenumber == 2:
    print("reached")
    inputscreen.infoPage()

gui.mainloop()

Что я пытается сделать, это проверить номер страницы (который обновляется внутри класса) и использовать его, чтобы отобразить соответствующую страницу. Хотя pagenumber отлично обновляется, он не отображает экран, который должен был отображаться.

Ответы [ 2 ]

0 голосов
/ 19 августа 2020

Этот ответ дает acw, но я помещаю его здесь, поскольку он не ответил на него непосредственно в stackoverflow. В основном используйте метод clear, а затем вызовите следующий класс.

from tkinter import *
from functools import partial

gui = Tk()
gui.geometry("700x700")

class Input:
    def __init__(self, screen):
        self.screen = screen

    def checkPage(self, page):
        if page == 1:
            self.clear()
            self.mainscreen()
        elif page == 2:
            self.clear()
            self.infoPage()

    def clear(self):
        for widget in self.screen.winfo_children():
            widget.destroy()

    def mainscreen(self):
        button_input = Button(self.screen, text="InfoPage", padx="50", pady="25", bg="lightgrey",
                              command=partial(self.checkPage, 2))
        button_input.place(x="400", y="350")

    def infoPage(self):
        title_enter = Label(self.screen, text="Enter")
        title_enter.place(x="290", y="420")

        button_input = Button(self.screen, text="MainScreen", padx="50", pady="25", bg="lightgrey",
                              command=partial(self.checkPage, 1))
        button_input.place(x="200", y="150")

    def ingredientsPage(self):
        pass


inputscreen = Input(gui)
inputscreen.checkPage(1)
gui.mainloop()
0 голосов
/ 07 августа 2020

Похоже, вам не хватает одной функции обратного вызова для обновления экрана.

def page_monitor():
    if pagenumber == 1:
        inputscreen.mainscreen()
    elif pagenumber == 2:
        print("reached")
        inputscreen.infoPage()
    gui.after(1000, page_monitor)

page_monitor()

Я не уверен, что это сработает так, как вы хотите, более чем вероятно, вам все равно придется забыть виджеты, которые вы не хочу отображать. Вы можете легко создать в своем классе функцию, которая забудет размещение всех виджетов и будет вызывать их в ваших методах inputscreen.infoPage () и inputscreen.mainscreen (). Не повредит вызвать place_forget () для виджета, которого нет в месте, так что это самый простой способ сделать это. Я никогда не испытывал производительность. чтобы отслеживать последнюю страницу, на которой вы были, и обновлять ее при каждом изменении страницы. Я не запускал этот код, поэтому приношу свои извинения, если есть ошибки.

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