【问题标题】:Python tkinter rowspan not resizing elements correctlyPython tkinter rowspan 未正确调整元素大小
【发布时间】:2015-12-19 00:46:10
【问题描述】:

我正在编写一个自定义 Python 类来简化与 tkinter 的交互,这样我就可以简化编写自己的 GUI 应用程序的过程。到目前为止,这很棘手,但进展一直很稳定,而且效果很好。

但是,我遇到了特定的意外行为,我无法确定原因。当我将一个元素定义为具有行跨度时,它不会扩展以适应我指定的行数。

这是我当前输出的截图:

屏幕截图中的 GUI 是按照指定的顺序定义的:

  • 10 个标签定义为“1”到“10”,在单元格 0,0 - 0,10 中。

  • 添加了一个 rowspan = 1 的框架,其中包含标签“Rowspan 1”到 1,0

  • rowspan = 2 的帧被添加到 2,0

  • rowspan = 3 的帧被添加到 3,0

  • ...

  • 将 rowspan = 10 的帧添加到 10,0

  • 将带有“拉伸后”的标签添加到 11,0

    如您在上面的屏幕截图中所见,行跨度似乎与设置的行跨度不匹配。

以下是相关代码:

    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

任何想法为什么会发生这种情况?当我对 rowspan 进行硬编码时,它仍然表现出这种行为。

【问题讨论】:

  • 您在Frame(self.frame,...) 中使用self.frame 作为父级,但随后您覆盖了此变量self.frame = tkinter.Frame( ... ) - 所以下一个Frame 具有不同的父级。
  • 尝试使用new_frame = tkinter.Frame(self.frame, ... )new_frame.grid(...)

标签: python python-3.x tkinter


【解决方案1】:

所以你想要这样的东西:

代码如下:

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()

通常,框架会拥抱其中的小部件。 grid() 的sticky 参数使框架垂直拉伸并填充由rowspan 指定的行。

如果你移除标签周围的边框和框架的背景颜色,你会得到:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多