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正确识别图片尺寸。同时修正弹窗父窗口引用,避免层级错误,可优化布局方式简化代码:
修改要点:
- 创建CTkImage时添加
size参数,与PIL resize后的尺寸一致 - 将弹窗的父窗口从全局
root改为当前窗口top,确保窗口层级正确 - 用
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
相关产品推荐
相关产品推荐

