网络编程
位置:首页>> 网络编程>> Python编程>> Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法

Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法

作者:98237982379  发布时间:2021-08-12 00:40:33 

标签:Python,Tkinter,按钮

        Bug如题目所描述。尝试过将按钮的image指向的变量del_icon设置为global全局变量,但是不成功,会提示如“

AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'

”的错误。代码1是导致bug的源头。

        代码1:


#!/bin/env python3
from PIL import ImageTk
import tkinter as tk
...
self.del_button = tk.Button(self.frame, text='DEL', width=20, height=20)
self.del_button.config(image=ImageTk.PhotoImage(resize(os.getcwd() + '/delete.png', 0)))
self.del_button.bind('<Button-1>', self.delete_selected_image)
self.del_button.grid(row=0, column=0, sticky=tk.W)

Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法

        结果删除按钮不显示image,按钮上显示空白:

Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法 del_button的image不显示

        尝试将del_button的image指向的变量设置为局部变量,即下面所展示的代码2。

        代码2:


#!/bin/env python3
from PIL import ImageTk
import tkinter as tk
...
self.del_button = tk.Button(self.frame, text='DEL', width=20, height=20)
del_icon = ImageTk.PhotoImage(resize(os.getcwd()+'/delete.png', 0))
self.del_button.config(image=del_icon)
self.del_button.bind('<Button-1>', self.delete_selected_image)
self.del_button.grid(row=0, column=0, sticky=tk.W)

Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法

        结果删除按钮的image显示正常:

Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法 del_button的image显示正常

         笔记:

                不明所以的bug。判断潜在原因是:GC的问题。image属性需要指向明确的内存地址。方法返回的临时变量地址调用后即被回收,导致image指向空地址。


        resize()的代码:


#!/bin/env python3
from PIL import Image

def resize(path):
   image = Image.open(path)
   raw_width, raw_height = image.size[0], image.size[1]
   min_height = 20
   min_width = int(raw_width * min_height / raw_height)
   return image.resize((min_width, min_height))

来源:https://blog.csdn.net/qq_21264377/article/details/119523050

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com