【问题标题】:Is there any way to display an image over a button in tkinter canvas?有没有办法在 tkinter 画布中的按钮上显示图像?
【发布时间】:2018-11-13 18:41:55
【问题描述】:

有没有办法在 tkinter 画布中显示图像,以便它出现在同一个 tkinter 画布中创建的按钮上?我的代码如下所示:

从 tkinter 导入 *

root = Tk()

canvas = Canvas(root, bg="red")
button = Button(canvas, text="Example")
image = PhotoImage(file="image")

canvas.pack()
button.grid(row=0, column=0)
canvas.create_image(0, 0, image=image)

root.mainloop()

但是,这仅显示按钮而不显示图像。我该如何解决这个问题?

注意:该解决方案必须使用 Python 自带的默认模块(因此没有 PIL),因为该程序需要在我无法下载其他模块的环境中使用。

【问题讨论】:

    标签: python canvas tkinter


    【解决方案1】:

    您可以添加图像作为按钮的一部分(使用imagecompound 选项)。您还可以使用place 在按钮上放置带有图像的标签。另一种选择是创建一个带有图像的标签作为画布项,只要它在堆叠顺序中高于按钮即可。

    但是,您不能做的是创建与小部件重叠的画布对象,因为小部件在画布上始终具有最高的堆叠顺序。

    canonical tk documentation 是这么说的:

    画布中的项目是为了显示而排序的,首先显示显示列表中的第一个项目,然后是列表中的下一个项目,依此类推。显示列表中较晚的项目掩盖了显示列表中较早的项目,有时被称为在较早项目的“顶部”。当一个新项目被创建时,它被放置在显示列表的末尾,在其他所有项目之上。小部件命令可用于重新排列显示列表的顺序。

    窗口项目是上述规则的一个例外。底层窗口系统要求它们始终绘制在其他项目之上。此外,窗口项的堆叠顺序不受任何画布小部件命令的影响;您必须改用 raise 和 lower Tk 命令。

    【讨论】:

    • 窗口是否由堆叠在按钮顶部的画布创建?
    • @MilanTom:它们遵循小部件的标准规则 - 具有较高堆叠顺序的小部件出现在具有较低堆叠顺序的小部件之上。
    • 那么,我可以通过在 Canvas 创建的窗口中创建图像来使用它来覆盖 Button 上的图像吗?
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2021-12-25
    • 2021-12-31
    相关资源
    最近更新 更多