在tkinter中在画布上添加小部件

时间:2016-07-05 12:16:36

标签: python tkinter

我想在显示图像的画布上放置一个小图像和其他小部件。我尝试过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()

4 个答案:

答案 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还具有以下行为:包含窗口小部件(例如:您的画布)将缩小或扩展以完全适合其内容。

这是一个在背景图片上创建多个小部件的版本。请注意packgrid选项的使用,以及使用grid_rowconfiguregrid_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()方法中的小部件中,我希望将其放在图像上,并且它可以正常工作: - )