【问题标题】:How to inherit a tkinter GUI window with OOP class?如何使用 OOP 类继承 tkinter GUI 窗口?
【发布时间】:2020-11-09 12:54:39
【问题描述】:

我正在尝试制作一个 GUI,它有几个看起来应该相似的窗口。所有窗口都应该在左侧有菜单。在右侧,它将包含制作窗口的内容,因此在几个窗口之间会有所不同。

一张图片来说明我要解释的内容:

所以左边的菜单对于每个窗口应该保持不变,但右边的内容应该不同。我正在使用的代码是:

import tkinter as tk

class Home:

    def __init__(self, master):
        maincolor = 'darkgrey'
        menucolor = 'grey'

        # Menu creation
        menu = tk.Frame(master, bg=menucolor)

        # Main creation
        main = tk.Frame(master, bg=maincolor)

        # Menu positioning
        menu.grid(row=0, column=0, sticky='nsew')

        # Main positioning
        main.grid(row=0, column=1, sticky='nsew')

        # Menu items
        self.home = tk.Button(menu, text='Home')
        self.overview = tk.Button(menu, text='Overview')
        self.apartments = tk.Button(menu, text='Apartments')
        self.students = tk.Button(menu, text='Students')
        self.stats = tk.Button(menu, text='Statistics')

        # Menu items location
        self.home.grid(row=0, column=0, pady=(25, 50), padx=15)
        self.overview.grid(row=1, column=0, pady=(0, 50), padx=15)
        self.apartments.grid(row=2, column=0, pady=(0, 50), padx=15)
        self.students.grid(row=3, column=0, pady=(0, 50), padx=15)
        self.stats.grid(row=4, column=0, pady=(0, 50), padx=15)

        # Menu items configuration
        buttons = [self.home, self.overview, self.apartments, self.students, self.stats]
        for self.button in buttons:
            self.button.configure(width=20, height=5, highlightbackground=menucolor)

        # Main items
        self.maintext = tk.Label(main, text='Welcome to the Apartment Manager', bg=maincolor, pady=250)
        self.maintext.pack()


class Overviews(Home):
    pass


class Apartments(Home):
    pass


class Students(Home):
    pass


class Stats(Home):
    pass


root = tk.Tk()
root.title('Apartment Manager')
root.geometry('750x750')
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=7)
root.grid_rowconfigure(0, weight=1)
root.wm_withdraw()
root.update()

runit = Home(root)

root.after(1, root.deiconify)
root.mainloop()

我的问题是,我如何从Home 类继承,以便除右侧内容外的所有内容都相同?

【问题讨论】:

  • 你应该把left窗口放到另一个类中,而不是包含在Home类中。
  • 好的,谢谢。为什么这比将其放入home__init__ 中更好?我应该在__init__ 中添加任何内容吗?如果可以,该怎么做?
  • 我认为只要单击左侧窗口中的一个按钮,您就想切换右侧窗口,对吧?那么,当单击HomeOverview 按钮时,如何获取例如Overviews 页面的实例?
  • 我想通过按钮命令(在主屏幕上)调用Overviews类,然后在Overviews类中继承左右部分并覆盖右侧部分。不知道这是否合适或可能。很想听听你的想法!

标签: python class oop inheritance tkinter


【解决方案1】:

您根本不应该从“Home”类继承。如果您希望右侧的每个页面都可以使用这些按钮,那么它们不应该是页面的一部分。如果您将它们放在一个类中,并且每个页面都从该类继承,那么您最终会得到 25 个按钮而不是 5 个。

相反,将您的根窗口分成两部分:左侧的框架用于按钮,右侧的框架用于每个单独的窗口。然后,您可以在单独的类或单独的函数中创建按钮。最后,Home、Overview 等的类都应该是相同的,它们都不应该有按钮。

【讨论】:

  • 所以我不应该用其他类继承的按钮创建一个单独的类? “他们都不应该有按钮”是什么意思?那么他们应该如何进入我的屏幕呢?感谢您的时间和回答。
  • @Jem: “所以我不应该用其他类继承的按钮创建一个单独的类?” - 正确。您可以将它们放在一个类中,但其他类不应该从它继承。继承不是为共享组件而设计的。每个类都有自己的一组小部件。通过在单独的函数或类中创建按钮或仅在全局范围内创建按钮,按钮进入屏幕。
  • 我最初的想法是通过单击按钮销毁所有内容并创建左侧和右侧新的。但是如果我理解正确的话,左边(按钮)不应该改变,因为它不能是右边的一部分。所以只有右边会改变,这取决于点击左边的按钮
【解决方案2】:

您应该将以下命令拆分为一个函数。现在改变屏幕后,你可以在新函数self.left_menu()中调用它。

    def left_menu(self):
        # Menu items
        self.home = tk.Button(menu, text='Home')
        self.overview = tk.Button(menu, text='Overview')
        self.apartments = tk.Button(menu, text='Apartments')
        self.students = tk.Button(menu, text='Students')
        self.stats = tk.Button(menu, text='Statistics')

        # Menu items location
        self.home.grid(row=0, column=0, pady=(25, 50), padx=15)
        self.overview.grid(row=1, column=0, pady=(0, 50), padx=15)
        self.apartments.grid(row=2, column=0, pady=(0, 50), padx=15)
        self.students.grid(row=3, column=0, pady=(0, 50), padx=15)
        self.stats.grid(row=4, column=0, pady=(0, 50), padx=15)

如果您将在类之外调用它,您可以通过将类分配给变量然后调用函数来实现。

obj = Home()
obj.left_menu()

【讨论】:

  • 所以我应该把所有东西都从__init__函数中取出来?什么应该留在__init__
  • __init__ 函数不可调用。我建议把你只需要调用一次的变量和函数放在那里。
  • 此时,我还不知道要在__init__ 中放入哪些内容,可以不放任何东西吗?
  • @Jem 是的。 __init__ 不是必须调用的函数。
  • @Jem 我错过了,应该是,对不起。
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 2015-10-12
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2021-06-25
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多