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 相关文章推荐
Python调用ctypes使用C函数printf的方法
Aug 23 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
python实现简单遗传算法
Mar 19 Python
python生成器与迭代器详解
Jan 01 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
python实现根据文件格式分类
Oct 31 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
Jul 09 Python
提高python代码运行效率的一些建议
Sep 29 Python
python 实现学生信息管理系统的示例
Nov 28 Python
如何用python批量调整视频声音
Dec 22 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 select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Python标准库内置函数complex介绍
2014/11/25 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
python ansible服务及剧本编写
2017/12/29 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
什么是java序列化,如何实现java序列化
2012/11/14 面试题
JAVA中运算符的分类及举例
2015/09/12 面试题
搞笑获奖感言
2014/01/30 职场文书
商场中秋节活动方案
2014/02/07 职场文书
城管综合整治方案
2014/05/01 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
2014年党建工作总结
2014/11/11 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis