tkinter Label加载图片时标签收缩且图片不显示问题求助
问题根因
- 对同一组件同时调用
pack()和place()两种布局方法,place会完全覆盖pack的配置,你为pack布局设置的pack_propagate(0)完全不生效 pack_propagate()方法仅作用于使用pack布局的父容器,用来控制父容器是否随子组件尺寸自动调整,给按钮、普通显示用Label这类没有子组件的控件调用该方法没有任何意义- Label的
height、width属性在文本模式下单位为字符宽高,切换为图片模式后默认会忽略这两个配置,自动适配图片尺寸。当你使用的图片尺寸小于你配置的字符单位宽高换算后的像素值时,Label会自动缩小适配图片,就是你观察到的标签大幅收缩的情况。
修复方案
直接保留place布局,去掉冗余的pack、pack_propagate调用,既可以让Label自动适配你调整好的200*200的图片尺寸,也可以通过place方法指定固定宽高保证控件尺寸不会变化。
修改后的可运行代码如下:
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) # 后续可自行补充其余5个骰子面的图片赋值逻辑 if number == 1: dice["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) # 不需要额外设置宽高,Label会自动适配200*200的图片尺寸 dice = Label(window, bg="#ffffff") # 调整place坐标适配200*200的图片,保证骰子在窗口居中显示 dice.place(x=200, y=150) window.mainloop()
补充说明
如果需要同时在Label上显示文本和图片,可以给Label添加compound=CENTER参数,即可同时保留自定义尺寸、文本、图片三者的显示效果。
内容的提问来源于stack exchange,提问作者Dan Šafránek
相关产品推荐
相关产品推荐

