如何为Tkinter窗口添加图片并让窗口自动适配图片尺寸
给Tkinter移动窗口添加背景图片的解决方案
要给Tkinter窗口加背景图片,不能直接给窗口本身设置,得用Label组件承载图片并铺满整个窗口。如果你的图片是PNG/JPG格式,需要先安装Pillow库(原生Tkinter的PhotoImage只支持GIF、PGM/PPM格式)。
步骤1:安装Pillow(如需处理非GIF图片)
打开命令行执行:
pip install pillow
步骤2:修改代码
下面是添加了背景图片功能的完整代码,关键改动都加了注释:
import random from time import sleep from tkinter import * # 导入Pillow模块(如果用GIF图可以注释掉这两行) from PIL import Image, ImageTk x = random.randint(7,20) y = random.randint(7,20) h = random.randint(200,300) w = random.randint(200,300) class Window(Tk): def __init__(self): Tk.__init__(self) self.width = w self.height = h self.velx = x self.vely = y self.pos = (250,250) self.geometry(f"{self.width}x{self.height}+{self.pos[0]}+{self.pos[1]}") # ---- 新增:加载背景图片 ---- # 替换成你的图片路径,比如和代码同目录就写文件名 image_path = "bg_image.png" # 打开图片并调整大小匹配窗口 img = Image.open(image_path).resize((self.width, self.height)) # 转成Tkinter能识别的格式 self.bg_img = ImageTk.PhotoImage(img) # 创建Label承载图片 bg_label = Label(self, image=self.bg_img) # 让Label铺满整个窗口 bg_label.place(x=0, y=0, relwidth=1, relheight=1) # -------------------------- def moveWin(self): x = self.pos[0] + self.velx y = self.pos[1] + self.vely downx, downy = x+self.width, y+self.height sWidth = self.winfo_screenwidth() # 屏幕宽度 sHeight = self.winfo_screenheight() # 屏幕高度 if x <= 0 or downx >= sWidth: self.velx = -self.velx if y <= 0 or downy >= sHeight: self.vely = -self.vely self.pos = (x,y) self.geometry(f"+{x}+{y}") return [x, y, downx, downy] root = Window() while True: root.update() pos = root.moveWin() print(pos) sleep(0.01)
关键说明
- 图片路径:把
image_path改成你实际的图片路径,比如图片和代码在同一个文件夹里,直接写"bg.png"就行。 - 图片保留:必须把图片对象存为实例属性(
self.bg_img),不然Python的垃圾回收会把图片销毁,导致窗口里看不到图片。 - GIF图兼容:如果用GIF格式的图片,可以不用Pillow,把Pillow的导入注释掉,换成下面的代码加载图片:
self.bg_img = PhotoImage(file="bg.gif")
- 窗口大小适配:代码里用
resize((self.width, self.height))把图片调整成和窗口一样大,如果你想让图片按比例缩放,可以去掉这部分,不过可能会有留白或者超出窗口。
内容的提问来源于stack exchange,提问作者G1rby
相关产品推荐
相关产品推荐

