我想在显示图像的画布上放置一个小图像和其他小部件。 我已经尝试过诸如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()
为什么不像创建第一个图像那样创建第二个图像? 使用create_image将使您可以将第二张图像放置在所需的任何位置。
@Bryan感谢您的建议,但是当我这样做时背景图像消失了。 是由于垃圾收集问题吗? 如果是这样,如何预防。 任何帮助将不胜感激。
为了将任何小部件添加到任何背景图像或画布的上方或前景,所有小部件的行和列值必须与背景图像的行和列值相同。因此,我上面提到的程序将是这样的:
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()方法中的小部件,并且按我的要求可以正常工作:-)
这个问题根本不是关于图像的,它只是一个基本的布局问题。无论有没有图像,您都会遇到相同的问题。问题很简单,您没有给网格任何选择,因此自然而然地将事情放在首位。 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()
您要在画布上绘制小部件,这意味着您必须将画布指定为父小部件,而不是像以前那样指定root。为此,将lo = Label(root, image=login)修改为lo = Label(canvas, image=login)
另外,不要忘记指定要在其中放置不同小部件的行和列。这意味着您需要编写例如lo.grid(row=0, column=0)而不是lo.grid()。目前,您没有看到大问题,因为您只有一个标签小部件。但是,如果您尝试添加其他窗口小部件而未提及确切位置(行和列),则会得到意外的结果。
当我按照您所说的修改程序时,背景图像消失了。我认为应该是对的,但又有错误,这会使背景图像消失。我究竟做错了什么 ?非常感谢您的帮助:-)
如果消失,这表示login图像大于为bgImg设置的区域,即370 x330。标签lo会拉伸以适合其内容,在您的情况下是login图像。
另外:您到底要在哪里显示login图像?
没有。登录图片不大于背景图片。顺便说一句,登录图片显示在角落没有背景图片(有空白空间需要由bg图像占用)。
好吧,我想在左中角显示登录图像,并留一些左边距。
您是否考虑过使用paste方法,该方法允许您通过box参数定义粘贴图像的位置?
参见http://effbot.org/imagingbook/imagetk.htm。
也请看一下这个线程:Tkinter,将前景图像叠加在透明的背景图像上,这似乎与您的问题非常相似。
感谢您的时间和帮助,但是我在PIL模块上遇到了问题。解释器说没有名为PIL的模块。该怎么办 ?
别客气。 PIL代表Python Imaging Library(需要安装的更多信息,位于effbot.org/imagingbook/pil-index.htm)。还要检查枕头,这是为Python 3版本维护的PIL叉子。
再次非常感谢你。如果可能的话,我会尽力通知您;-)