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

CustomTkinter/Tkinter中图片显示过小问题求助

CustomTkinter图片显示异常问题修复

问题描述

使用CustomTkinter(含标准Tkinter测试)时遇到图片显示异常:图片仅能在弹窗中显示为几像素大小,尝试将图片设为全局变量、绑定为self属性、加入全局列表均无效;调整image.resize()、框架尺寸甚至移除框架,都无法将图片缩放至合适大小。

原问题代码

import sys, os
import customtkinter as tk
import tkinter.ttk as ttk

currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir)

def init(top, gui, *args, **kwargs):
    global w, top_level, root
    w = gui
    top_level = top
    root = top

def destroy_window():
    global top_level
    top_level.destroy()
    top_level = None

def vp_start_gui():
    global val, w, root
    root = tk.CTk()
    top = crc_main_window (root)
    init(root, top)
    root.mainloop()

w = None
def create_crc_main_window(rt, *args, **kwargs):
    global w, w_win, root
    root = rt
    w = tk.CTkToplevel (root)
    top = crc_main_window (w)
    init(w, top, *args, **kwargs)
    return (w, top)

def destroy_crc_main_window():
    global w
    w.destroy()
    w = None

class crc_main_window:
    def __init__(self, top=None):
        _bgcolor = '#d9d9d9'
        _fgcolor = '#000000'
        _compcolor = '#d9d9d9'
        _ana1color = '#d9d9d9'
        _ana2color = '#ececec'

        top.geometry("392x300+607+367")
        top.minsize(120, 1)
        top.maxsize(3604, 1061)
        top.resizable(0,  0)
        top.title("test window")
        top.configure(background="#d9d9d9")

        def max_power():
            self.max_power_top = tk.CTkToplevel(root)
            self.max_power_top.title("Max Power Transmission")
            self.max_power_top.geometry("372x351+607+367")
            self.max_power_top.resizable(0, 0)

            self.max_frame = tk.CTkFrame(self.max_power_top)
            self.max_frame.place(x=3,y=3,height=345,width=366)

            from PIL import ImageTk, Image
            self.image1 = Image.open(os.path.join(currentdir,'max_power_trans.PNG'))
            self.image1 = self.image1.resize((322, 301))
            self.image = tk.CTkImage(self.image1)
            self.label1 = tk.CTkLabel(self.max_frame,image=self.image)
            self.label1.place(x=0,y=0,width=322,height=301)
            self.label1.configure(text="")

        from tkinter import Menu
        menubar = Menu(top)
        top.config(menu=menubar)
        file_menu = Menu(menubar,tearoff=False)
        file_menu.add_command(label='Max Power Reference',command=max_power)
        file_menu.add_command(label='Exit',command=root.destroy)
        menubar.add_cascade(label="File",menu=file_menu,underline=0)

if __name__ == '__main__':
    vp_start_gui()

修复方案

问题核心在于CustomTkinter的CTkImage需要显式指定size参数,仅通过PIL的resize()无法让CTkLabel正确识别图片尺寸。同时修正弹窗父窗口引用,避免层级错误,可优化布局方式简化代码:

修改要点:

  1. 创建CTkImage时添加size参数,与PIL resize后的尺寸一致
  2. 将弹窗的父窗口从全局root改为当前窗口top,确保窗口层级正确
  3. 用pack布局替代place,自动匹配容器尺寸,无需手动设置坐标和大小

完整修复代码

import sys, os
import customtkinter as tk
import tkinter.ttk as ttk

currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir)

def init(top, gui, *args, **kwargs):
    global w, top_level, root
    w = gui
    top_level = top
    root = top

def destroy_window():
    global top_level
    top_level.destroy()
    top_level = None

def vp_start_gui():
    global val, w, root
    root = tk.CTk()
    top = crc_main_window (root)
    init(root, top)
    root.mainloop()

w = None
def create_crc_main_window(rt, *args, **kwargs):
    global w, w_win, root
    root = rt
    w = tk.CTkToplevel (root)
    top = crc_main_window (w)
    init(w, top, *args, **kwargs)
    return (w, top)

def destroy_crc_main_window():
    global w
    w.destroy()
    w = None

class crc_main_window:
    def __init__(self, top=None):
        _bgcolor = '#d9d9d9'
        _fgcolor = '#000000'
        _compcolor = '#d9d9d9'
        _ana1color = '#d9d9d9'
        _ana2color = '#ececec'

        top.geometry("392x300+607+367")
        top.minsize(120, 1)
        top.maxsize(3604, 1061)
        top.resizable(0,  0)
        top.title("test window")
        top.configure(background="#d9d9d9")

        def max_power():
            self.max_power_top = tk.CTkToplevel(top)
            self.max_power_top.title("Max Power Transmission")
            self.max_power_top.geometry("372x351+607+367")
            self.max_power_top.resizable(0, 0)

            self.max_frame = tk.CTkFrame(self.max_power_top)
            self.max_frame.pack(fill="both", expand=True, padx=3, pady=3)

            from PIL import ImageTk, Image
            self.image1 = Image.open(os.path.join(currentdir,'max_power_trans.PNG'))
            self.image1 = self.image1.resize((322, 301))
            self.image = tk.CTkImage(self.image1, size=(322, 301))
            self.label1 = tk.CTkLabel(self.max_frame, image=self.image, text="")
            self.label1.pack(fill="both", expand=True)

        from tkinter import Menu
        menubar = Menu(top)
        top.config(menu=menubar)
        file_menu = Menu(menubar,tearoff=False)
        file_menu.add_command(label='Max Power Reference',command=max_power)
        file_menu.add_command(label='Exit',command=root.destroy)
        menubar.add_cascade(label="File",menu=file_menu,underline=0)

if __name__ == '__main__':
    vp_start_gui()

内容的提问来源于stack exchange,提问作者Devin Gardner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:45:35