如何使用OOP调用Tkinter中的特定屏幕

2024-07-01 08:20:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过将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得到了很好的更新,但它并没有显示预期的屏幕


Tags: selfinput定义屏幕部件defpageplace
2条回答

这个答案是由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()

看起来不错,你错过了一件事,一个实际更新屏幕的回调

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的小部件上调用place_forget()并没有什么坏处,所以这是最简单的方法。我从未测试过性能

tkinter imports[...]
from functools import partial

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


class Input:
    def __init__(self, screen):
        self.screen = screen
        self.button_input = Button(self.screen, text="Input", padx="50", 
                                   pady="25", bg="lightgrey",
                                   command=partial(self.changePage, 2))
        self.title_enter = Label(self.screen, text="Enter")

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

    def forget_widgets()
        self.button_input.place_forget()
        self.title_enter.place_forget()

    def mainscreen(self):
        self.forget_widgets()
        self.button_input.place(x="400", y="350")

    def infoPage(self):
        self.forget_widgets()
        self.title_enter.place(x="290", y="420")


    def ingredientsPage(self):
        pass


inputscreen = Input(gui)

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

page_monitor()
gui.mainloop()

如果您想让函数忘记最后一页变量,您只需要将程序设计为仅可预测地从一页到另一页流动,或者创建一个全局变量来跟踪您所在的最后一页,并在页面更改时更新它。我没有运行此代码,因此如果有任何错误,我深表歉意

相关问题 更多 >

    热门问题