Python 在Tkinter中有任何小部件之前,我可以设置网格配置吗?
假设我有一个框架,其中包含5个小部件,并使用Python 在Tkinter中有任何小部件之前,我可以设置网格配置吗?,python,tkinter,Python,Tkinter,假设我有一个框架,其中包含5个小部件,并使用grid方法来管理位置: 到目前为止,一切顺利。但是,如果我现在想制作这样的东西(使用不好的方法获得): i、 e.按钮水平设置跨越4行。如果我能够以这种方式设置网格配置(比如:grid(ncols=1,nrows=5),然后我将执行类似于按钮的操作。columnconfigure(0,weight=4)和标签。columnconfigure(0,weight=1) 如何解决这个问题 我将解释为什么这不是一个无关紧要的问题。这是因为这两组小部件(图
grid
方法来管理位置:
到目前为止,一切顺利。但是,如果我现在想制作这样的东西(使用不好的方法获得):
i、 e.按钮水平设置跨越4行。如果我能够以这种方式设置网格配置(比如:grid(ncols=1,nrows=5)
,然后我将执行类似于按钮的操作。columnconfigure(0,weight=4)
和标签。columnconfigure(0,weight=1)
如何解决这个问题
我将解释为什么这不是一个无关紧要的问题。这是因为这两组小部件(图1和图2)位于不同的框架中。因此,第一帧有5行,第二帧只有2行。和小部件将不对齐:
编辑:
这是我的一段代码:
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()
之后我得到:
首先,您的示例不完整。要解决这个问题,我需要运行它;我很好,但我还不足以用肉眼调试。你要我写一大堆样板文件。发布完整的代码片段;包括进口和入境点
要解决问题,只需告诉框架、行和按钮,使用sticky='ns'
和rowconfigure(1,weight=1)
扩展到所有可用的垂直空间即可
每个框架都有自己的网格;其中的行数或列数不影响其他行数或列数。为什么还要手动设置列数和行数?只要让tkinter魔法算出。如果我让tkinter魔法算出,它将在第一帧中显示5行,在第二帧中仅显示2行。小部件将不会对齐。我应该在问题中提到这一点。我明白了。对齐框架不应该与内容有任何关系。你是如何布置这些框架的?如果这些也在网格中,请使用sticky='n'
。如果您向我们提供了重现此问题的方法,我可以向您演示如何修复它。好的。回答你的第一个问题:是的,帧在网格中。正如你所说,我使用了sticky,它对齐了标签。但我希望按钮在每一帧中填充相同的空间。回答你的第二个问题:我在SE上添加了类似问题的链接(我也是OP)。看起来你用肉眼调试还不错。它起作用了。非常感谢。我没有用眼睛调试。我写了10行代码来让你的运行,对此我有点生气。
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')