图形显示:
图素法(矢量图:以图形对象为基本元素组成的图形,如矩形、圆形);
像素法(标量图:以像素点为基本单位形成的图形);
Python图形工具包:
tkinter(简称tk接口)、Graphics、turtle
图形用户界面:
Graphical User Interface,GUI;
Tkinter---Python标准GUI;
Graphics---基于Tkinter扩展图形库;
Turtle---Python内置的图形库;
点对象Point
图形模块最简单的对象;
参考坐标系定位;
坐标(x,y);
参考坐标系
Graphics\Tkinter:
点(0,0)表示屏幕左上角;
X轴正方向为从左向右;
Y轴正方向为从上到下;
默认窗口大小为200*200;
不同的实例可以有不同的属性值
创建点对象:Point类的构造函数需要两个参数x, y,存储在对象实例变量p中
大多数类的属性都有并在创建对象时设为默认值。 如:
>>> p = Point(50, 80)
调用方法:
无参数方法:一般用于访问对象的内部属性。 如:
>>> p.getX()
50.0
有参数方法:通过改变对象的属性值来改变对象状态,参数可以为复杂对象。
例:在窗口中绘制两点
>>> from graphics import * >>> p1 = Point(100,100) >>> p1.getX() 100.0 >>> p2 = Point(150,80) >>> win = GraphWin() >>> p1.draw(win) Point(100.0, 100.0) >>> p2.draw(win) Point(150.0, 80.0)
例:编写一个程序,实现摄氏温度转化为华氏温度,用窗口显示输入数据。
1 from graphics import * 2 3 win = GraphWin("Celsius Converter", 400, 300) 4 win.setCoords(0.0, 0.0, 3.0, 4.0) 5 # 绘制接口 6 Text(Point(1,3), " Celsius Temperature:").draw(win) 7 Text(Point(1,1), "Fahrenheit Temperature:").draw(win) 8 input = Entry(Point(2,3), 5) 9 input.setText("0.0") 10 input.draw(win) 11 output = Text(Point(2,1),"") 12 output.draw(win) 13 button = Text(Point(1.5,2.0),"Convert It") 14 button.draw(win) 15 Rectangle(Point(1,1.5), Point(2,2.5)).draw(win) 16 # 等待鼠标点击 17 win.getMouse() 18 # 转换输入 19 celsius = eval(input.getText()) 20 fahrenheit = 9.0/5.0 * celsius + 32.0 21 # 显示输出,改变按钮 22 output.setText(fahrenheit) 23 button.setText("Quit") 24 # 等待响应鼠标点击,退出程序 25 win.getMouse() 26 win.close()
创建GUI程序的基本步骤为:
导入TK模块;
创建GUI应用程序的主窗口;
添加控件或GUI应用程序;
进入主事件循环,等待响应用户触发事件;
GraphWin对象常用方法:
图形对象通用方法:
Point对象方法:
Line对象方法:
Circle对象方法:
Rectangle对象方法:
Oval对象方法:
Polygon对象方法:
Text对象方法:
图形颜色:
python中颜色由字符串指定;
很多颜色具有不同的深浅:红色逐渐加深('red1' , 'red2' , 'red3' , 'red4')
color_rgb(red , green , blue)函数
温度越高,颜色越偏红;温度越低,颜色越偏蓝
setBackground(Newcolor)设置窗口背景颜色。
应用circle方法绘制图形:
1 import turtle 2 3 def main(): 4 turtle.pensize(3) 5 turtle.penup() 6 turtle.goto(-200,-50) #三角形 7 turtle.pendown() 8 turtle.begin_fill() 9 turtle.color("red") 10 turtle.circle(40, steps=3) 11 turtle.end_fill() 12 13 14 turtle.penup() 15 turtle.goto(-100,-50) #菱形 16 turtle.pendown() 17 turtle.begin_fill() 18 turtle.color("blue") 19 turtle.circle(40, steps=4) 20 turtle.end_fill() 21 22 turtle.penup() 23 turtle.goto(0,-50) #五边形 24 turtle.pendown() 25 turtle.begin_fill() 26 turtle.color("green") 27 turtle.circle(40, steps=5) 28 turtle.end_fill() 29 30 turtle.penup() 31 turtle.goto(100,-50) #六边形 32 turtle.pendown() 33 turtle.begin_fill() 34 turtle.color("yellow") 35 turtle.circle(40, steps=6) 36 turtle.end_fill() 37 38 turtle.penup() 39 turtle.goto(200,-50) #圆 40 turtle.pendown() 41 turtle.begin_fill() 42 turtle.color("purple") 43 turtle.circle(40) 44 turtle.end_fill() 45 46 turtle.color("green") 47 turtle.penup() 48 turtle.goto(-100,50) 49 turtle.pendown() 50 turtle.write(("Cool Colorful shapes"), 51 font = ("Times", 18, "bold")) 52 turtle.hideturtle() 53 54 turtle.done 55 56 if __name__ == '__main__': 57 main()
运行结果:
界面设计和实现过程:
界面布局设计
创建所需控件
设定事件和命令响应;
对控件进行布局
完成程序代码
例:设计一个聊天窗口。
1 from tkinter import * 2 import time 3 4 def main(): 5 6 def sendMsg():#发送消息 7 strMsg = '我:' + time.strftime("%Y-%m-%d %H:%M:%S", 8 time.localtime()) + '\n ' 9 txtMsgList.insert(END, strMsg, 'greencolor') 10 txtMsgList.insert(END, txtMsg.get('0.0', END)) 11 txtMsg.delete('0.0', END) 12 13 def cancelMsg():#取消消息 14 txtMsg.delete('0.0', END) 15 16 def sendMsgEvent(event): #发送消息事件 17 if event.keysym == "Up": 18 sendMsg() 19 20 #创建窗口 21 t = Tk() 22 t.title('与python聊天中') 23 24 #创建frame容器 25 frmLT = Frame(width=500, height=320, bg='white') 26 frmLC = Frame(width=500, height=150, bg='white') 27 frmLB = Frame(width=500, height=30) 28 frmRT = Frame(width=200, height=500) 29 30 #创建控件 31 txtMsgList = Text(frmLT) 32 txtMsgList.tag_config('greencolor', foreground='#008C00')#创建tag 33 txtMsg = Text(frmLC); 34 txtMsg.bind("<KeyPress-Up>", sendMsgEvent) 35 btnSend = Button(frmLB, text='发 送', width = 8, command=sendMsg) 36 btnCancel = Button(frmLB, text='取消', width = 8, command=cancelMsg) 37 imgInfo = PhotoImage(file = "python.gif") 38 lblImage = Label(frmRT, image = imgInfo) 39 lblImage.image = imgInfo 40 41 #窗口布局 42 frmLT.grid(row=0, column=0, columnspan=2, padx=1, pady=3) 43 frmLC.grid(row=1, column=0, columnspan=2, padx=1, pady=3) 44 frmLB.grid(row=2, column=0, columnspan=2) 45 frmRT.grid(row=0, column=2, rowspan=3, padx=2, pady=3) 46 #固定大小 47 frmLT.grid_propagate(0) 48 frmLC.grid_propagate(0) 49 frmLB.grid_propagate(0) 50 frmRT.grid_propagate(0) 51 52 btnSend.grid(row=2, column=0) 53 btnCancel.grid(row=2, column=1) 54 lblImage.grid() 55 txtMsgList.grid() 56 txtMsg.grid() 57 58 #主事件循环 59 t.mainloop() 60 61 if __name__ == '__main__': 62 main()
模拟时钟程序过程:
第一步:建立Turtle对象并初始化;
第二步:静态表盘绘制;
第三步:根据时钟更新表针位置和时间信息;
代码:
1 from turtle import * 2 from datetime import * 3 4 def Skip(step): #跨越函数 5 penup() 6 forward(step) 7 pendown() 8 9 def mkHand(name, length): #定义表针函数 10 #注册Turtle形状,建立表针Turtle 11 reset() 12 Skip(-length*0.1) 13 begin_poly() 14 forward(length*1.1) 15 end_poly() 16 handForm = get_poly() 17 register_shape(name, handForm) 18 19 def Init(): #初始化函数 20 global secHand, minHand, hurHand, printer 21 mode("logo")# 重置Turtle指向北 22 #建立三个表针Turtle并初始化 23 mkHand("secHand", 125) 24 mkHand("minHand", 130) 25 mkHand("hurHand", 90) 26 secHand = Turtle() 27 secHand.shape("secHand") 28 minHand = Turtle() 29 minHand.shape("minHand") 30 hurHand = Turtle() 31 hurHand.shape("hurHand") 32 for hand in secHand, minHand, hurHand: 33 hand.shapesize(1, 1, 3) 34 hand.speed(0) 35 #建立输出文字Turtle 36 printer = Turtle() 37 printer.hideturtle() 38 printer.penup() 39 40 def SetupClock(radius): #表盘绘制函数 41 #建立表的外框 42 reset() 43 pensize(7) 44 for i in range(60): 45 Skip(radius) 46 if i % 5 == 0: 47 forward(20) 48 Skip(-radius-20) 49 else: 50 dot(5) 51 Skip(-radius) 52 right(6) 53 54 def Week(t): 55 week = ["星期一", "星期二", "星期三", 56 "星期四", "星期五", "星期六", "星期日"] 57 return week[t.weekday()] 58 59 def Date(t): 60 y = t.year 61 m = t.month 62 d = t.day 63 return "%s %d %d" % (y, m, d) 64 65 def Tick(): #更新时钟函数 66 #绘制表针的动态显示 67 t = datetime.today() 68 second = t.second + t.microsecond*0.000001 69 minute = t.minute + second/60.0 70 hour = t.hour + minute/60.0 71 secHand.setheading(6*second) 72 minHand.setheading(6*minute) 73 hurHand.setheading(30*hour) 74 75 tracer(False) 76 printer.forward(65) 77 printer.write(Week(t), align="center", 78 font=("Courier", 14, "bold")) 79 printer.back(130) 80 printer.write(Date(t), align="center", 81 font=("Courier", 14, "bold")) 82 printer.home() 83 tracer(True) 84 85 ontimer(Tick, 100)#100ms后继续调用tick 86 87 def main(): 88 tracer(False) 89 Init() 90 SetupClock(160) 91 tracer(True) 92 Tick() 93 mainloop() 94 95 if __name__ == "__main__": 96 main()
库安装方式的选择:
优先级1:pip工具安装;
优先级2:库的自定义安装;
优先级3:库的文件安装;
pip的常用子命令:
office的编程需求:
Numpy库的使用:
Numpy(Numeric Python)可以被理解为一个用python实现科学计算包,包括
强大的N维数组对象Array;
成熟的函数库;
使用的线性代数,傅里叶变换和随机数生成函数;
Numpy的主要对象是同种元素的多维数组:
维度叫做轴,轴的个数叫做秩。
创建数组
打印数组
矩阵运算
程序调试
程序中常见错误:编译错误,运行时错误,逻辑错误;
调试的类别:静态调试,动态调试(分段隔离,设置断点)
Python Shell Debugger:可交互的IDLE调试器。
技巧:
查看调用函数体内部的函数值性情况:
在函数体内部设置断点;
在函数调用语句设置断点;
查看重复执行的函数体或者语句:
运行到某一次循环时,增加断点;
需要查看的某次循环结束时,清楚断点;
无需等到全部循环结束;