我正在编写一个自定义 Python 类,它简化了与 tkinter 的交互,因此我可以简化编写自己的 GUI 应用程序的过程。到目前为止,这很棘手,但进展一直很稳定,而且效果很好。
但是,我遇到了特定的意外行为,无法查明原因。当我将元素定义为具有 rowspan 时,它不会扩展以适合我指定的行数。
这是我当前输出的屏幕截图:
Python tkinter rowspan 没有正确调整元素大小-LMLPHP
屏幕截图中的 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
  • 带有“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
    
    任何想法为什么会发生这种情况?当我对 rowspan 进行硬编码时,它仍然表现出这种行为。

    最佳答案

    所以你想要这样的东西:

    Python tkinter rowspan 没有正确调整元素大小-LMLPHP

    这是代码:

    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 参数使框架垂直拉伸(stretch)并填充由 rowspan 指定的行。

    如果您删除标签周围的边框和框架的背景颜色,您将得到:

    Python tkinter rowspan 没有正确调整元素大小-LMLPHP

    关于Python tkinter rowspan 没有正确调整元素大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34366068/

    10-12 19:38