【发布时间】:2015-10-22 14:42:29
【问题描述】:
我正在开发一个简单的 tkinter 程序,并尝试创建一个回调函数,该函数将获取一个图像(使用 PIL 导入并存储为类属性)并在单击相应按钮时将其绘制在画布上。每次点击都应该创建一个新的 Bacteria 对象,这反映在画布上创建一个新图像(在实际程序中,新对象也被附加到一个数组中,并在稍后的程序执行中使用——这里的代码是简化)。
以下运行没有错误(除了用于发布的虚假文件名导致的文件未找到错误),但不幸的是,单击按钮时画布上没有绘制任何图像。当图像被导入并存储为 MainWindow 类的属性时,代码按预期工作 - 它似乎只在作为 Bacteria 类的属性导入/存储时失败。
import tkinter as tk
import random
from PIL import Image
from PIL import ImageTk
class MainWindow(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent, background = "white")
self.pack()
self.canvas_height = 500
self.canvas_width = 1000
self.canvas = tk.Canvas(self, height = self.canvas_height, width = self.canvas_width)
self.canvas.grid(row = 0, column = 0)
self.launch_button = tk.Button(self, text = "Haz clic!", width = 25, command = self.callback)
self.launch_button.grid(row = 1, column = 0, sticky = "W")
def callback(self):
test_bact = Bacteria()
x_pos = random.randint(0,1000)
y_pos = random.randint(0,500)
self.canvas.create_image(x_pos, y_pos, image = test_bact.imageTk)
class Bacteria:
def __init__(self):
self.image = Image.open('testBacterium.png')
self.imageTk = ImageTk.PhotoImage(image=self.image)
root = tk.Tk()
app = MainWindow(root)
app.mainloop()
我对此感到有些困惑。任何人都可以就出了什么问题提供任何见解吗?
【问题讨论】:
-
test_bact 是函数本地的,垃圾收集也是如此,当然类中的所有内容也会消失。使用 self.test_bact 使其在函数返回后保留。