交互式图形编程和数学库

图形显示:

​ 图素法(矢量图:以图形对象为基本元素组成的图形,如矩形、圆形);

​ 像素法(标量图:以像素点为基本单位形成的图形);

Python图形工具包:

​ tkinter(简称tk接口)、Graphics、turtle

图形用户界面:

​ Graphical User Interface,GUI;

​ Tkinter---Python标准GUI;

​ Graphics---基于Tkinter扩展图形库;

​ Turtle---Python内置的图形库;

点对象Point

​ 图形模块最简单的对象;

​ 参考坐标系定位;

​ 坐标(x,y);

参考坐标系

​ GraphicsTkinter:

​ 点(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()) + '
 '
 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调试器。

技巧:

查看调用函数体内部的函数值性情况:

​ 在函数体内部设置断点;

​ 在函数调用语句设置断点;

查看重复执行的函数体或者语句:

​ 运行到某一次循环时,增加断点;

​ 需要查看的某次循环结束时,清楚断点;

​ 无需等到全部循环结束;

原文地址:https://www.cnblogs.com/ST-2017/p/8407575.html