ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 网络编程 >> Python教程 >> python库tkinter、pygame中几点需要注意的问题

python库tkinter、pygame中几点需要注意的问题

来源:网络整理     时间:2016-03-23     关键词:

本篇文章主要介绍了"python库tkinter、pygame中几点需要注意的问题",主要涉及到方面的内容,对于Python教程感兴趣的同学可以参考一下: 恍然之间已经16年快四月份了,已经好久都没有写过东西了。。最近在用python做一些小的游戏,在网上找了一些Python库,Python中游戏编程最常用的还是p...

恍然之间已经16年快四月份了,已经好久都没有写过东西了。。

最近在用python做一些小的游戏,在网上找了一些Python库,Python中游戏编程最常用的还是pygame了,其次是Tkinter

pygame的话是专门用来写一些小的游戏的库,非常好用。

这里想说的主要是关于他的事件处理,在pygame中他的事件处理主要通过一个事件队列进行处理。

    while True:
        screen.blit(image_board, (0, 0))
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            if event.type == MOUSEBUTTONDOWN:
                mouse_position = pygame.mouse.get_pos()
                world.answer_mouse(mouse_position)
        world.render()
        pygame.display.update()

这里是一个小的demo中主程序中的一部分,整体通过一个while死循环,在死循环中通过update函数进行不断的画面更新,并且在获取事件时,通过for循环遍历事件队列,这里用的是get函数,另外还有wait函数,这其中的区别可以从字面上去理解,wait是要通过等待一个事件产生后进行处理,可能会有卡顿的感觉

这里我是要处理鼠标的点击事件,很明显get函数的效果要更好,wait函数的适用范围,我也不是很了解

这里可以看到,如果使用pygame的话是要通过自己声明的while死循环,显示的进行事件的处理与画面的更新

另外,关于Tkinter库,他主要用来进行GUI的绘制,但其实也不是非常好用,但功能上还是挺全面的。前两天看到网上有人写关于贪食蛇的小的demo,但切入的角度主要的算法,自己对算法还是不怎么在行,主要就说下关于Tkinter中进行游戏编写的一些问题

tk = Tk()


def start():
    snake_game = SnakeGame(tk, 500)
    tk.mainloop()

class SnakeGame(object):
    def __init__(self, tk, speed):
        self.food = (randint(0, 20), randint(0, 20))
        self.speed = speed
        self.snake = Snake()
        self.tk = tk
        self.button = Button(tk, text="start game!", command=self.run)
        self.canvas = Canvas(tk, width=410, height=410, bg="black")
        self.button.pack()
        self.canvas.pack()
        self.tk.bind("<KeyPress-Up>", self.up_event)
        self.tk.bind("<KeyPress-Down>", self.down_event)
        self.tk.bind("<KeyPress-Right>", self.right_event)
        self.tk.bind("<KeyPress-Left>", self.left_event)

    def run(self):
        if self.snake.eat(self.food):
            eat_flag = 1
            self.food = None
        else:
            eat_flag = 0
        self.snake.move(eat_flag)
        if self.not_over():
            self.canvas.delete("all")
            self.draw_food()
            self.draw_snake()
            self.tk.after(self.speed, self.run)
        else:
            r = tkMessageBox.showinfo("Oh,game over!")
            if r == "ok":
                sys.exit()

这里是自己前两天写贪食蛇小的demo的部分程序,用的是Tkinter,其中并没有发现有显示的while主循环,但在主程序中出现了一个mainloop的函数,同时在Snake类的run方法里有tk.after的函数

在Tkinter中如果要进行画面的绘制要通过Tk.canvas进行绘制,但如果要进行画面的时刻更新则要通过tk.after()函数

这个函数接受两个参数,第一个是经过多少毫秒执行,第二个是想要执行的函数名

这里一定要注意一个问题,第二个参数最好不要加括号,就是写成self.run,而不是self.run(),开始时笔者是加括号的,但是程序一直无法运行,显示递归超出范围,在网上查了下,Python的递归是有深度限制的,大概900多。但如果去掉(),就没有这样的问题,是不是类似于javascript中的函数立即执行的方式

第二点要注意的是,要在你要执行的函数底部加上tk.after()函数,不能只在主函数中调用after函数,这样只会执行一次。

另外,在Tkinter中对于事件的处理是要通过绑定到界面来进行的,类似于SnakeGame.__init__(),将KeyPress事件通过bind函数绑定到tk上,再通过mainloop主循环进行事件的处理,但同时mainloop循环也控制着Tkinter整个窗口的生命周期,即如果不执行mainloop循环,Tkinter窗口会关闭,即使有tk.after()函数的执行。

即mainloop函数中有着事件处理的循环和Tkinter窗口生命周期的控制

总体来看编写游戏上,还是pygame的条理更为清晰一些,更好用一些

下面是笔者的github地址,有一些小的demo和以前做电赛的程序

https://github.com/nishilv2

以上就介绍了python库tkinter、pygame中几点需要注意的问题,包括了方面的内容,希望对Python教程有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_502693.html

相关图片

相关文章