Python:Tkinter未显示我的图片或界面

1 投票
1 回答
693 浏览
提问于 2025-04-18 14:41

我正在尝试创建一个用户界面,想在右上角放一张图片。以下是我的代码:

import tkinter as tk
import urllib.request
import base64 as b64

class my_ui(tk.Tk):
    def __init__(self, parent):
        tk.Tk.__init__(self,parent)
        self.parent=parent
        self.intialize()

    def intialize(self):
        self.grid()

        #Welcome
        label = tk.Label(self,text="Welcome to my UI", anchor='center',fg='white',bg='blue')
        label.grid(column=0,row=0,columnspan=2,rowspan=2,sticky='EW')

        #Buttons
        button = tk.Button(self,text="Button 1",command=self.OnButtonClick)
        button.grid(column=0,row=3,sticky='W')

    def OnButtonClick(self):
        print("You clicked the button!")

if __name__ == "__main__":
    app = my_ui(None)

    #Logo URL - just a smiley face
    URL = "https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQCItlNQe0QaiuhkADUwgVTpx-Isaym6RAP06PHkzBe2Yza3a4rYIkHuB8"
    u = urllib.request.urlopen(URL)
    raw_data = u.read()
    u.close()
    b64_data = b64.encodestring(raw_data)
    photo = tk.PhotoImage(data=b64_data)

    logo = tk.Label(app, image=photo)
    logo.image = photo                  # To save it in memory
    logo.pack()                         # If I exclude this line, UI works fine.
    app.title('My User Interface')
    app.mainloop()

我从网上获取一个.gif格式的图片,并通过我的函数返回一个PhotoImage对象。当我运行这个代码时,没有出现错误,但我的tkinter窗口根本不显示。如果我把评论中提到的那行代码去掉,用户界面就能正常显示(有按钮,但没有图片),而且也没有错误。

我不太明白窗口不出现到底意味着什么。我在Mac OSx上运行的是Python 3.4.1。任何帮助都非常感谢!

1 个回答

0

当一个 tk.PhotoImage 对象被垃圾回收时,图像就像被“释放”了一样。虽然技术上来说这个图像仍然在使用中,所以并没有被彻底销毁,但它会完全变成空白。你可以把你的 return 这一行替换成:

photo = tk.PhotoImage(data=b64_data)
return photo

记得把 photo 声明为全局变量哦。

撰写回答