我希望有一个关于独立管理帧内几何的例子,并编写下面的代码,使其具有方格旗状的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中查看我的代码,我也很高兴。
答案 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")
根据经验(为了清晰起见),您应该始终提供行号和列号。这样做可以消除窗口小部件放置位置的所有歧义。