zoukankan      html  css  js  c++  java
  • 交互式图形编程和数学库

    图形显示:

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

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

    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调试器。

    技巧:

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

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

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

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

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

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

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

  • 相关阅读:
    十五天精通WCF——第六天 你必须要了解的3种通信模式
    十五天精通WCF——第五天 你需要了解的三个小技巧
    十五天精通WCF——第四天 你一定要明白的通信单元Message
    十五天精通WCF——第三天 client如何知道server提供的功能清单
    十五天精通WCF——第二天 告别烦恼的config配置
    十五天精通WCF——第一天 三种Binding让你KO80%的业务
    SimpleAdapter & BaseAdapter
    android:layout_gravity和android:gravity的区别
    Restrict & Cascade
    正确理解Mysql的列索引和多列索引
  • 原文地址:https://www.cnblogs.com/ST-2017/p/8407575.html
Copyright © 2011-2022 走看看