解决tkinter Treeview仅显示文本不显示图片的问题
Treeview列无法显示图片,仅显示pyimageX文本的问题
我实现了一个通过Socket接收消息更新客户端状态的Treeview组件,当前需求是:收到"CLOSED:"、"AWAKE:"或"NFD:"前缀的消息时,为对应客户端的"Activity"列设置红灯(redlight.png)、绿灯(greenlight.png)、黑灯(blacklight.png)图片。
但实际测试中,无论用原生tkinter.PhotoImage还是PIL.ImageTk.PhotoImage加载图片,Treeview的"Activity"列都只显示类似pyimage2的文本,终端无任何报错,且确认图片文件存放在程序同目录下。
核心代码实现
import tkinter as tk from tkinter import ttk as tick import socket from threading import Thread from PIL import ImageTk as itk import PIL.Image from tkinter import PhotoImage import traceback class GUI2(cust.CTk): # 二级窗口,非根窗口 def __init__(self, a, b, c, d, e): self.PORT = a self.SERVER = b self.ADDRESS = c self.FORMAT = d self.host = e self.master2 = cust.CTkToplevel() self.columns = ("name", "status", "activity") self.clientlist = tick.Treeview(self.clientframe, columns = self.columns, show = "tree") self.clientlist.grid(row = 0, column = 0, sticky = "nswe") self.clientlist.column("#0", minwidth = 0, width = 10, stretch = False) self.clientlist.column("name", minwidth = 0, width = 140, stretch = False) self.clientlist.column("status", minwidth = 0, width = 140, stretch = False) self.clientlist.column("activity", minwidth = 0, width = 140, stretch = False) self.red = PhotoImage(file = "redlight.png") self.green = PhotoImage(file = "greenlight.png") self.black = PhotoImage(file = "blacklight.png") self.thread = Thread(target = self.initreceiver) self.thread.start() def initreceiver(self): try: while True: self.message = self.host.recv(1024).decode(self.FORMAT) if "NAME:" in self.message: x = self.message.replace("NAME:", "") # 提取客户端名称 # 插入新行,以客户端名称作为iid self.clientlist.insert("", cust.END, iid = x, values = x) elif "CLOSED:" in self.message: x = self.message.replace("CLOSED:", "") # 提取客户端名称 self.clientlist.set(x, "Status", "Eyes are closed") self.clientlist.set(x, "Activity", self.red) # 尝试设置红灯图片 elif "AWAKE:" in self.message: x = self.message.replace("AWAKE:", "") self.clientlist.set(x, "status", "Eyes are open") self.clientlist.set(x, "activity", self.green) # 尝试设置绿灯图片 elif "NFD:" in self.message: x = self.message.replace("NFD:", "") self.clientlist.set(x, "status", "No Face Detected") self.clientlist.set(x, "activity", self.black) # 尝试设置黑灯图片 except Exception: print (traceback.format_exc())
尝试过的图片加载方式(同样无效)
self.temp = PIL.Image.open("redlight.png") self.red = itk.PhotoImage(self.temp) self.temp2 = PIL.Image.open("greenlight.png") self.green = itk.PhotoImage(self.temp2) self.temp3 = PIL.Image.open("blacklight.png") self.black = itk.PhotoImage(self.temp3)
目前程序能正常接收消息并更新文本状态,但图片始终无法显示,仅显示pyimageX格式的文本,求可行的解决方法或替代实现方案。
内容的提问来源于stack exchange,提问作者N. Tanaka
相关产品推荐
相关产品推荐

