在Tkinter中使用滚动画布时,包含框架的列将被剪切掉

时间:2014-09-21 10:45:05

标签: python canvas scroll tkinter

我正在尝试创建一个包含许多表的Tkinter小部件,这些表当前是使用.grid方法填充条目的框架,可以通过按下按钮来切换。我目前尝试使用以下代码:

from tkinter import *

def dot(root, num):
    root.subframe.destroy()
    root.subframe = TFrame(root, num)

root = Tk()

vscrollbar = Scrollbar(root,orient='vertical')
vscrollbar.grid(row=1,column=2,sticky=N+E+W+S)

root.defaultframe = MainFrame(root)
root.canvas = Canvas(root, yscrollcommand=vscrollbar.set)
root.subframe = Frame(root.canvas)
vscrollbar.config(command=root.canvas.yview)
root.canvas.grid(row=1,column=0)
root.subframe.grid(row=0,column=0)

其中MainFrame具有以下结构:

class MainFrame(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.grid(row=0,column=0)
        b1 = Button(self, text='table 1', command=lambda: dot(root, 0))
        b2 = Button(self, text='table 2', command=lambda: dot(root, 1))
        b1.grid(row=0, column=0, sticky=N+E+W+S)
        b2.grid(row=0, column=1, sticky=N+E+W+S)

和TFrame:

class TFrame(Frame):
    def __init__(self, foor, num):
        Frame.__init__(self, root.canvas)
        for i in range(12):
            self.grid_columnconfigure(i, minsize=50)
        for x in range(12):
            for y in range(20):
                label = Label(self, text=num)
                label.grid(row=y,column=x,sticky=N+E+W+S)
        root.canvas.create_window((0,0),window=self,anchor='nw')
        root.canvas.configure(scrollregion=root.canvas.bbox('all'))

当我运行代码时,按下按钮会加载表格,这些表格按预期在垂直方向滚动。但无论窗口的大小如何,只有前8列左右可见。通过添加空标签等来更改MainFrame的宽度不会影响创建的TFrame的大小,即使它比TFrame最终的8列宽几倍。虽然我可以通过添加水平滚动条和垂直滚动条来获得一些可以忍受的解决方案,但到目前为止,我在tkinter中滚动的经验总体上是负面的,我希望避免以任何可能的方式使用它。

1 个答案:

答案 0 :(得分:1)

好的,找到了解决方案。事实证明,没有列被切断,整个画布被切断,我的所有测试用例恰好都有正确的列数与列宽,看起来像是前8列之后的列被切断了。

更改:

root.canvas.grid(row=1,column=0)

root.canvas.grid(row=1,column=0,sticky=N+E+W+S)

修复了问题。