【问题标题】:Python - Image not being drawn on canvasPython - 未在画布上绘制图像
【发布时间】:2013-07-20 04:38:41
【问题描述】:

我在 while 语句中有一个语句,它应该在画布上绘制图像,但它没有发生,我不知道为什么,因为它没有显示任何错误。

def buttonclick_gamescreen(event):
    global scorecounter
    global pressed
    global randomimage
    global images
    pressed = ""

    if event.x >853 and event.x <957 and event.y > 8 and event.y < 56 : pressed = 7 
    if event.x >666 and event.x <947 and event.y > 491 and event.y < 534 : pressed = 8
    while pressed == 8 :
        entryx = e1.get()
        entryy = e2.get()
        answerx = answerlistx[randomimage]
        answery = answerlisty[randomimage]
        print("The answer to X is", answerx, "You entered", entryx,"The answer to Y is", answery, "You entered ", entryy)
        if entryx == answerx and entryy == answery:
            print("correct")
            canvas.delete(images)
            randomimage = random.randrange(0,49+1)
            scorecounter = scorecounter + 1
            print("You score is now", scorecounter, "New random number is", randomimage)
            game = PhotoImage(file=imagelist[randomimage])
            images = canvas.create_image(30, 65, image = game, anchor = NW)
            e1.delete(0, END)   
            e2.delete(0, END)
            pressed = ''
        else:
            print("incorrect")
            e1.delete(0, END)   
            e2.delete(0, END)
            pressed = ''

images = canvas.create_image(30, 65, image = game, anchor = NW) 行应该像我在另一种情况下一样工作。

这里是其余代码的链接,因为我不想让这个问题太长太乱,它显示了画布的绘制位置。 http://pastebin.com/RxmPDUAD 根据我现在的理解,我必须创建一个类并从那里调用函数才能使其工作? 编辑:我尝试使用全局变量和类时仍然遇到麻烦。

随机数不是问题,因为我在图像应该打印的行之前打印了它,以防它不起作用但它确实起作用。我做错了什么?

【问题讨论】:

  • 你进入主循环了吗?除非您这样做,否则不会发生任何事情。所有任务本质上都是排队的,主循环将通过任务队列运行并执行任何操作,处理事件等。
  • 我不完全确定这是什么意思,但我猜不是,所以我得去查一下,谢谢你的评论。
  • 我的意思是你在某个地方打电话给canvas.mainloop()? (您提供的代码中没有,但我认为这不是所有代码,因为其中使用了未定义的符号。)
  • @GP89 ​​它在第二个代码块的最后一行,但你是对的:代码不完整,因此很难重现问题。画布是在哪里以及如何创建的?
  • 必须将事件的坐标与一些神奇的数字进行比较是非常不寻常的。您是否知道您可以创建仅在有人单击特定按钮或画布项时触发的事件,这样您就不必猜测单击了哪个小部件?

标签: python image tkinter


【解决方案1】:

在没有实际测试您的代码的情况下,我很确定问题是当您退出该方法时,您的 PhotoImage 对象正在被垃圾收集。出于某种奇怪的原因,仅将它们传递给canvas.create_image 不会阻止这种情况。试着让他们global:

global game
game = PhotoImage(file=imagelist[randomimage])
images = canvas.create_image(30, 65, image = game, anchor = NW)

另请参阅 thisthisthis 相关问题/答案。

更多指点:

  • event.x &gt;853 and event.x &lt;957这样的条件可以写成853 &lt; event.x &lt; 957
  • 您可以将imagelist 定义为["%d.gif" % (i+1) for i in range(50)]
  • after 方法需要以毫秒为单位的时间,所以我猜这应该是after(1000, ...)
  • 在当前状态下,while pressed == 8: 循环似乎没有多大意义,因为无论如何在一次迭代之后pressed 被设置为''
  • 最后,我建议定义一个自定义class GameFrame(Frame) 并将所有这些东西放在那个类中,而不是把所有东西都放在global 中;在这种情况下,您可以使用 self 关键字将您的 PhotoImage 绑定到 Frame 以防止它被垃圾收集

【讨论】:

  • 感谢您的回答,马上查看。
  • 我现在正在尝试学习如何创建一个类以及那些 if 事件是按钮(不是我所知道的最有效的方式。)
  • 对不起,迟到的回复生病了,但我尝试使用一个类并将其设为全局但没有任何成功,我查找了垃圾收集并尝试使用 gc.disable() 将其关闭,但没有太多运气也不错。
  • @ThatsNotMyName 我刚刚来重现您的问题(当您没有图像并且不知道在哪里单击时不容易...),但是当我制作game 图像global。 ——看我的编辑。尽管如此,我还是建议在Codereview 上重新发布这个问题(或其变体),以接收有关如何改进代码的进一步意见。
  • 哦,嗯,行得通,非常感谢,我现在可以开始着手提高代码效率了,感谢您的帮助!
猜你喜欢
  • 2020-04-14
  • 1970-01-01
  • 2018-03-05
  • 2018-12-09
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
相关资源
最近更新 更多