Python交互式图形编程的实现


Posted in Python onJuly 25, 2019

一、

1、图形显示

  • 图素法
  • 像素法
  • 图素法---矢量图:以图形对象为基本元素组成的图形,如矩形、 圆形
  • 像素法---标量图:以像素点为基本单位形成图形

2、图形用户界面:Graphical User Interface,GUI

  • Tkinter---Python 标准GUI
  • Graphics---基于Tkinter扩展图形库
  • Turtle---python内置的图形库。

3、安装graphics库

安装在D:\Python3\Lib\site-packages,网址http://mcsp.wartburg.edu/zelle/python/graphics.py

Python交互式图形编程的实现

4、graphics库

(1)创建图形窗口

图形窗口

点(像素)的集合

GraphWin对象尺寸默认值:高200像素,宽200像素。

参考坐标系

  • n Graphics\Tkinter
  • n 点(0,0)表示屏幕左上角
  • n X轴正方向为从左到右
  • n Y轴正方向为从上到下。
  • n 默认窗口大小为200*200

Python交互式图形编程的实现

Python交互式图形编程的实现

简洁形式

(2)点

Python交互式图形编程的实现

移动点

move(x,y)方法
清除原来点的图像,并在新位置重新绘制
两个数字参数:x,y

Python交互式图形编程的实现

(2)圆

from graphics import *
win=GraphWin()
leftEye=Circle(Point(80,80),5)
leftEye.setFill("yellow")
leftEye.setOutline("red")
rightEye=leftEye
rightEye.move(40,0)

leftEye.draw(win)
rightEye.draw(win)

Python交互式图形编程的实现

左眼右眼重叠了,说明,移动后原来的图就不存在了。

from graphics import *
win=GraphWin()
leftEye=Circle(Point(80,80),5)
leftEye.setFill("yellow")
leftEye.setOutline("red")
rightEye=Circle(Point(120,80),5)
rightEye.setFill("yellow")
rightEye.setOutline("red")

leftEye.draw(win)
rightEye.draw(win)

Python交互式图形编程的实现

(3)face

from graphics import *

win=GraphWin()
face=Circle(Point(100,95),50)
leftEye=Circle(Point(80,80),5)
leftEye.setFill("yellow")
leftEye.setOutline("red")
rightEye=Circle(Point(120,80),5)
rightEye.setFill("yellow")
rightEye.setOutline("red")
mouth=Line(Point(80,110),Point(120,110))

face.draw(win)
mouth.draw(win)
leftEye.draw(win)
rightEye.draw(win)

Python交互式图形编程的实现

5、交互式图形接口

图形用户界面(图形用户接口),
n 采用图形方式显示的计算机操作用户界面
n 用于程序的输入和输出
n 事件驱动

Graphics模块
n 隐藏了底层事件的处理机制,
n 提供了获得用户在窗口中的输入
n 捕捉鼠标点击
n 处理文本输入

(1)捕捉鼠标点击

from graphics import *

def main():
  win=GraphWin("Click me")#标题栏名
  for i in range(10):
    p=win.getMouse()
    print("you click at:",p.getX(),p.getY())
if __name__=="__main__":
  main()

Python交互式图形编程的实现

(2)四边形

from graphics import *

def main():
  win=GraphWin("draw a polygon",500,500)#标题栏名
  win.setCoords(0,0,500,500)#变换坐标,左下角和右上角
  message=Text(Point(250,50),"click on four points")#下面中心位置
  message.draw(win)
  
  #获取四个点
  p1=win.getMouse()
  p1.draw(win)
  p2=win.getMouse()
  p2.draw(win)
  p3=win.getMouse()
  p3.draw(win)
  p4=win.getMouse()
  p4.draw(win)

  #顺次画出闭合图形
  polygon=Polygon(p1,p2,p3,p4)
  polygon.setFill("red")
  polygon.setOutline('black')
  polygon.draw(win)

  message.setText('click anywhere to quit')
  win.getMouse()
  
if __name__=="__main__":
  main()

Python交互式图形编程的实现

6、温度转换界面

(1)输入窗口

from graphics import *
 
win = GraphWin("Celsius Converter", 400, 300)#载入界面,标题栏
win.setCoords(0.0, 0.0, 3.0, 4.0)#按比例转换坐标

# 绘制接口
Text(Point(1,3), " Celsius Temperature:").draw(win)#输入文字
Text(Point(1,1), "Fahrenheit Temperature:").draw(win)

input= Entry(Point(2,3),5)#前面是位置,后面是宽度,可以写数字
input.setText("0.0")
input.draw(win)

Python交互式图形编程的实现

Entry输入可以让用户自己输入内容,setText()是填充入内容,用户可以修改。

(2)完整代码

from graphics import *
 
win = GraphWin("Celsius Converter", 400, 300)#载入界面,标题栏
win.setCoords(0.0, 0.0, 3.0, 4.0)#按比例转换坐标

# 绘制接口
Text(Point(1,3), " Celsius Temperature:").draw(win)#输入文字
Text(Point(1,1), "Fahrenheit Temperature:").draw(win)

input= Entry(Point(2,3),5)#前面是位置,后面是宽度,可以写数字
input.setText("0.0")
input.draw(win)

output = Text(Point(2,1),"")#确定输出位置
output.draw(win)

button = Text(Point(1.5,2.0),"Convert It")#按钮字样
button.draw(win)
Rectangle(Point(1,1.5), Point(2,2.5)).draw(win)#长方形

# 等待鼠标点击
win.getMouse()
# 转换输入
celsius = eval(input.getText())#得到你的输入值,getText()

fahrenheit = 9.0/5.0 * celsius + 32.0
# 显示输出,改变按钮
output.setText(fahrenheit)#输出温度值,setText()
button.setText("Quit")
# 等待响应鼠标点击,退出程序
win.getMouse()
win.close()

Python交互式图形编程的实现

体会Text和Entry的区别,前者只能由程序输入内容,后者可以在图形界面输入内容;两者都是用getText()获取内容,用setText()展示内容。

三、tkinter库

7、创建GUI程序的基本步骤为:
n 导入Tk模块.
n 创建GUI应用程序的主窗口.
n 添加控件或GUI应用程序.
n 进入主事件循环,等待响应用户触发事件

15种常见的 Tk 控件
Button, Canvas, Checkbutton, Entry, Frame, Label,
Listbox, Menubutton, Menu, Message, Radiobutton,
Scale Scrollbar, Text, Toplevel, Spinbox
PanedWindow, LabelFrame, tkMessageBox

Python交互式图形编程的实现

Python交互式图形编程的实现

共同属性
n Dimensions :尺寸
n Colors:颜色
n Fonts:字体
n Anchors:锚
n Relief styles:浮雕式
n Bitmaps:显示位图
n Cursors:光标的外形

(1)界面布局
n Tkinter三种几何管理方法
n pack()
n grid()
n place()

创建GUI应用程序窗口代码模板

Python交互式图形编程的实现

from tkinter import *

tk=Tk()
label=Label(tk,text="welcome to python Tkinter")#标签
button=Button(tk,text="click me")#按钮
label.pack()
button.pack()
tk.mainloop()

Python交互式图形编程的实现

(2)响应用户事件示例

from tkinter import *

def processOK():
    print("OK button is clicked")#点击之后会在idle中显示

def processCancel():
    print("cancel button is clicked")

def main():
    tk=Tk()
    btnOK=Button(tk,text="OK",fg="red",command=processOK)#文本,字体颜色,和点击评论,并没有标定具体位置,
    btnCancel=Button(tk,text="cancel ",bg="yellow",command=processCancel)
    btnOK.pack()
    btnCancel.pack()

    tk.mainloop()

if __name__=="__main__":
    main()

Python交互式图形编程的实现

(3)显示文字、图片、绘制图形

Python交互式图形编程的实现

from tkinter import *

def main():
    tk=Tk()
    canvas=Canvas(tk,width=300,height=200)#创建画布,宽和高
    canvas.pack()#显示画布
    #创建文字,(150,40)中心点,内容,颜色,字体,大小
    canvas.create_text(150,40,text="welcome to Tkinter",fill='blue',font=("Times",16))
    
    myImage=PhotoImage(file="python_logo.gif")
    #创建图片,只能gif格式,(65,70)左上角坐标
    canvas.create_image(65,70,anchor="nw",image=myImage)
    
    canvas.create_rectangle(65,70,240,130)

    tk.mainloop()
if __name__=="__main__":
    main()

Python交互式图形编程的实现

(4)控制图形移动的示例

from tkinter import *

tk=Tk()
canvas=Canvas(tk,width=400,height=400)#创建画布
canvas.pack()

def moverectangle(event):
    if event.keysym=="Up":#获取你点击的键盘内容
        canvas.move(1,0,-5)
        print(event.keysym)

    elif event.keysym=="Down":
        canvas.move(1,0,5)
        print(event.keysym)

    elif event.keysym=="Left":
        canvas.move(1,-5,0)
        print(event.keysym)

    elif event.keysym=="Right":
        canvas.move(1,5,0)
        print(event.keysym)

canvas.create_rectangle(10,10,50,50,fill="red")#画出方块

canvas.bind_all("<KeyPress-Up>",moverectangle)#通过键盘,触发函数
canvas.bind_all("<KeyPress-Down>",moverectangle)
canvas.bind_all("<KeyPress-Left>",moverectangle)
canvas.bind_all("<KeyPress-Right>",moverectangle)

Python交互式图形编程的实现

四、图形库的应用方法

1、Graphwin对象

一个程序可以定义任意数量的窗体
n GraphWin()
n 默认标题是“Graphics Window”
n 默认大小为200*200

Python交互式图形编程的实现

2、图形对象
n 点、 线段、 圆、 椭圆、 矩形、 多边形以及文本
n 默认初始化
n 黑色边框
n 没有被填充

Python交互式图形编程的实现

Python交互式图形编程的实现

Python交互式图形编程的实现

Python交互式图形编程的实现

Python交互式图形编程的实现

Python交互式图形编程的实现

Python交互式图形编程的实现

Python交互式图形编程的实现

3、图形颜色

Python中颜色由字符串指定
n 很多颜色具有不同深浅
n 红色逐渐加深
n ‘red1' ‘red2' ‘red3' ‘red4

color_rgb(red,green,blue)函数
n 设定颜色数值获得颜色
n 三个参数为0-255范围内的整数
n 返回一个字符串
color_rgb(255,0,0) 亮红色,
color_rgb(130,0,130) 中度洋红色

from graphics import *
 
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(int(255*weight),int(66+150*(1-weight)),int(255*(1-weight)))#算法核心
  win.setBackground(newcolor)
  
def main():
  win = GraphWin("Celsius Converter", 400, 300)
  win.setCoords(0.0, 0.0, 3.0, 4.0)
  
  # 绘制输入接口,三行提示
  Text(Point(1,3),
     " Celsius Temperature:").draw(win)
  Text(Point(2,2.7),
     " (Please input 0.0-100.0 )").draw(win)
  Text(Point(1,1),
     "Fahrenheit Temperature:").draw(win)
  
  input = Entry(Point(2,3), 5)
  input.setText("0.0")
  input.draw(win)
  
  output = Text(Point(2,1),"")
  output.draw(win)
  
  button = Text(Point(1.5,2.0),"Convert It")
  button.draw(win)
  
  rect = Rectangle(Point(1,1.5), Point(2,2.5))
  rect.draw(win)
  # 等待鼠标点击
  win.getMouse()
  print(win.getMouse())
  result = convert(input)  # 转换输入
  output.setText(result)  # 显示输出 
  # 改变颜色
  colorChange(win,input)
  # 改变按钮字体
  button.setText("Quit")
  # 等待点击事件,退出程序
  win.getMouse()
  win.close()
 
if __name__ == '__main__':
  main()

Python交互式图形编程的实现

Python交互式图形编程的实现

五、turtle库

Turtle 库
n Python内置图形化模块

Python交互式图形编程的实现

Python交互式图形编程的实现

Python交互式图形编程的实现

from turtle import *

def main():
    pensize(3)
    penup()
    goto(-200,-50)
    pendown()
    begin_fill()
    color("red")
    circle(40,steps=3)
    end_fill()

    pensize(3)
    penup()
    goto(-100,-50)
    pendown()
    begin_fill()
    color("green")
    circle(40,steps=4)
    end_fill()

    pensize(3)
    penup()
    goto(0,-50)
    pendown()
    begin_fill()
    color("blue")
    circle(40,steps=5)
    end_fill()

    pensize(3)
    penup()
    goto(100,-50)
    pendown()
    begin_fill()
    color("yellow")
    circle(40,steps=6)
    end_fill()

    pensize(3)
    penup()
    goto(200,-50)
    pendown()
    begin_fill()
    color("purple")
    circle(40)
    end_fill()

    color("green")
    penup()
    goto(-100,50)
    pendown()
    write(("cool colorful shapes"),
       font=("Times",18,"bold"))
    hideturtle()
    
if __name__=="__main__":
    main()

Python交互式图形编程的实现

六、tkinter库的聊天界面

(1)

from tkinter import *
import time
 
def main():
 
 def sendMsg():#发送消息
  strMsg = '我:' + time.strftime("%Y-%m-%d %H:%M:%S",
                 time.localtime()) + '\n '
  txtMsgList.insert('0.0', strMsg, 'greencolor')#END,文本结尾,也即开头。后面是标签名称
  txtMsgList.insert('0.0', txtMsg.get('0.0', END))#"0.0",文本开头
  txtMsg.delete('0.0', END)
   
 def cancelMsg():#取消消息
  txtMsg.delete('0.0', END)
 
 def sendMsgEvent(event): #发送消息事件
  if event.keysym == "Up":
   sendMsg()
 
 #创建窗口 
 t = Tk()
 t.title('与python聊天中')
    
 #创建frame容器
 frmLT = Frame(width=500, height=320, bg='white')
 frmLC = Frame(width=500, height=150, bg='white')
 frmLB = Frame(width=500, height=30)
 frmRT = Frame(width=200, height=500)
  
 #创建控件
 txtMsgList = Text(frmLT)
 txtMsgList.tag_config('greencolor', foreground='red')#创建tag,
                            #"greencolor"是名称,后面是颜色
 txtMsg = Text(frmLC);
 txtMsg.bind("<KeyPress-Up>", sendMsgEvent)
 btnSend = Button(frmLB, text='发 送', width = 8, command=sendMsg)
 btnCancel = Button(frmLB, text='取消', width = 8, command=cancelMsg)
 imgInfo = PhotoImage(file = "python_logo.gif")
 lblImage = Label(frmRT, image = imgInfo)
 lblImage.image = imgInfo
 
 #窗口布局columnspan选项可以指定控件跨越多列显示,
 #而rowspan选项同样可以指定控件跨越多行显示。
 frmLT.grid(row=0, column=0, columnspan=2, padx=1, pady=3)
 frmLC.grid(row=1, column=0, columnspan=2, padx=1, pady=3)
 frmLB.grid(row=2, column=0, columnspan=2)
 frmRT.grid(row=0, column=2, rowspan=3, padx=2, pady=3)
 #固定大小
 frmLT.grid_propagate(0)
 frmLC.grid_propagate(0)
 frmLB.grid_propagate(0)
 frmRT.grid_propagate(0)
  
 btnSend.grid(row=2, column=0)
 btnCancel.grid(row=2, column=1)
 lblImage.grid()
 txtMsgList.grid()
 txtMsg.grid()
 
 #主事件循环
 t.mainloop()
 
if __name__ == '__main__':
  main()

Python交互式图形编程的实现

利用grid(),对界面进行布局

tag()设置标签格式(颜色)

time()输出时间

insert()一定要注意,是从开头插入还是末尾插入,否则就出现了上述的情况,新输入的在上方

更改如下

from tkinter import *
import time
 
def main():
 
 def sendMsg():#发送消息
  strMsg = '我:' + time.strftime("%Y-%m-%d %H:%M:%S",
                 time.localtime()) + '\n '
  print(strMsg)
  txtMsgList.insert(END, strMsg,"greencolor")#插入年月日
  txtMsgList.insert(END, txtMsg.get('0.0', END))#输入的内容,0.0表示文本开始
  txtMsg.delete('0.0', END)#删除中间刚输入的内容
   
 def cancelMsg():#取消消息
  txtMsg.delete('0.0', END)
 
 def sendMsgEvent(event): #发送消息事件:
  if event.keysym == "Up":
   sendMsg()
 
 #创建窗口 
 t = Tk()
 t.title('与python聊天中')
    
 #创建frame容器
 frmLT = Frame(width=500, height=320, bg='white')
 frmLC = Frame(width=500, height=150, bg='white')
 frmLB = Frame(width=500, height=30)
 frmRT = Frame(width=200, height=500)
  
 #创建控件
 txtMsgList = Text(frmLT)
 # txtMsgList.tag_config('greencolor', foreground='#008C00')#创建tag
 txtMsg = Text(frmLC);
 txtMsg.bind("<KeyPress-Up>", sendMsgEvent)

 #发送取消按钮和图片
 btnSend = Button(frmLB, text='发 送', width = 8, command=sendMsg)
 btnCancel = Button(frmLB, text='取消', width = 8, command=cancelMsg)
 imgInfo = PhotoImage(file = "python_logo.gif")
 lblImage = Label(frmRT, image = imgInfo)
 lblImage.image = imgInfo
 
 #窗口布局columnspan选项可以指定控件跨越多列显示,
 #而rowspan选项同样可以指定控件跨越多行显示。
 frmLT.grid(row=0, column=0,columnspan=2, padx=1, pady=3)
 frmLC.grid(row=1, column=0, columnspan=2,padx=1, pady=3)
 frmLB.grid(row=2, column=0,columnspan=2)
 frmRT.grid(row=0, column=2, columnspan=2,rowspan=3, padx=2, pady=3)
 #固定大小
 frmLT.grid_propagate(0)
 frmLC.grid_propagate(0)
 frmLB.grid_propagate(0)
 frmRT.grid_propagate(0)

  #按钮和图片
 btnSend.grid(row=2,column=0)
 btnCancel.grid(row=2,column=1)
 lblImage.grid()
 
 txtMsgList.grid()
 txtMsg.grid()
 
 #主事件循环
 t.mainloop()
 
if __name__ == '__main__':
  main()

Python交互式图形编程的实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
介绍Python中的__future__模块
Apr 27 Python
Python实现简单多线程任务队列
Feb 27 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
Python实现的knn算法示例
Jun 14 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
Python发展史及网络爬虫
Jun 19 Python
python求绝对值的三种方法小结
Dec 04 Python
django框架单表操作之增删改实例分析
Dec 16 Python
使用Tensorboard工具查看Loss损失率
Feb 15 Python
python实现腾讯滑块验证码识别
Apr 27 Python
python之pexpect实现自动交互的例子
Jul 25 #Python
Python使用lambda表达式对字典排序操作示例
Jul 25 #Python
浅析Python 引号、注释、字符串
Jul 25 #Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 #Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 #Python
python找出因数与质因数的方法
Jul 25 #Python
HTML的form表单和django的form表单
Jul 25 #Python
You might like
php 无限极分类
2008/03/27 PHP
PHP 批量删除 sql语句
2009/06/05 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
js登录弹出层特效
2014/03/07 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
老生常谈js数据类型
2017/08/03 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
Vue中computed与methods的区别详解
2018/03/24 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
python实现识别相似图片小结
2016/02/22 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
任意存:BOXFUL
2018/05/21 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
小摄影师教学反思
2014/04/27 职场文书
生日庆典策划方案
2014/06/02 职场文书
社区平安建设汇报材料
2014/08/14 职场文书
初三毕业评语
2014/12/26 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
小学入学感言
2015/08/01 职场文书
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python