我想在显示图像的画布上放置一个小图像和其他小部件。我尝试过compound
等其他选项。
背景图片很好,我想要放在背景图像上的小图像显示很好,但它总是在窗口的顶部或底部。我希望它被放置在背景图像的任何区域。我已经尝试了所有几何管理器(包,网格,地点)的许多选项,但它们都不起作用。请帮忙,这是我的代码:
from Tkinter import *
root = Tk()
root.iconbitmap('E:/a.ico')
root.title('Unick Locker')
canvas = Canvas(root, width=730, height=600)
canvas.grid()
bgImg = PhotoImage(file="E:/a.gif")
canvas.create_image(370, 330, image=bgImg)
login = PhotoImage(file="E:/login.gif")
lo = Label(root, image=login)
lo.grid()
root.mainloop()
答案 0 :(得分:0)
您是否考虑使用paste
方法,该方法允许您通过方框参数定义粘贴图像的位置?
请参阅http://effbot.org/imagingbook/imagetk.htm。
请同时查看此主题:Tkinter, overlay foreground image on top of a background image with transparency,这与您的问题非常相似。
答案 1 :(得分:0)
您希望在画布上绘制小部件,这意味着您必须将画布指定为父小部件,而不是像您那样指定root
。为此,请将lo = Label(root, image=login)
修改为lo = Label(canvas, image=login)
另外,不要忘记指定要放置不同窗口小部件的行和列。这意味着您需要编写lo.grid(row=0, column=0)
而不是lo.grid()
。目前您没有看到大问题,因为您只有一个标签小部件。但是,如果您尝试添加其他窗口小部件而不提及确切位置(行和列),则会得到意外结果。
答案 2 :(得分:0)
这个问题根本不是图像,它只是一个基本的布局问题。无论是否有图像,您都会遇到同样的问题。问题很简单,你没有给网格任何选项,所以它自然会把东西放在最顶层。 Tkinter还具有以下行为:包含窗口小部件(例如:您的画布)将缩小或扩展以完全适合其内容。
这是一个在背景图片上创建多个小部件的版本。请注意pack
和grid
选项的使用,以及使用grid_rowconfigure
和grid_columnconfigure
来指定额外空间的分配方式。
from Tkinter import *
root = Tk()
canvas = Canvas(root, width=730, height=600)
canvas.pack(fill="both", expand=True)
bgImg = PhotoImage(file="E:/a.gif")
canvas.create_image(370, 330, image=bgImg)
l1 = Label(canvas, text="Hello, world")
e1 = Entry(canvas)
t1 = Text(canvas)
l1.grid(row=0, column=0, sticky="ew", padx=10)
e1.grid(row=1, column=1, sticky="ew")
t1.grid(row=2, column=2, sticky="nsew")
canvas.grid_rowconfigure(2, weight=1)
canvas.grid_columnconfigure(2, weight=1)
root.mainloop()
答案 3 :(得分:0)
为了在任何背景图像或画布上添加任何小部件或前景,所有小部件的行和列值必须与背景图像相同。所以,我上面提到的程序是这样的:
from Tkinter import *
root = Tk()
root.iconbitmap('E:/a.ico')
root.title('Unick Locker')
canvas = Canvas(root, width=730, height=600)
canvas.grid(row=0, column=0)
bgImg = PhotoImage(file="E:/a.gif")
canvas.create_image(370, 330, image=bgImg)
login = PhotoImage(file="E:/login.gif")
lo = Label(root, image=login)
lo.grid(row=0, column=0)
root.mainloop()
我尝试将相同的行和列值放在grid()方法中的小部件中,我希望将其放在图像上,并且它可以正常工作: - )