【问题标题】:Possible race-condition when creating images in TKinter?在 TKinter 中创建图像时可能出现竞争条件?
【发布时间】:2014-05-25 20:55:58
【问题描述】:

为了好玩,我正在使用 tkinter 创建一个蹩脚的直升机/flappybird 克隆,我遇到了一些非常奇怪的行为,图像显然没有显示。

(顺便说一句,使用 python3)

所以我从下面的代码开始只是想看看我是否可以开始画东西:

from tkinter import *
from PIL import ImageTk

class Bird(object):
    def __init__(self, canvas, x=0, y=0):
        self.canvas = canvas
        photo = ImageTk.PhotoImage(file="flappy.gif")
        self.bird = self.canvas.create_image(x,y,image=photo)

class Environment(Canvas):
    def __init__(self, master, width=500, height=500):
        super(Environment, self).__init__(master, width=width, height=height)
        self.pack()
        self.master = master
        self.bird = Bird(self)

if __name__=="__main__":
    r = Tk()
    env = Environment(r)
    env.pack()
    r.mainloop()

图片没有出现,我只有一块空白画布。我觉得这很奇怪,所以我开始到处玩,看看为什么会这样。我的下一步是测试我是否知道如何创建图像,所以我只是将我的文件创建为基本图像创建:

if __name__=="__main__":
    r,c=get_canv()
    c.pack()
    img = ImageTk.PhotoImage(file="flappy.gif")
    c.create_image(100,100,image=img)
    r.mainloop()

而且,可以预见的是,这很好用。所以,我在前面代码中的语法似乎是正确的。这是我偶然发现一些令人困惑的事情的时候:

if __name__=="__main__":
    r,c=get_canv()
    c.pack()
    c.create_image(100,100,image=ImageTk.PhotoImage(file="flappy.gif"))
    r.mainloop()

这没有画。我又留下了一张空白的画布。这就是让我怀疑幕后可能存在一些奇怪的线程问题的原因。有谁知道为什么第二个 sn-p 工作而第三个 sn-p 失败?

【问题讨论】:

    标签: python tkinter race-condition


    【解决方案1】:

    我见过numberoftimesalready。问题是PhotoImage 被垃圾收集即使它在Label 中使用!要解决此问题,只需将其绑定到 GUI 本身的成员变量即可:

    self.photo = ImageTk.PhotoImage(file="flappy.gif")
    self.bird = self.canvas.create_image(x,y,image=self.photo)
    

    它在您的第二个示例中起作用的原因是 img 变量在 mainloop 方法完成之前一直存在,而在您的第三个示例中,它仅在创建 Label 期间存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 2017-10-25
      • 1970-01-01
      • 2019-03-02
      • 2017-07-17
      • 2015-06-10
      • 2021-12-06
      相关资源
      最近更新 更多