【问题标题】:Tkinter canvas PhotoImage is not appearingTkinter 画布 PhotoImage 没有出现
【发布时间】:2017-10-01 00:00:14
【问题描述】:

我的代码有问题。我正在创建一个名为 Lumanite 的小型视频游戏。我已经创建了主页并开始生成图形,但我遇到了一个错误。我正在使用 Python 3.3,并且在 Win 10 笔记本电脑上。我通过一个运行文件运行程序,该文件访问使用单独文件 spritesclasses 中列出的类的 main_game 文件。我正在尝试使精灵出现。这是 main_game 文件和 spritesclasses 文件的代码。 (他们从 MENU 文件中导入画布和根目录)

#SPRITES
from tkinter import *
from GUI_FILE import canvas, root
from OPENING_FILE import show, hide

class Sprite():
     def __init__(self, photoplace):
          self.orgin = photoplace
          self.photo = PhotoImage(file=photoplace)
          self.w = self.photo.width()
          self.h = self.photo.height()
     def draw(self):
          self.sprite = canvas.create_image(self.h, self.w, image=self.photo)

还有 MAIN_GAME 文件:

#Main Game File:
from tkinter import *
from OPENING_FILE import show, hide
from GUI_FILE import root, canvas
from spritesclasses import *


def start_game():
      genterrain()

def genterrain():
       test = Sprite("logo.gif")
       test.draw()

并且精灵没有出现。没有错误或任何东西。请帮我。我会在另行通知时向您提供信息。

【问题讨论】:

    标签: python python-3.x tkinter tkinter-canvas


    【解决方案1】:

    这是一个已知但棘手的问题。您可以在Why do my Tkinter images not appear? 中阅读有关它的信息,我在下面实现了一种可能的解决方案:

    from tkinter import *
    
    class Sprite():
        def __init__(self, photoplace):
            self.photo = PhotoImage(file=photoplace)
            self.w = self.photo.width()
            self.h = self.photo.height()
            self.sprite = None
    
        def draw(self):
            canvas = Canvas(root, width=self.w, height=self.h)
            canvas.pack()
            self.sprite = canvas.create_image(0, 0, anchor=NW, image=self.photo)
    
    def start_game():
        genterrain()
    
    def genterrain():
        sprite = Sprite("logo.gif")
        sprite.draw()
        sprites.append(sprite)  # keep a reference!
    
    root = Tk()
    
    sprites = []
    
    start_game()
    
    root.mainloop()
    

    分配self.photo = PhotoImage(file=photoplace) 不是一个足够的引用,因为当genterrain() 返回时对象test 超出范围并与您的图像一起被垃圾收集。您可以通过注释掉 sprites.append(sprite) 行来测试这一点,然后看到您的图像再次消失。

    另外,不清楚为什么要将图像定位在它自己的宽度和高度——create_image() 的第一个参数是 X 和 Y 位置。我将画布创建移至 draw(),因此我可以根据图像调整画布的大小,但这不是可见性修复的要求。

    【讨论】:

    • 非常感谢。我真的需要那个。
    猜你喜欢
    • 1970-01-01
    • 2020-03-21
    • 2019-04-28
    • 2023-02-02
    • 2013-07-19
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多