Python - 图像不是在画布上绘制的

时间:2013-07-21 09:07:15

标签: python image tkinter

我在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 从我现在的理解,我将不得不创建一个类,并从那里调用函数为此工作? 编辑:我仍然遇到麻烦,因为我尝试使用全局变量和类,没有运气。

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

1 个答案:

答案 0 :(得分:3)

如果没有实际测试过你的代码,我很确定问题是当你退出方法时你的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 >853 and event.x <957之类的条件可以写为853 < event.x < 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以防止垃圾收集