【问题标题】:How to use classes to display different screens in tkinter如何使用类在 tkinter 中显示不同的屏幕
【发布时间】:2020-08-07 21:17:28
【问题描述】:

在我的 tkinter 项目中,我的代码中有两个类,即 inputsearch。这两个类都单独运行良好,并且在它们下包含一堆子页面,我可以通过这些子页面进行导航。但是我无法在两个班级之间切换。由于我的项目相当大,我在下面提供了我的方法作为通用代码。

InputOrSearch = False


class Input:   # class 1
    [...]

class Search:   # class 2
    def __init__(self, screen):
        self.screen = screen

    def CheckPage(self, page, optmenu=None):
        if page == 1:
            self.Clear()
            self.search_menu()

    def Clear(self):
        for widget in self.screen.winfo_children():
            widget.destroy()
    [...]


inputscreen = Input(gui)
searchscreen = Search(gui)


def inputorsearch():
    if not InputOrSearch:
        inputscreen.CheckPage(1)
    else:
        searchscreen.CheckPage(1)


while True:
    inputorsearch()

    gui.mainloop()

这是我使用的方法,虽然这会正确导致 Input,但由于某种原因,它似乎不适用于 Search

【问题讨论】:

    标签: python python-3.x class tkinter


    【解决方案1】:

    最简单的解决方案是让每个类成为Frame 的子类。然后,您可以轻松地在它们之间切换,方法是销毁一个并创建另一个实例,或者在启动时创建它们,然后隐藏一个并显示另一个。

    import tkinter as tk
    
    class Input(tk.Frame):
        def __init__(self, parent):
            super().__init__(parent)
            label = tk.Label(self, text="I am Input.")
            label.pack(side="top", fill="both", expand=True)
    
    class Search(tk.Frame):
        def __init__(self, parent):
            super().__init__(parent)
            label = tk.Label(self, text="I am Search.")
            label.pack(side="top", fill="both", expand=True)
    
    def inputorsearch():
        if not InputOrSearch:
            searchscreen.pack_forget()
            inputscreen.pack(fill="both", expand=True)
        else:
            inputscreen.pack_forget()
            searchscreen.pack(fill="both", expand=True)
    
    
    gui = tk.Tk()
    inputscreen = Input(gui)
    searchscreen = Search(gui)
    
    InputOrSearch = True
    inputorsearch()
    
    gui.mainloop()
    

    【讨论】:

    • @rish:这个 exact 代码不起作用?或者你是说你没有向我们展示的代码不起作用?您向我们展示的代码并非继承自 Frame
    • 我的类代码是单独工作的,但是当我试图实现你建议的代码时,它会给出错误。
    • 您能否更新您的答案以使用inputscreen.CheckPage(1)searchscreen.CheckPage(1) 方法。这应该代替.pack
    • @rishi:我不知道CheckPageClear 应该做什么。一般来说,使用我的方法,一个类不应该将任何小部件放在它的父级(在你的情况下,self.screen)中,也不应该从它的父级中删除它们。您不应该删除self.screen 的所有子代,因为这会同时删除SearchInput wigets。 Search 应该只需要担心它的孩子,Input 应该只需要担心它的孩子。
    • @rishi:不,您不应该在 GUI 中使用 while 循环。这就是mainloop 的用途。您应该根据事件进行切换,例如单击按钮。
    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多