在Tkinter中有任何小部件之前,我可以设置网格配置吗?

时间:2017-05-30 05:16:25

标签: python tkinter

假设我有一个包含5个小部件的框架,并使用grid方法来管理位置:

enter image description here

到目前为止,这么好。但是,如果我现在想要制作这样的东西(使用错误的方法获得),那该怎么办呢?

enter image description here

即。按钮horizontal settings跨越4行。如果我能够以这种方式设置网格配置(例如):grid(ncols = 1, nrows = 5)然后我会执行类似button.columnconfigure(0,weight=4)label.columnconfigure(0,weight=1)的操作。

如何解决这个问题?

我将解释为什么这不是一个小问题。这是因为这两组小部件(在第一个图和第二个图中)位于不同的框架中。所以第一帧有5行而第二帧只有2.并且小部件不会对齐:

enter image description here

编辑: 这是我的代码:

class StartPage(tk.Frame):

  def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller

    labelFrame = tk.Frame(self)
    labelFrame.pack(fill='x', side="top")
    startLabel = tk.Label(labelFrame, 
                          text="Start page")
    startLabel.pack(pady=10)

    quitFrame = tk.Frame(self)
    quitFrame.pack(fill='x',side="bottom")
    quitButton = tk.Button(quitFrame, text="Quit",
                           command=quit,
                           bg="pink")
    quitButton.pack(pady=10)

    operateFrame = tk.Frame(self)
    operateFrame.pack()

    channelGroup = tk.Frame(operateFrame) 
    channelGroup.grid(row=0, column=0, sticky = 'n')
    chLabel = tk.Label(channelGroup,
                       text="Channel group")
    chLabel.grid(pady=10)

    ch1Button = tk.Button(channelGroup, text="CH1 Settings",
                          command=lambda: controller.show_frame("CH1"))
    ch1Button.grid(row=1, column=0)

    ch2Button = tk.Button(channelGroup, text="CH2 Settings",
                          command=lambda: controller.show_frame("CH2"))
    ch2Button.grid(row=2, column=0)

    ch3Button = tk.Button(channelGroup, text="CH3 Settings",
                          command=lambda: controller.show_frame("CH3"))
    ch3Button.grid(row=3, column=0)

    ch4Button = tk.Button(channelGroup, text="CH4 Settings",
                          command=lambda: controller.show_frame("CH4"))
    ch4Button.grid(row=4, column=0)


    triggerGroup = tk.Frame(operateFrame)
    triggerGroup.grid(row=0, column=1, sticky='n')
    trigLabel = tk.Label(triggerGroup,
                         text="Trigger group")
    trigLabel.grid(row=0,column=0,pady=10)
    trigButton = tk.Button(triggerGroup, text="Trigger Settings",
                           command=lambda: controller.show_frame("Trigger"))
    trigButton.grid()

    horizGroup = tk.Frame(operateFrame)
    horizGroup.grid(row=0, column=2, sticky='n')
    horizLabel = tk.Label(horizGroup,
                          text="Horizontal group")
    horizLabel.grid(pady=10)
    horizButton = tk.Button(horizGroup,
                            text="Horizontal settings",
                            command=lambda: controller.show_frame("Horizontal"))
    horizButton.grid()

之后我得到:

enter image description here

1 个答案:

答案 0 :(得分:1)

首先,您的示例不完整。要解决这个问题,我需要运行它;我很好,但我不够用眼睛进行调试。你要我写一堆样板文件。发布完整的代码段;包括进口和入口点。

要解决您的问题,您只需告诉框架,行和按钮,使用sticky='ns'rowconfigure(1, weight=1)扩展到所有可用的垂直空间。

horizGroup = tk.Frame(operateFrame)
horizGroup.grid(row=0, column=2, sticky='ns')
horizGroup.rowconfigure(1, weight=1)
horizLabel = tk.Label(horizGroup,
                      text="Horizontal group")
horizLabel.grid(pady=10)
horizButton = tk.Button(horizGroup,
                        text="Horizontal settings",
                        command=lambda: controller.show_frame("Horizontal"))
horizButton.grid(sticky='ns')