You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Tkinter Canvas窗口显示图片时内容被截断的问题

解决Tkinter Canvas显示图片被截断的问题

问题根源

  • Canvas未设置匹配图片的宽高,默认尺寸过小,导致图片超出部分被截断
  • canvas.create_image的坐标与锚点设置错误,你用imageWidth + 1, imageHeight + 1作为坐标,相当于把图片左上角放在Canvas的右下角区域,大部分内容被挤出可视范围

修复方案

1. 给Canvas设置对应图片的尺寸

创建Canvas时直接传入图片的宽高参数,确保Canvas能容纳整张图片:

canvas = Canvas(window, width=imageWidth, height=imageHeight)

2. 调整图片在Canvas中的定位

使用anchor='nw'设置图片锚点为左上角,同时将坐标设为(0,0),让图片左上角对齐Canvas左上角:

canvas.create_image(0, 0, image=img, anchor='nw')

3. 修正布局调用

原代码中Canvas重复调用pack()方法会导致布局混乱,只保留一次正确的pack调用即可。

完整修复代码

import tkinter as tk
from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import ImageTk, Image


def show_values():
    print(slider1.get())


window = tk.Tk()

filename = askopenfilename()  # 打开文件选择对话框,返回选中文件路径
print(filename)

slider1 = Scale(window, from_=0, to=42, orient='vertical')
slider1.pack(side=LEFT)

# 先加载图片获取尺寸
img = ImageTk.PhotoImage(Image.open(filename))
imageWidth = img.width()
imageHeight = img.height()

# 创建适配图片尺寸的Canvas
canvas = Canvas(window, width=imageWidth, height=imageHeight)
# 让图片左上角与Canvas左上角对齐
canvas.create_image(0, 0, image=img, anchor='nw')
canvas.pack(side=RIGHT)

Button(window, text='处理图片', command=show_values).pack(side=BOTTOM)

# 保留图片引用,避免被垃圾回收机制销毁
window.img = img

window.mainloop()

额外提示

  • 必须保留图片对象的引用(如window.img = img),否则Tkinter会自动回收图片资源,导致Canvas显示空白
  • 若想让窗口自动适配图片与控件的总宽度,可在创建窗口后添加:
window.geometry(f"{imageWidth + slider1.winfo_width()}x{max(imageHeight, 50)}")

内容的提问来源于stack exchange,提问作者Luke-McDevitt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:01:19