我正在编写一个自定义Python类,它简化了与tkinter的交互,因此我可以简化编写自己的GUI应用程序的过程.到目前为止它一直很棘手,但进展一直很稳定,而且运作良好.
但是,我遇到了特定的意外行为,我无法查明原因.当我定义一个具有行跨的元素时,它不会扩展以适合我指定的行数.
这是我当前输出的屏幕截图:
屏幕截图中的GUI按指定的顺序定义:
在单元格0,0-0,10中,10个标签被定义为"1"到"10".
添加了rowspan = 1的框架,其中包含标签"Rowspan 1"到1,0
rowspan = 2的帧被添加到2,0
将rowspan = 3的帧添加到3,0
...
将rowspan = 10的帧添加到10,0
带有"After Stretched"的标签被添加到11,0
正如您在上面的屏幕截图中看到的那样,rowspan似乎与设置的rowspan不匹配.
这是相关代码:
self.frame = tkinter.Frame(self.frame, borderwidth=1, relief=border) self.frame.grid(row=self.grid_y, column=self.grid_x, columnspan=self.grid_x_span, rowspan=self.grid_y_span, padx=5, pady=5, sticky="nsew") print("Frame:") print("X,Y:",self.grid_x,self.grid_y) print("X,Y Spans:",self.grid_x_span, self.grid_y_span)
...这里是打印输出,显示生成此输出时变量的值:
Frame: X,Y: 1 0 X,Y Spans: 1 1 Frame: X,Y: 2 0 X,Y Spans: 1 2 Frame: X,Y: 3 0 X,Y Spans: 1 3 Frame: X,Y: 4 0 X,Y Spans: 1 4 Frame: X,Y: 5 0 X,Y Spans: 1 5 Frame: X,Y: 6 0 X,Y Spans: 1 6 Frame: X,Y: 7 0 X,Y Spans: 1 7 Frame: X,Y: 8 0 X,Y Spans: 1 8 Frame: X,Y: 9 0 X,Y Spans: 1 9 Frame: X,Y: 10 0 X,Y Spans: 1 10
任何想法为什么会这样?当我对rowpan进行硬编码时,它仍然表现出这种行为.
所以你想要这样的东西:
这是代码:
import tkinter as tk root = tk.Tk() main_frame = tk.Frame(root, border=3, relief=tk.GROOVE) main_frame.grid() for i in range(10): #Create Labels for numbering the rows: tk.Label(main_frame, text=str(i+1), border=1, relief=tk.GROOVE, padx=20, pady=20, ).grid(column=0, row=i) #Create Frames with a Label inside: frame = tk.Frame(main_frame, border=1, relief=tk.GROOVE, background="blue", ) frame.grid(row=0, column=i+1, rowspan=i+1, sticky=tk.N+tk.S) tk.Label(frame, text='Rowspan {}'.format(i+1), border=1, relief=tk.GROOVE, padx=20, pady=20,).grid() root.mainloop()
通常,框架会拥抱其中的小部件.sticky
grid()的参数使框架垂直拉伸并填充rowspan指定的行.
如果删除标签周围的边框和框架的背景颜色,您将得到: