python tkinter 无法在画布上实现提升方法

Posted

技术标签:

【中文标题】python tkinter 无法在画布上实现提升方法【英文标题】:python tkinter cannot implement lift method on canvas 【发布时间】:2021-05-29 16:08:25 【问题描述】:

我正在尝试在 Python Tkinter 中提升和降低画布对象。我尝试了canvas.lower(),但它导致错误提示

_tkinter.TclError:wrong # args: should be ".!canvas lower tag0rld "belowThis?

我的脚本:

import tkinter as tk
import PIL.ImageTk as itk
window=tk.Tk()
image1=itk.PhotoImage(file=“image_1.png")
canvas1 = tk.Canvas(window)
a=canvas1.create_image(0,0,image=image1)
canvas1.place(x=100,y=100)
canvas1.lower()
image2 = itk.PhotoImage(file=“image_2.png")
canvas2 = tk.Canvas(window)
b = canvas2.create_image(0,0,image=image2)
canvas2.place(x=100,y=130)
window.mainloop()

图像只是一个黑色方块和一个白色方块,所以它们无关紧要。

【问题讨论】:

您是否尝试在画布内列出/降低画布对象(如矩形/线条/...)?或者您可能正在尝试提升/降低整个画布? 请告诉我们您是如何创建画布和图像的。我的猜测是你可以这样做:image_id = <tkinter.Canvas object>.create_image(...) 然后canvas.lower(image_id) @TheLizzard 我的意思是降低整个画布。 【参考方案1】:

降低整个画布:

import tkinter as tk

import tkinter as tk

window = tk.Tk()
canvas1 = tk.Canvas(window, bg="red")
canvas1.place(x=100,y=100)

canvas2 = tk.Canvas(window, bg="blue")
canvas2.place(x=100,y=130)

canvas2.tk.call('lower', canvas2._w, None)

window.mainloop()

root.mainloop()

这直接调用tcl 命令但仍然有效。问题是在tkinter.Canvas的定义中:

class Canvas(Widget, XView, YView):
    ...
    def tag_lower(self, *args):
        """Lower an item TAGORID given in ARGS
        (optional below another item)."""
        self.tk.call((self._w, 'lower') + args)
    lower = tag_lower

它覆盖了Misc 类(所有小部件的基类)方法.lower,它降低了小部件。所以我直接调用了Misc类会调用的东西:self.tk.call('lower', self._w, belowThis)

【讨论】:

@willywillycow 我编辑了我的答案。我想这就是你要找的 为什么不加lift() @willywillycow 使用place() 代替pack() 放置画布。? @willywillycow 我编辑了我的答案试试。我还解释了为什么会发生这种情况 @willywillycow 我不知道在哪里提交错误报告/评论,但这是个好主意。此外,如果这是您正在寻找的答案,请考虑接受它,以免其他人浪费时间提出相同的解决方案。

以上是关于python tkinter 无法在画布上实现提升方法的主要内容,如果未能解决你的问题,请参考以下文章

Python Tkinter 在 GUI 中嵌入 Matplotlib

Python,Tkinter:如何在可滚动画布上获取坐标

Python Tkinter刷新画布

Python Tkinter - 保存画布 - tkinter 崩溃

在 Tkinter Python 中创建全局画布

如何设置 Python tkinter 画布元素的 z 索引?