基于tkinter模块的GUI
GUI是图形用户界面的缩写,图形化的用户界面对使用过计算机的人来说应该都不陌生,在此也无需进行赘述。Python默认的GUI开发模块是tkinter(在Python 3以前的版本中名为Tkinter),从这个名字就可以看出它是基于Tk的,Tk是一个工具包,最初是为Tcl设计的,后来被移植到很多其他的脚本语言中,它提供了跨平台的GUI控件。当然Tk并不是最新和最好的选择,也没有功能特别强大的GUI控件,事实上,开发GUI应用并不是Python最擅长的工作,如果真的需要使用Python开发GUI应用,wxPython、PyQt、PyGTK等模块都是不错的选择。
基本上使用tkinter来开发GUI应用需要以下5个步骤:
- 导入tkinter模块中我们需要的东西。
- 创建一个顶层窗口对象并用它来承载整个GUI应用。
- 在顶层窗口对象上添加GUI组件。
- 通过代码将这些GUI组件的功能组织起来。
- 进入主事件循环(main loop)。
下面的代码演示了如何使用tkinter做一个简单的GUI应用。
import tkinter
import tkinter.messagebox
def main():
flag = True
# 修改标签上的文字
def change_label_text():
nonlocal flag
flag = not flag
color, msg = ('red', 'Hello, world!')\
if flag else ('blue', 'Goodbye, world!')
label.config(text=msg, fg=color)
# 确认退出
def confirm_to_quit():
if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):
top.quit()
# 创建顶层窗口
top = tkinter.Tk()
# 设置窗口大小
top.geometry('240x160')
# 设置窗口标题
top.title('小游戏')
# 创建标签对象并添加到顶层窗口
label = tkinter.Label(top, text='Hello, world!', font='Arial -32', fg='red')
label.pack(expand=1)
# 创建一个装按钮的容器
panel = tkinter.Frame(top)
# 创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数
button1 = tkinter.Button(panel, text='修改', command=change_label_text)
button1.pack(side='left')
button2 = tkinter.Button(panel, text='退出', command=confirm_to_quit)
button2.pack(side='right')
panel.pack(side='bottom')
# 开启主事件循环
tkinter.mainloop()
if __name__ == '__main__':
main()
需要说明的是,GUI应用通常是事件驱动式的,之所以要进入主事件循环就是要监听鼠标、键盘等各种事件的发生并执行对应的代码对事件进行处理,因为事件会持续的发生,所以需要这样的一个循环一直运行着等待下一个事件的发生。另一方面,Tk为控件的摆放提供了三种布局管理器,通过布局管理器可以对控件进行定位,这三种布局管理器分别是:Placer(开发者提供控件的大小和摆放位置)、Packer(自动将控件填充到合适的位置)和Grid(基于网格坐标来摆放控件),此处不进行赘述。
使用Pygame进行游戏开发
Pygame是一个开源的Python模块,专门用于多媒体应用(如电子游戏)的开发,其中包含对图像、声音、视频、事件、碰撞等的支持。Pygame建立在SDL的基础上,SDL是一套跨平台的多媒体开发库,用C语言实现,被广泛的应用于游戏、模拟器、播放器等的开发。而Pygame让游戏开发者不再被底层语言束缚,可以更多的关注游戏的功能和逻辑。
下面我们来完成一个简单的小游戏,游戏的名字叫“大球吃小球”,当然完成这个游戏并不是重点,学会使用Pygame也不是重点,最重要的我们要在这个过程中体会如何使用前面讲解的面向对象程序设计,学会用这种编程思想去解决现实中的问题。
制作游戏窗口
import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显示的窗口并设置窗口尺寸
screen = pygame.display.set_mode((800, 600))
# 设置当前窗口的标题
pygame.display.set_caption('大球吃小球')
running = True
# 开启一个事件循环处理发生的事件
while running:
# 从消息队列中获取事件并对事件进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()
在窗口中绘图
可以通过pygame中draw模块的函数在窗口上绘图,可以绘制的图形包括:线条、矩形、多边形、圆、椭圆、圆弧等。需要说明的是,屏幕坐标系是将屏幕左上角设置为坐标原点(0, 0),向右是x轴的正向,向下是y轴的正向,在表示位置或者设置尺寸的时候,我们默认的单位都是像素。所谓像素就是屏幕上的一个点,你可以用浏览图片的软件试着将一张图片放大若干倍,就可以看到这些点。pygame中表示颜色用的是色光七B
Y]\Y[Y
NBH\BYHHY]\BH
Y]\Y[ZY
NBH\BBYX]
\NBd BY[]H[\[]H[OH\BHHH\HH\CB\[H
H
CBY\[ Y]\\Y]\B[Y]\\Y]\B\[]HH[BY]\HY]\[
\Y]\M
CBBY]Y[NBg*9c"b-BYYK]JY[B
JKY]\
OOB]B.!9BBc*9..+yk(9!c9i!9`&/hy\ylg))9k.n#9az`&/lg)(9!9/cyi:)yi!9e+.g*:/*g,9{`f#i!9o(9!n B]\HHBH\H\NBYXZ[
NBk.byiz(`9"ykyfjB[HBb'yi%kiyYYy.+y(ygeYYK[]
CBb'yi%./cm+c.kY[HYYK\^KJ
JCB+od9!YYK\^K\[ #CB[[HYCBo 9d+*.i!9c'[H[[B.9k%mkc9i!9B][[YYK][
NBY][\HOHYYKURUB[[H[Bi!9o(9!9. CBY][\HOHYYKSU[][]OHNB#ya(9!cyBHH][BY]\H[[
LL
CBH[[
LLL
K[[
LLL
CBH[
CBg*9a(9!cyb& 9.*9i) z`':h:"lfB[H[
KY]\CBl!9b,9b%yfj9.+CB[\[
[
CBY[[
MKMKMJJCBcyfj9.+y9i9z(yl,yb-:(y.l,yfiB[[[BY[[]NB[]Y[CB[B[[[J[
CBYYK\^K\
CB
L9,y.yc cyayb-YYK[YK[^J
L
CB[[[B[[JY[CB y"yd m.9B\[[B[X]
\CBBBY[YWOH Z[BXZ[
OOB]B."gh.)9y. yd"9g*9. :-m$y.,yk9$9.'9i) 9.9#."`9ak+#y.". 9.*.9#a+ 9.*l##+9+$y.&/*/b+)"y./ 9ih9l##bamk."gh. y.+z/"yo9i&`/9o9g,9{b-yb:-m9. ynm.#yn:+/g*9..+{ki.h9.i&+#. 9.*d#ciyi!9/+oy`"y i9n#9&oy-;$y.*9.9#9aiz kd9.*9.#c'y/gb;b*yYYyZ^\d]\e$y.9ky$fb,:/ 9i)c9.)zgh+ .")&alYYy+#9 9ioyfy+YYyk9yi:"y,ycmc" 9i9 9c9.9#YYyl,y/o#y.k9.9#9"yam:-!y.#yi9[L |