Python 为什么widget.pack(side=Left)将新的小部件放到右边?

Python 为什么widget.pack(side=Left)将新的小部件放到右边?,python,canvas,tkinter,Python,Canvas,Tkinter,旧标题:如何正确删除cavas项 我的问题是,每次我想在画布上加载新图像并删除旧图像时,它都会将新图像放在旧图像之前所在的空间旁边。 我的代码如下所示: def load_to_canvas(fname, canvas): img = Image.open(fname) canvas.imgph = ImageTk.PhotoImage(img) l = Label(canvas, image=canvas.imgph) l.photo = canvas

旧标题:如何正确删除cavas项

我的问题是,每次我想在画布上加载新图像并删除旧图像时,它都会将新图像放在旧图像之前所在的空间旁边。 我的代码如下所示:

def load_to_canvas(fname, canvas):
    img = Image.open(fname)
    canvas.imgph = ImageTk.PhotoImage(img)
    l = Label(canvas, image=canvas.imgph)
    l.photo = canvas
    l.pack(side=LEFT)
我尝试了各种选项,比如将其中一个放在load_to_canvas函数的顶部:

canvas.delete('all')
canvas.get_tk_widget.delete('all')
l.pack_forget()
或者将变量设置为零

我的画布是用以下函数声明的:

def create_canvas(self, canvasframe):
    canvasframe.canvas = Canvas(canvasframe, width=200, height=200)
    canvasframe.canvas.pack(expand=1, fill=BOTH)
    return canvasframe.canvas

def create_canvasframe(self):
    canvasframe = Frame(self)
    canvasframe.grid(row=1, column=0, columnspan=2, rowspan=4,
                        padx=0, sticky=E+W+S+N)
    return canvasframe
正如你可能会看到的,我对特金特很陌生。具体来说,我的问题是,旧图片被删除了,但新图片不是放在上面,而是放在旁边

编辑: 我发现了问题。它是将“def load_to_canvas”中的标签最后一行打包到最左边的空间。不知何故,即使删除了旧图像,新图像的最左侧位置仍然位于旧图像的右侧。使用“grid.row=0,column=0,sticky=E+W+S+N”将其更改为绝对位置,效果良好


这使得我在标题中提出的问题不再准确,所以我改变了它。希望没问题。

我有点困惑。您想在画布的空间内绘制图像吗?进一步:当你说我想在画布上加载一个新图像并删除旧图像时,-是不是更进一步,你想创建一个动画,或者鼠标悬停,或者复选框点击和关闭-画布中的新图像应该完全取代之前的图像,取而代之的是,程序画布应该只显示一张图片。当通过“打开文件”对话框加载新图片时,它应该替换旧图片。旧照片不一定要删除,只是要消失。但只是“过度渲染”旧图片不起作用,新图片出现在旧图片旁边,因此我认为需要一个删除命令。下班后我会试试布莱恩的建议。。。