【问题标题】:Canvas - Create an image item above tkinter widgetsCanvas - 在 tkinter 小部件上方创建一个图像项
【发布时间】:2021-11-05 13:00:33
【问题描述】:

我使用放置在画布上的条目和按钮准备了一个简单的示例。我希望当我按下按钮时出现的图像(面板)(create_image)出现在按钮和条目上方(以覆盖它),但是当创建图像时,它在按钮和条目下创建(面板)。我该如何解决这个问题?谢谢...

from tkinter import*
from PIL import Image, ImageTk

w=Tk()

canvas =Canvas(width = 800, height = 800)
canvas.place(relx=0,rely=0)

background= Image.open("light.jpg").resize((700,700))
background=ImageTk.PhotoImage(background)

alert_panel= Image.open("alert_panel.png").resize((500,300))
panel=ImageTk.PhotoImage(panel)

canvas.create_image(0,0,image=background,anchor=NW)

def login():
    alert=canvas.create_image(100,200,image=alert_panel,anchor=NW)

entry=Entry(fg="black",bg="light gray")
entry.configure(highlightbackground="black", highlightcolor="black")
entry.insert(0,"Username:")
entry.place(relx=0.2,rely=0.17)

buton1=Button(text="L O G I N",highlightbackground="black",command=login)
buton1.place(relx=0.33,rely=0.27)

w.mainloop()

使用的图片: background image

alert_panel image

【问题讨论】:

  • 现在您正在创建小部件并将其放置在Canvas 上。尝试将tkinter.Label 用于alert_panel

标签: python tkinter canvas


【解决方案1】:

这实际上是不可能的,但是您可以创建一个函数,然后单击按钮时,您可以在按钮的位置和要创建的图像之间切换。如下所示:

def login():
    button1.place_forget()
    entry.place_forget()
    canvas.create_image(100,200,image=alert_panel,anchor=NW)

注意: 我选择.place_forget() 使按钮和条目从主窗口中消失。(这只是一个技巧,但我认为它会回答你的问题)

【讨论】:

  • button1.place_forget() 会好很多。
  • @Ayyoub ESSADEQ 感谢您的回答,您的回答合乎逻辑、简单且有用,但我的这些代码只是一个简单的示例。在复杂的程序中使用这个过程不会导致任何问题,不是吗?它会减慢速度吗?
  • 我不这么认为,因为.place_forget()是一个内置函数,应该尽可能优化。
  • (如果您觉得我的回答有帮助,请将其指定为有用。非常感谢 :))
【解决方案2】:

如果图像是使用.create_image(...) 在画布内创建的,则基本上您不能将警报图像放在其他小部件之上。

建议创建一个无边框透明Toplevel 以显示警报图像:

def login():
    #alert=canvas.create_image(100,200,image=alert_panel,anchor=NW)
    top = Toplevel(w)
    top.withdraw()
    top.overrideredirect(1) # make border-less window
    # make it like a transparent window
    trans_color = '#deaded'  # select a color not used by the alert image
    top.attributes('-transparentcolor', trans_color)
    # show the alert image
    alert = Label(top, image=panel, bg=trans_color)
    alert.pack()
    # put the popup at the center of root window
    top.update()
    x, y = w.winfo_rootx(), w.winfo_rooty()
    rw, rh = w.winfo_width(), w.winfo_height()
    tw, th = top.winfo_width(), top.winfo_height()
    top.geometry(f"+{x+(rw-tw)//2}+{y+(rh-th)//2}")

    top.bind('<Button-1>', lambda _: top.destroy()) # just a way to close the popup
    top.deiconify()
    top.grab_set()

请注意,此行有拼写错误:

panel=ImageTk.PhotoImage(panel)

可能如下:

panel = ImageTk.PhotoImage(alert_panel)

【讨论】:

  • 首先感谢您的回复。我将您的代码添加到我自己的代码中,但得到 _tkinter.TclError:'bad attribute "-transparentcolor": must be -alpha, -topmost, -zoomed, -fullscreen, or -type' 我用 top.attributes('- alpha', trans_color) 但是这次我得到了这样的错误:_tkinter.TclError: expected floating-point number but got "#deaded" 我该怎么办,对不起,我还是个初学者。
  • @dest -transparentcolor 仅在 Windows 中受支持。所以我的建议对你不起作用。
  • 我了解情况。感谢您的回复和关注。
猜你喜欢
  • 2015-02-06
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多