Python学习笔记-交互式图形编程

Python学习笔记-交互式图形编程

捕捉鼠标点击

利用getMouse()函数,使用户点击鼠标的位置以Point对象的作为返回值返回给程序,下面额程序是利用用户在窗口点击的生成的5个点画一个五边形:

#polygon.py   交互式绘制五边形
from graphics import *
#引入graphics库及其中函数

win=GraphWin("Draw a polygon",300,300)
#打开一个标题为Draw a polygon,宽和高皆为300的窗口

win.setCoords(0.0,0.0,300.0,300.0)
#设置窗口坐标系,左下角为(0.0,0.0),右上角为(300.0,300.0)
#即原始坐标的左右方向不变,上下颠倒:以(0.0,300.0)为原点,向上向右为正方向

message=Text(Point(150,20),"Click on five point")#以(150,20)为中心绘制以上文本
message.draw(win)#绘制文本

#获得多边形的5个点
p=[]#建立一个空列表
def getpoint():
    p=win.getMouse()#捕捉鼠标点击
    p.draw(win)#绘制鼠标点击的点
    return p

#分别为5次点击分配对象
p1=getpoint()
p2=getpoint()
p3=getpoint()
p4=getpoint()
p5=getpoint()

#使用Polygon对象绘制多边形
polygon=Polygon(p1,p2,p3,p4,p5)#利用鼠标点击的5个点绘制5边形
polygon.setFill("peachpuff")#将五边形里填充上桃粉色
polygon.setOutline("black")#将五边形边框变成黑色
polygon.draw(win)#绘制五边形

#等待鼠标相应,退出程序
message.setText("Click anywhere to quit")#将程序最初的那个文本改成...
win.getMouse()#捕捉鼠标点击
win.close()#关闭窗口

处理文本输入

利用对象Entry建立文本框,用于输入文本,并通过程序代码完成温度转换,并且可以使窗口背景颜色随温度显现冷暖色,即温度越高,颜色越红;温度越低,颜色越偏蓝(color_rhb(red,green,blue)).
代码如下:

#tempCovert_gui.py  用窗口颜色显示温度转换的结果
from graphics import *#引入graphics图形库

def convert(input):#温度转换函数
    celsius=eval(input.getText())#输入需转换的摄氏温度
    fahrenheit=9.0/5.0*celsius+32#将摄氏温度转换为华氏温度
    return fahrenheit
def colorChange(win,input):#使窗体背景颜色随温度变化
    cnum=eval(input.getText())#文本框内输入的摄氏温度
    weight=cnum/100.0
    newcolor=color_rgb(255*weight,66+150*(1-weight),255*(1-weight))
    #将新颜色中rad,green,blue的深度设成和温度有关的函数,使温度越高越红;温度越低越蓝
    win.setBackground(newcolor)#将窗口背景颜色设成指定颜色
def main():
    win=GraphWin("Celsius Coverter" ,400,300)
    #创建一个标题为Celsius Coverter,宽为400,高为300的窗口
    win.setCoords(0.0,0.0,400.0,300.0)
    #新建一个坐标系,以左下角点为原点,向上向右为正方向
    #绘制输入接口
    Text(Point(100,250),"Celsius Temperture:").draw(win)
    #以点(100,250)为中心绘制文本Celsius Temperture
    Text(Point(300,220),"(Please input 0.0-100.0)").draw(win)
    #以点(200,220)为中心绘制文本(Please input 0.0-100.0)
    Text(Point(100,50),"Fahrenheit Tempertuure:").draw(win)
    #以点(100,50)为中心绘制文本Fahrenheit Tempertuure:
    #绘制输入文本框
    input=Entry(Point(300,250),5)
    #绘制以点(200,250)为中心长度为5的文本框,并将文本框中的内容赋给input
    input.setText("0.0")#在文本框内默认值为0.0
    input.draw(win)
    #绘制输出文本
    output=Text(Point(300,50),"")#以点(300,50)为中心建立文本
    output.draw(win)
    #绘制按钮
    button=Text(Point(200,150),"Covert it")
    button.draw(win)
    #以点(200,150)为中心绘制文本Covert it
    rect=Rectangle(Point(100,200),Point(300,100)).draw(win)
    #以(100,200)为左上点,以(300,100)为右下点绘制矩形
    #等待鼠标点击
    win.getMouse()#捕捉鼠标点击
    result=convert(input)#将输入的摄氏温度转换为华氏温度
    output.setText(result)#显示输出结果
    #展示转换后的变化
    colorChange(win,input)#改变颜色
    button.setText("Quit")#将按钮中的字体变为Quit
    #等待点击事件,退出程序
    win.getMouse()
    win.close()
main()

效果如下:在这里插入图片描述

编程题

编写程序:根据鼠标点击5次的位置连线画出房子。前面两次点击的位置是房子的矩形框架的对角线两点;第三次点击位置是矩形们顶边的中心点,们的宽度应当是房子底边宽度的1/5,门的左右两边向下延伸到房子的底边;第四次点击的位置是房子窗户的中心点,窗户的宽度的一半;最后点击的位置是房顶的三角顶点。
代码如下:

#Draw_house.py    鼠标画房子
from graphics import *#引入图像库

def house(p1,p2):#房子的主体
    
    house1=Rectangle(p1,p2)#画房子
    return house1

def depth(p1,p2):#求门宽度
    x1=p1.getX()
    x2=p2.getX()
    x=(x2-x1)/5#门的宽度为房子底边宽度的1/5
    return x

def door(p1,p3,x):#绘制门
    #求门的左下角点坐标
    x3=(p3.getX()-x/2)
    y3=p1.getY()
    #求门右上角点坐标
    x4=(p3.getX()+x/2)
    y4=p3.getY()
    door1=Rectangle(Point(x3,y3),Point(x4,y4))#画门
    return door1

def window(p4,x):#绘制窗
    #求窗的左下角点
    x5=(p4.getX()-x/4)
    y5=(p4.getY()-x/4)
    #求窗的右上角点
    x6=(p4.getX()+x/4)
    y6=(p4.getY()+x/4)
    window1=Rectangle(Point(x5,y5),Point(x6,y6))#画窗
    return window1

def roof(p2,p5,x):#绘制房顶
    #求房子的左上角点
    x7=(p2.getX()-x*5)
    y7=p2.getY()
    #画房顶
    l1=Line(p5,Point(x7,y7))
    l2=Line(p5,p2)
    return l1,l2

def main():
    win=GraphWin("Draw a house",300,300)#创建一个标题为Draw a house,宽高皆为300的窗
    win.setCoords(0.0,0.0,300.0,300.0)
    #以点(0.0,0.0)为左下点,点(300.0,300.0)为右上点建立坐标系
    #即以左下点为原点建立坐标系,向上向右为正方向
    message=Text(Point(150,20),"Click on 5 point to draw a house")
    #以点(150,20)为中心写入上述文字
    message.draw(win)
    #获得鼠标点击的5个点
    def getpoint():
        p=win.getMouse()#捕捉鼠标点击
        p.draw(win)
        return p
    #前2个点
    p1=getpoint()
    p2=getpoint()
    o1=house(p1,p2)#画房子
    o1.draw(win)
    
    x=depth(p1,p2)#求宽度
    
    #第3个点
    p3=getpoint()
    o2=door(p1,p3,x)#画门
    o2.draw(win)
    
    #第4个点
    p4=getpoint()
    o3=window(p4,x)#画窗
    o3.draw(win)
    
    #第5个点
    p5=getpoint()
    o4,o5=roof(p2,p5,x)#画房顶
    o4.draw(win)
    o5.draw(win)
    
    #第5个点
    p5=getpoint()
    o4,o5=roof(p2,p5,x)#画房顶
    o4.draw(win)
    o5.draw(win)
    
    #再次点击,退出程序
    message.setText("Click anywhere to quit")#将程序最初的那个文本改成...
    win.getMouse()#捕捉鼠标点击
    win.close()#关闭窗口

main()

效果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值