python tkinter画布中使用turtle_关于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()

为什么不像创建第一个图像那样创建第二个图像? 使用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叉子。

再次非常感谢你。如果可能的话,我会尽力通知您;-)


版权声明:本文为weixin_34115768原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。