【问题标题】:Why is my canvas and/or my photoimage not displaying?为什么我的画布和/或我的照片图像不显示?
【发布时间】:2017-11-05 02:46:45
【问题描述】:

我不知道为什么我的画布没有显示。有一个对它的引用,self._screen,它是packed,但它根本不显示。我错过了什么?

class Map(Frame):

    def __init__(self, size):

        Frame.__init__(self)
        self.pack()

        #images
        self.spriteDimension = 20
        self.img1 = PhotoImage(file="Terrain1.gif")
        self.img2 = PhotoImage(file="Terrain2.gif")

        #grid
        self._mapSize = size
        # self._grid = self.randomize()

        #canvas
        canvas_dimension = self._mapSize * self.spriteDimension

        self._screen = Canvas(self, width=canvas_dimension, height=canvas_dimension)
        self._screen.pack()

        self.test()

    def test(self):
        print("in here")
        self._screen.create_image((50,50), anchor = NW, image = self.img1)
        print("out here")

def main():

    m =Map(20);
    m.mainloop(20);

【问题讨论】:

  • 删除mainloop的参数:即使用m.mainloop()。你也不需要结束分号,但它们不会伤害任何东西,
  • 抱歉,我忘了把那个错误改掉

标签: python class canvas tkinter widget


【解决方案1】:

据我所知,您有一些问题。 与其他编程语言不同,您不会在代码行末尾使用;。您不需要将m = Map(20)root.mainloop() 放在函数中。您还需要定义一个 tkinter 窗口,因此将 root = Tk() 添加到程序的开头。看看下面的代码,如果有不明白的地方请告诉我。

from tkinter import *

root = Tk()

class Map(Frame):

    def __init__(self, size):

        Frame.__init__(self)
        self.pack()

        self.spriteDimension = 20
        self.img1 = PhotoImage(file="Terrain1.gif")
        self.img2 = PhotoImage(file="Terrain2.gif")

        self._mapSize = size

        canvas_dimension = self._mapSize * self.spriteDimension

        self._screen = Canvas(self, width=canvas_dimension, height=canvas_dimension)
        self._screen.pack()

        self.test()

    def test(self):
        print("in here")
        self._screen.create_image((50,50), anchor = NW, image = self.img1)
        print("out here")

m = Map(20)
root.mainloop()

【讨论】:

  • 非常感谢!帮助很大,但我确实有一个问题。在某个时间点,我的画布在没有根的情况下工作(我不记得确切的条件)那么,实例化根的目的是什么?
  • 好的,所以对于 tkinter,您开始构建您的 GUI,方法是创建主顶层窗口以使用 Tk() 将所有内容放入其中,然后在您的 GUI 代码底部您必须调用一次 mainloop()。这样做的原因是监视 GUI 中发生的所有事件,以便可以与之交互和更新事物。它有点像程序的一个大循环,因此得名。看看这个link。还有更多关于mainloop()的信息
猜你喜欢
  • 2021-03-30
  • 2015-11-29
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
相关资源
最近更新 更多