为什么需要传递行号?

时间:2017-10-30 04:30:23

标签: python tkinter

我希望有一个关于独立管理帧内几何的例子,并编写下面的代码,使其具有方格旗状的GUI。

将tkinter导入为tk

# a class that has 2 columns of frames inside
class TwoFrames(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)

        # creates 2 frame objects and passes self as parent, which
        # means object created using TwoFrames class is the parent
        self.frame1 = tk.Frame(self)
        self.frame2 = tk.Frame(self)

        #manages 2 frames geometry
        self.frame1.grid(column=0, sticky="nsew")
        self.frame2.grid(column=1, sticky="nsew")

        # enables resizing for 0th row, and 1st and 2nd columns of an
        # object of this class
        tk.Grid.rowconfigure(self, 0, weight=1)
        tk.Grid.columnconfigure(self, 0, weight=1)
        tk.Grid.columnconfigure(self, 1, weight=1)


class TwoLabels(tk.Frame):
    def __init__(self, master=None, color=True):
        super().__init__(master)

        #creates 2 Label objects with TwoLabels object as parent
        self.label1 = tk.Label(self)
        self.label2 = tk.Label(self)

        # configures the background color of labels for demonstrative
        # purposes
        if color:
            #label1 will have red color
            self.label1.configure(bg="black")
            #label2 will have blue color
            self.label2.configure(bg="white")
        else:
            #label1 will have blue color
            self.label1.configure(bg="white")
            #label2 will have red color
            self.label2.configure(bg="black")


        # manages the geometry
        self.label1.grid(row=0, sticky="nsew")
        self.label2.grid(row=1, sticky="nsew")

        # enables resizing like above, but this time for 2 rows and 1
        # column
        tk.Grid.rowconfigure(self, 0, weight=1)
        tk.Grid.rowconfigure(self, 1, weight=1)
        tk.Grid.columnconfigure(self, 0, weight=1)


# creates the mainWindow
mainWindow = tk.Tk()

# creates a mainFrame that has 2 frames in it
mainFrame = TwoFrames(mainWindow)

# manages geometry of mainFrame and display it
mainFrame.pack(fill="both", expand=True)

# creates row_labels1 and row_labels2, both has 2 colored labels inside
row_labels1 = TwoLabels(mainFrame.frame1, True)
row_labels2 = TwoLabels(mainFrame.frame2, False)

# manages geometry of labels inside frames and displays them
row_labels1.pack(fill="both", expand=True)
row_labels2.pack(fill="both", expand=True)

# run the application
mainWindow.mainloop()

但具有讽刺意味的是,代码产生了一个方格旗,在第二行有一个垂直的一半,好像我正在尝试做的是不可能的。后来我改变了;

#manages 2 frames geometry
self.frame1.grid(column=0, sticky="nsew")
self.frame2.grid(column=1, sticky="nsew")

部分

#manages 2 frames geometry
self.frame1.grid(row=0, column=0, sticky="nsew")
self.frame2.grid(row=0, column=1, sticky="nsew")

它按照我的预期工作。我很高兴它有效但是;

  • 我不确定几何体是否至少在该类上进行管理 基础与否。是吗?

  • 传球是什么,我认为它等于我传球, 行号改变了吗?

如果您可以在Code Review中查看我的代码,我也很高兴。

1 个答案:

答案 0 :(得分:1)

  

我不确定几何体是否至少在类别基础上进行管理。是吗?

几何管理永远不会在课堂上进行管理。几何管理基于小部件本身的父/子结构。如果类中的小部件是类的子级(例如:类是一个框架),那么是的,管理可以被视为在类的基础上完成。 Tkinter不了解或关心你的类结构,它只关心widget父/子关系。

  

传递的是什么,我认为它等于我传递的内容,行数会改变?

你的假设是假的。如果您没有指定行,则每次调用grid时,它会自动递增1。

换句话说,这个:

self.frame1.grid(column=0, sticky="nsew")
self.frame2.grid(column=1, sticky="nsew")

...在功能上与此相同(密切注意每行中row的值):

self.frame1.grid(row=0, column=0, sticky="nsew")
self.frame2.grid(row=1, column=1, sticky="nsew")

虽然如果您没有指定列,即使多次调用grid,默认情况下也会等于0。换句话说:

self.label1.grid(row=0, sticky="nsew")
self.label2.grid(row=1, sticky="nsew")

在功能上与此相同(注意每一行中的column):

self.label1.grid(column=0, row=0, sticky="nsew")
self.label2.grid(column=0, row=1, sticky="nsew")

根据经验(为了清晰起见),您应该始终提供行号和列号。这样做可以消除窗口小部件放置位置的所有歧义。