画布中可滚动的帧列表。删除框架后,空间将添加到列表末尾

时间:2015-07-13 21:19:38

标签: python python-3.x tkinter python-3.4 tkinter-canvas

这是我自己无法解决的一个问题。这是:

我有一个可滚动的框架列表,这些框架都放在一个更大的框架内,然后将其打包在画布中。代码如下:

### begin canvas/frame/picture 
self.picFrame = Frame(self, width = 450, height = 300)

self.picFrame.grid_rowconfigure(0, weight = 1)
self.picFrame.grid_columnconfigure(0, weight = 1)
self.picFrame.pack()

self.canvas = Canvas(self.picFrame, width = 450, height = 300)
self.canFrame = Frame(self.canvas)

self.canvas.create_window((0,0), window = self.canFrame, anchor = 'nw')
self.canvas.pack(side="left")

我创建了一个包含所有好东西的框架,然后将该框架放入self.canFrame

self.itemFrame = Frame(self.canFrame, width = 450, height = 50)
self.itemFrame.grid(row = i, column = 0)
self.itemFrame.pack_propagate(0) 

我也有一些我在画布上调用的方法来让它正确滚动。它们如下:

def setFrame(self, event = None):
    """ Sets the canvas dimensions and the scroll area """
    self.canvas.configure(scrollregion = self.canvas.bbox('all'))


def setScroll(self):
    ##### part of another function #######
    # create frame to hold scrollbar so we can
    # use grid on the scrollbar
    self.scrollFrame = Frame(self.picFrame)

    # set rows and column configures so we can
    # make scrollbar take up entire row/column
    self.scrollFrame.rowconfigure(1, weight = 1)
    self.scrollFrame.columnconfigure(1, weight = 1)
    self.scroll = AutoScrollbar(self.scrollFrame,
                            orient = "vertical",
                            command = self.canvas.yview)

    # set scrollbar as callback to the canvas
    self.canvas.configure(yscrollcommand = self.scroll.set)

    # set the scrollbar to be the height of the canvas
    self.scroll.grid(sticky = 'ns', row = 1, column = 0)

    # set the scrollbar to be packed on the right side

    self.scrollFrame.pack(side="right", fill="y")

    # bind the picture frame to the canvas
    self.picFrame.bind("<Configure>", self.setFrame) 

我还有一个列表,其中包含我放入画布的所有帧, 并且每个框架内都有一个复选框,因此我可以检查是否选中了该框以及是否要删除它。当我删除框架时,我会调用以下内容:

self.frames[i].destroy()

并且该索引与我要销毁的包含所有好东西的itemFrame相对应。

当我删除一个框架时,我觉得我缺少调整大小或从另一个可能仍然记得的小部件中删除该框架。它。这一切都很好,但删除itemFrames时,我遇到了问题。我已经尝试了很长一段时间来解决这个问题,但似乎无法做到这一点。从这里开始的任何提示或指示都会很棒。我也为这是一个代码繁重的帖子道歉,我不确定需要与否。谢谢你的支持。

干杯!

编辑/更新:

我忘了提到我正在使用

to_del = self.frames.pop(i)
to_del.destroy()

并重置滚动条(至少据我所知)

self.scroll.destroy()
self.scrollFrame.destroy()
self.setScroll()  # defined up above

即使弹出指定的帧,它仍会保留引用吗? 另外,它可以以某种方式一直到self.picFrame吗?那用来拿着画布。如果我删除self.frames列表中的所有项目,并尝试再次更新列表,则不会显示任何图像。

编辑 - 同时调整了&#39; pack&#39;在上面的句子中。不应该对这种用法粗心大意。

1 个答案:

答案 0 :(得分:0)

您已使用self.frames[i].destroy()销毁了该框架,但该引用仍存在于self.frames中。要从list中删除引用,请使用del self.frames[i]