如何解决我无法将图像加载到 tkinter 标签
代码如下(我希望你能理解我糟糕的编码风格,哈哈):
from tkinter import *
import random
from PIL import Image,ImageTk
window = Tk(className="dice simulator")
window.geometry("600x600")
picture_open = Image.open(r"/home/dan/dice1.png")
picture_resize = picture_open.resize((200,200))
picture = ImageTk.PhotoImage(picture_resize)
def throw():
number = random.randint(1,6)
if number == 1:
dice["image"] = picture
background = Label(window,bg="#000000",height=60,width=80)
background.pack()
background.pack_propagate(0)
buttonx1 = Button(window,text="throw 1x",command=throw)
buttonx1.pack()
buttonx1.pack_propagate(0)
buttonx1.place(x=255,y=475)
dice = Label(window,height=12,width=20,bg="#ffffff")
dice.pack()
dice.pack_propagate(0)
dice.place(x=220,y=150)
window.mainloop()
我尝试了很多事情,如您所见,我设置了标签的高度和宽度,并使用了 pack_propagate 函数,但它仍然无法正常工作:D
我建议您尝试运行它,我希望您能理解所有内容,如果没有,我将尝试回答所有问题:) 感谢您的回答
Stackoverflow 仍然说我的帖子主要是代码,我不知道我还应该在这里写什么,哈哈,我希望这就足够了。
我试图缩小它并出现在标签中,但标签变小了,所以问题是标签缩小
解决方法
我注意到了这个问题(在您的代码的其他“问题”中(其中一些我已经提到过)),您为标签设置了 width
和 height
,而没有图像,这些数字被视为字体大小和内容的字符,当您分配图像时,这些数字被视为像素,因此最简单的方法是从 width
中删除 height
和 Label
参数,就这样(最简单的选择):
dice = Label(window,bg="#ffffff")
总的来说,我建议进行这些改进(仅与您的代码进行比较):
from tkinter import Tk,Label,Button
import random
from PIL import Image,ImageTk
window = Tk(className="dice simulator")
window.geometry("600x600")
picture_open = Image.open(r"pause_btn.png")
picture_resize = picture_open.resize((200,200))
picture = ImageTk.PhotoImage(picture_resize)
def throw():
number = random.randint(1,6)
if number == 1:
dice.config(image=picture)
background = Label(window,bg="#000000")
background.place(x=0,y=0,relwidth=1,relheight=1)
buttonx1 = Button(window,text="throw 1x",command=throw)
buttonx1.place(x=255,y=475)
dice = Label(window,bg="#ffffff")
dice.place(x=220,y=150)
window.mainloop()
快过去:
- 不要在不是框架或窗口的东西上使用
.<manager>_propagate()
- 每个小部件仅使用一个布局管理器
- 我添加了如何添加合适的背景图片(至少在这种情况下,请注意
relwidth
和relheight
以及该.place()
方法中的其他内容) - 添加已解决的当前问题
编辑 1: 我强烈建议在导入某些内容时不要使用通配符 (*
),您应该导入您需要的内容,例如from module import Class1,func_1,var_2
等或导入整个模块:import module
然后您也可以使用别名:import module as md
或诸如此类的东西,关键是不要导入所有内容,除非您确实知道你在做什么;名称冲突是问题所在。
编辑 2:这是我建议为这种情况存储图像的方式:
image_dct = {1: picture_1,2: picture_2}
然后你可以像这样访问它们:
def throw():
number = random.randint(1,6)
dice['image'] = image_dct[number]
(如果你还没有完成字典,请注意关键错误)
另一个奇特的事情是这样做:
image_dct = {key: ImageTk.PhotoImage(Image.open(value).resize((200,200))) for key,value
in enumerate([f'path/to/image_{img_number}' for img_number in range(amount_of_images)])}
正如@TheLizzard 建议的那样,您也可以使用元组(因为它们更快、占用空间更少,并且实际上不需要修改这些):
image_list = tuple(ImageTk.PhotoImage(Image.open(image).resize((200,200))) for image
in (f"path/to/image_{img_number}" for img_number in range(amount_of_images)))
关于 tuples
的另一个小说明:为了访问,您可以像这样使用 sth:
def throw():
number = random.randint(1,6)
dice['image'] = image_list[number - 1] # -1 because first item has index 0 and the range starts from 1
在这里,您将所有图像存储在一个位置(目录),并且所有图像都将像这样命名(例如)(相应地更改第一个图像名称的范围):
“图像_1” “图像_2” “图像_3”
这将使在运行时将所有这些图像添加到字典中并为它们分配正确的键变得非常容易,从而使添加更多图像和内容变得非常容易
有任何问题,一定要问
,看看用 dice["image"] = picture
替换 dice.config(image = picture)
是否有任何作用。如果没有,我将不得不对此进行更多研究。
编辑:好的,所以我的提示没有做任何事情。对不起。无论如何,您可以做的其他事情是使用 tkinter.PhotoImage
而不是 PIL.ImageTk
。它更有可能与 tkinter
小部件一起使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。