重复小部件

时间:2016-10-19 09:59:28

标签: python python-2.7 class oop tkinter

我一直在试用OOP与Tkinter一起使用 - 我慢慢地到达那里(我想)......

我想构建一个结构,其中每个帧都由它自己的类处理,包括它的所有小部件和函数。也许我是从错误的角度来的,但这对我来说是最合乎逻辑的。 - 如果您同意/不同意,请随时告诉我!

我知道问题发生的原因 - 当我每次调用每个类__init__时,每次运行并构建相关的小部件,无论它们是否已存在于框架中。但是,我能想到的唯一方法就是在我的主要课程__init__的{​​{1}}中构建每个框架。 - 虽然这似乎是一个混乱和无组织的问题解决方案。

有没有办法可以实现一个结构,每个类都会处理自己的函数和小部件,但每次都不构建框架?

请参阅下面的问题的最小示例:

GUI_Start

随意批评结构,因为我可能试图从错误的角度来解决这个问题!

非常感谢任何反馈! 路加

2 个答案:

答案 0 :(得分:2)

使用类的关键是将一堆行为封装为一个单元。对象不应该修改自身之外的任何东西。至少,不是简单地创建对象 - 你可以拥有可能产生副作用的方法。

在我看来,创建"页面的正确方法"是继承Frame。所有属于"页面的小部件"必须将对象本身作为其父对象。例如:

class PageOne(tk.Frame):
    def __init__(self, parent):
        # use the __init__ of the superclass to create the actual frame
        tk.Frame.__init__(self, parent)

        # all other widgets use self (or some descendant of self)
        # as their parent

        self.label = tk.Label(self, ...)
        self.button = tk.Button(self, ...)
        ...

完成后,您可以将此类的实例视为单个小部件:

root = tk.Tk()
page1 = PageOne(root)
page1.pack(fill="both", expand=True)

如果您的所有网页都有共同点(例如,页眉或页脚),您还可以创建一个基本Page类,并让您的实际页面继承它。

class Page(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        <code common to all pages goes here>

class PageOne(Page):
    def __init__(self, parent):
        # initialize the parent class
        Page.__init__(self, parent)

        <code unique to page one goes here>

答案 1 :(得分:1)

你在这里使用OOP并不合乎逻辑。您的主程序在GUI_start类中。如果您的页面继承自GUI_start,那么基本上您可以使用您创建的每个页面实例创建一个全新的程序。你应该继承自Frame,正如Bryan Oakley在评论中指出的那样。这是您发布的有点修复版本。布莱恩的原创作品还要好得多。

from Tkinter import *

class GUI_Start:

    def __init__(self, master):
        self.master = master
        self.master.geometry('300x300')
        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_columnconfigure(0, weight=1)
        self.win_colour = '#D2B48C'
        self.current_page=0

        self.pages = []
        for i in range(5):
            page = Page(self.master,i+1)
            page.grid(row=0,column=0,sticky='nsew')
            self.pages.append(page)

        for i in range(2):
            page = Page_diff(self.master,i+1)
            page.grid(row=0,column=0,sticky='nsew')
            self.pages.append(page)

        self.pages[0].tkraise()

        def Next_Page():
            next_page_index = self.current_page+1
            if next_page_index >= len(self.pages):
                next_page_index = 0
            print(next_page_index)
            self.pages[next_page_index].tkraise()
            self.current_page = next_page_index

        page1_button = Button(self.master, text='Visit next Page',command = Next_Page)
        page1_button.grid(row=1,column=0)



class Page(Frame):

    def __init__(self,master,number):
        super().__init__(master,bg='#D2B48C')
        self.master = master
        self.master.tkraise()

        page1_label = Label(self, text='PAGE '+str(number))
        page1_label.pack(fill=X,expand=True)



class Page_diff(Frame):

    def __init__(self,master,number):
        super().__init__(master)
        self.master = master
        self.master.tkraise()

        page1_label = Label(self, text='I am different PAGE '+str(number))
        page1_label.pack(fill=X)



root = Tk()
gui = GUI_Start(root)
root.mainloop()