现在让我们开始尝试图形用户界面 (GUI) 程序的编写 Python 标准库中有个 turtle 模块, 可以生成标准的应用程序窗口进行图形绘制 turtle 的绘图方式非常简单直观想象有一只尾巴上蘸着颜料的小海龟在电脑屏幕上爬行, 随着它的移动就能画出线条来, turtle 程序窗口的绘图区域使用直角坐标系, 海龟的初始位置在窗口绘图区正中的 (0,0) 点, 头朝 x 轴的正方向你可以先在交互模式中引入模块并练习其中的函数:
- In [1]: import turtle as tt
- In [2]: tt.setup() # 设置画布, 这将立即显示绘图窗口
- In [3]: tt.forward(100) # 前进 100 像素, 这将画出一条横向线段
- In [4]: tt.right(90) # 右转 90 度, 这将改变海龟的朝向
- In [5]: tt.forward(100) # 这将画出一条纵向线段
- In [6]: tt.goto(0,0) # 前往原点, 这将完成一个等腰直角三角形
- In [7]: tt.bye() # 关闭绘图窗口
利用 tutle 模块能够更生动地学习流程控制概念, 以下程序可以画出一个五角星画一条线段并右转 144 度, 如此重复五次:
- import turtle as tt
- tt.TurtleScreen._RUNNING = True # 启动绘图, 在 IDE 中运行加这句可避免报错
- cnt = 0
- while cnt <5:
- tt.forward(200)
- tt.right(144)
- cnt += 1
- tt.done() # 结束绘图, 这将不会关闭窗口
以下程序连续画了 500 条线段, 每一条线段的颜色都随机, 每一条线段都比前一条长 1 个像素, 每画一条线段之后都向右转 91 度于是我们得到了一个繁复的彩色螺旋图案:
- import turtle as tt
- from random import randint
- tt.TurtleScreen._RUNNING = True
- tt.speed(0) # 绘图速度为最快
- tt.bgcolor("black") # 背景色为黑色
- cnt = 0
- tt.setpos(-25, 25) # 改变初始位置, 这可以让图案居中
- tt.colormode(255) # 颜色模式为真彩色
- while cnt < 500:
- r = randint(0, 255)
- g = randint(0, 255)
- b = randint(0, 255)
- tt.pencolor(r, g, b) # 画笔颜色每次随机
- tt.forward(50 + cnt)
- tt.right(91)
- cnt += 1
- tt.done()
06_turtle.png
接下来让我们灵活运用 turtle 模块的交互功能, 把上次编写的命令行式猜数游戏改造成图形界面的请把程序文件命名为 guessnum.pyw, 这样当你在操作系统中直接双击时就不会再打开黑色的命令行窗口获取用户输入可以使用对话框, 反馈信息则可以直接显示在窗口绘图区域中:
- from random import randint
- import turtle as tt
- tt.TurtleScreen._RUNNING = True
- tt.setup(width=800, height=450, startx=None, starty=None) # 设置自定义的窗口大小
- tt.hideturtle() # 隐藏画笔图标
- tt.color("blue") # 画笔颜色为蓝色
- tt.penup() # 抬起画笔, 移动时不画线
- tt.setpos(-300, 0) # 设置初始位置
- myfont = ("黑体", 16, "normal") # 定义字体
- target = randint(1, 100)
- tt.write("我想了一个 1 到 100 之间的整数, 请你猜猜看吧:", font=myfont) # 输出文本
- guess = 0
- answer = ""
- while guess != target:
- # 使用对话框获取用户输入
- guess = tt.simpledialog.askinteger("猜数游戏", "请输入一个整数:")
- if guess == target:
- answer = "你猜对了! 游戏结束"
- elif not guess: # 用户没有输入数字则中断循环
- tt.clear() # 清空画布以便输出新文本
- tt.write("你放弃了, 游戏结束", font=myfont)
- break
- elif guess> target:
- answer = "你猜大了, 再猜一次:"
- else:
- answer = "你猜小了, 再猜一次:"
- tt.clear()
- tt.write(answer, font=myfont)
- tt.done()
06_turtle_guess.png
海龟绘图很有趣, 你可以查看官方在线文档以了解 turtle 模块的更多细节 https://docs.python.org/3.6/library/turtle.html
编程原来是这样
编程小提示: 模块的运行
Python 标准库中还有一个 turtledemo 模块, 这是 turtle 绘图功能演示程序, 输入以下系统命令即可运行 turtledemo 模块:
python -m turtledemo
只要模块中定义了可运行对象(实现功能或用于测试), 模块就是可运行的实际上, 你也可以输入以下系统命令来运行 turtle 模块:
python -m turtle
来源: http://www.jianshu.com/p/5339bf4d5e97