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()
效果如下: