我是一名高中编程学生,我有一个小问题。我的任务是用Tkinter编写一个简单的游戏,一个冰柱从天花板上掉下来,你必须用鼠标来避免它。很简单。然而,我遇到了一个问题。每当我在Tkinter应用程序中运行循环时,它都不会打开。我试过用for循环每隔0.5秒暂停一次时间。睡觉()循环一结束,窗口就会打开。我需要做一些特殊的工作吗?在
from Tkinter import *
import time
import random
class App:
def __init__(self, parent):
self.frame = Frame(root, bg= '#1987DF', width=800, height=800)
self.frame.bind("<Motion>", self.motionevent)
self.frame.pack()
#self.run()
def randhex(self):
b = "#"
for i in range(1, 7):
a = random.randint(0, 15)
if a == 10:
a = "A"
elif a == 11:
a = "B"
elif a == 12:
a = "C"
elif a == 13:
a = "D"
elif a == 14:
a = "E"
elif a == 15:
a = "F"
b = b+str(a)
return b
def motionevent(self, event):
xpos, ypos, bg = event.x, event.y, self.randhex()
str1 = "X : %d Y : %d BG : %s" % (xpos, ypos, bg)
root.title(str1)
x,y, delta = 100, 100, 10
self.frame.config(bg=bg)
def run(self):
for i in range(0, 10):
time.sleep(.5)
print 'i'
self.frame.config(bg=self.randhex())
root = Tk()
app = App(root)
root.mainloop()
目前它所要做的就是在鼠标移动时改变背景。当init中的行自行运行()未加注释,它将打印“i”10次,然后窗口将打开。帮忙吗?在
编写基于事件的程序不同于编写传统程序。已经有一个无限循环在运行,就像任何无限循环一样,如果你把另一个循环放在里面,外部循环在内部循环结束之前不能继续。由于外部循环会导致屏幕刷新和事件被处理,所以内部循环会有效地冻结应用程序,直到它们完成为止。在
因为已经有一个循环正在运行,所以不需要创建另一个循环。您只需向事件队列中一次添加一个小作业。实际上,每个作业都是内部循环的一次迭代。在
例如,如果要编写这样的内部循环:
。。。相反,您应该将一个事件添加到事件队列中,并且每次事件循环迭代(或者更准确地说,每次它处理完任何其他事件时),它都将执行循环的一次迭代。你这样做:
^{pr2}$然后,在您第一次调用
do_one_iteration
之后,它将把自己的下一次迭代放在事件队列上,并继续这样做,直到它决定完成为止。在通常,当用户按下一个按钮(例如“开始”按钮)时,您会调用
do_one_iteration
。调用它一次,然后它做一点工作(即:将冰柱向下移动几个像素),然后重新安排自己。在在游戏开发中,您可能有一个名为
update_display
的函数,它负责重新绘制所有内容。例如,它可以从每个冰柱的Y坐标中减去1。您可以为左右箭头添加绑定以移动播放器(通过增加或减少X坐标),更新函数将使用这些新坐标来重新绘制播放器。在顺便说一句,您可以使用}在稍有延迟后调用函数,从而降低程序的速度。这个延迟可以用来控制帧速率。例如,假设更新几乎是即时的(在您的情况下可能是这样),用41(毫秒)的参数调用
after
而不是{after
将产生大约24 fps的帧速率(24帧乘以41毫秒等于984毫秒,或大约每秒24帧)这听起来可能很复杂,但实际上只要你做一两次就很容易了。在
相关问题 更多 >
编程相关推荐