2016-07-05 53 views
0

我想将小图像和其他小部件放在显示图像的画布上。我试过了诸如compound等选项。在tkinter的画布上添加小部件

背景图片很好,我想放在背景图片上的小图像显示很好,但它始终是窗口的顶部或底部。我希望它被放置在背景图像的任何区域。我已经尝试了所有几何管理器(包,网格,地方)的许多选项,但没有一个可行。请帮帮忙,这里是我的代码:

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

你为什么不创建第一个图像的方式吗?使用'create_image'可以让你把第二个图像放在你想要的任何地方。 –

+0

@Bryan谢谢你的建议,但当我这样做时背景图像会消失。是由于垃圾收集问题?如果是这样,如何防止它。任何帮助将非常感激。 –

回答

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() 

我试图把相同的行和列的值给控件在网格(),我希望把在图像的方法,它工作得很好,因为我想要:-)

0

你有没有考虑使用paste方法,它可以让你通过一个盒子参数定义粘贴图像的位置?

请参阅http://effbot.org/imagingbook/imagetk.htm

请再看看这个主题:Tkinter, overlay foreground image on top of a background image with transparency,这与您的问题看起来非常相似。

+0

感谢您的时间和帮助,但我有PIL模块的问题。口译员说没有名为PIL的模块。该怎么办 ? –

+0

不客气。 PIL代表Python Imaging Library,更多信息请见http://effbot.org/imagingbook/pil-index.htm,您需要安装它。另外检查[枕头](https:// python-pillow。org /),这是为Python 3版本维护的PIL分支。 – Tttt1228

+0

并且非常感谢你。如果可能,我会尝试并通知您;-) –

0

您正在寻找在画布上绘制小部件,这意味着您必须将画布指定为父小部件,而不是像您那样指定root。为此,修改lo = Label(root, image=login)lo = Label(canvas, image=login)

另外,不要忘记指定要定位不同小部件的行和列。这意味着您需要编写例如lo.grid(row=0, column=0)而不是lo.grid()。目前你没有看到很大的问题,因为你只有一个标签小部件。但是,如果您尝试添加其他小部件而未提及确切的位置(行和列),则会得到意想不到的结果。

+0

当我修改程序,如您所说,背景图像消失。我认为你是对的,但又有错误让背景图像消失。我究竟做错了什么 ?非常感谢您的帮助:-) –

+0

如果它消失,这意味着'login'图像大于您为'bgImg'设置的区域,它是370 x 330.标签'lo'伸展以适应其内容是你的情况下的'登录'图像。 –

+0

另外:你准备在哪里显示'登录'图像? –

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()