详解python使用canvas实现移动并绑定键盘

目录
  • 一、任务
  • 二、实现
    • (1)导库并创建画布
    • (2)画图形
    • (3)创建按钮和文本框
    • (4)功能实现
  • 三、完整代码
  • 四、升级—绑定键盘事件
  • 总结

一、任务

用多个按钮或者按钮+文本框实现不同物体(椭圆,长方形,扇形)的各个方向的运动(上下左右)

效果图:

二、实现

(1)导库并创建画布

import tkinter as tk
window = tk.Tk()
window.title('my window')
##窗口尺寸
window.geometry('300x350')
#新建画布
canvas=tk.Canvas(window,bg='blue',height=150,width=300)

(2)画图形

#画线
x0,y0,x1,y1=50,50,80,80
line=canvas.create_line(x0,y0,x1,y1)
#画
oval=canvas.create_oval(x0,y0,x1,y1,fill='red')
#画一个扇形
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=90)
#画一个矩形
rect = canvas.create_rectangle(100, 30, 100+20, 30+20)
canvas.pack()

(3)创建按钮和文本框

#创建文本框
entry = tk.Entry(window, show=None)
entry.pack()
#创建文本
label = tk.Label(window , text='圆:oval;线:line;扇形:arc;矩形 :rect')
label.pack()  #打包
#创建一个Button
b=tk.Button(window,text='下',command=moveit)
b.place(x=120,y=280)
up=tk.Button(window,text='上',command=moveup)
up.place(x=120,y=220)
left=tk.Button(window,text='左',command=moveleft)
left.place(x=80,y=250)
right=tk.Button(window,text='右',command=moveright)
right.place(x=160,y=250)

(4)功能实现

#向下移动
def moveit():
    obj = entry.get()  #获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,0,2)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, 0, 2)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, 0, 2)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line, 0, 2)
#向上移动
def moveup():
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,0,-2)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc,0,-2)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval,0,-2)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line,0,-2)
#向左移动
def moveleft():
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect, -2 ,0)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, -2 ,0)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, -2 ,0)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line, -2, 0)
#向右移动
def moveright():
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,2,0)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, 2,0)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, 2,0)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line , 2, 0)

三、完整代码

import tkinter as tk
window = tk.Tk()
window.title('my window')
##窗口尺寸
window.geometry('300x350')
#新建画布
canvas=tk.Canvas(window,bg='blue',height=150,width=300)
#画线
x0,y0,x1,y1=50,50,80,80
line=canvas.create_line(x0,y0,x1,y1)
#画
oval=canvas.create_oval(x0,y0,x1,y1,fill='red')
#画一个扇形
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=90)
#画一个矩形
rect = canvas.create_rectangle(100, 30, 100+20, 30+20)
canvas.pack()
#创建文本框
entry = tk.Entry(window, show=None)
entry.pack()
#创建文本
label = tk.Label(window , text='圆:oval;线:line;扇形:arc;矩形 :rect')
label.pack()  #打包
#向下移动
def moveit():
    obj = entry.get()  #获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,0,2)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, 0, 2)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, 0, 2)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line, 0, 2)
#向上移动
def moveup():
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,0,-2)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc,0,-2)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval,0,-2)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line,0,-2)
#向左移动
def moveleft():
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect, -2 ,0)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, -2 ,0)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, -2 ,0)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line, -2, 0)
#向右移动
def moveright():
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,2,0)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, 2,0)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, 2,0)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line , 2, 0)
#创建一个Button
b=tk.Button(window,text='下',command=moveit)
b.place(x=120,y=280)
up=tk.Button(window,text='上',command=moveup)
up.place(x=120,y=220)
left=tk.Button(window,text='左',command=moveleft)
left.place(x=80,y=250)
right=tk.Button(window,text='右',command=moveright)
right.place(x=160,y=250)
##显示出来
window.mainloop()

四、升级—绑定键盘事件

增加键盘绑定事件:

# 实现键盘绑定
window.bind("<KeyPress-Down>", moveit)  #第二个参数传一个回调函数
window.bind("<KeyPress-Left>", moveleft)
window.bind("<KeyPress-Right>", moveright)
window.bind("<KeyPress-Up>", moveup)

完整代码:

import tkinter as tk
window = tk.Tk()
window.title('my window')
##窗口尺寸
window.geometry('300x350')
#新建画布
canvas=tk.Canvas(window,bg='blue',height=150,width=300)
#画线
x0,y0,x1,y1=50,50,80,80
line=canvas.create_line(x0,y0,x1,y1)
#画
oval=canvas.create_oval(x0,y0,x1,y1,fill='red')
#画一个扇形
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=90)
#画一个矩形
rect = canvas.create_rectangle(100, 30, 100+20, 30+20)
canvas.pack()
#创建文本框
entry = tk.Entry(window, show=None)
entry.pack()
#创建文本
label = tk.Label(window , text='圆:oval;线:line;扇形:arc;矩形 :rect')
label.pack()  #打包
#向下移动
def moveit(event):
    obj = entry.get()  #获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,0,2)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, 0, 2)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, 0, 2)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line, 0, 2)
#向上移动
def moveup(event):
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,0,-2)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc,0,-2)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval,0,-2)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line,0,-2)
#向左移动
def moveleft(event):
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect, -2 ,0)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, -2 ,0)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, -2 ,0)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line, -2, 0)
#向右移动
def moveright(event):
    obj = entry.get()  # 获取输入框的参数,移动那个图形
    if obj =='rect':
        canvas.move(rect,2,0)  #第一个参数是图形
    elif obj == 'arc':
        canvas.move(arc, 2,0)  # 第一个参数是图形
    elif obj =='oval':
        canvas.move(oval, 2,0)  # 第一个参数是图形
    elif obj == 'line':
        canvas.move(line , 2, 0)
#创建一个Button
b=tk.Button(window,text='下',command=moveit)
b.place(x=120,y=280)
up=tk.Button(window,text='上',command=moveup)
up.place(x=120,y=220)
left=tk.Button(window,text='左',command=moveleft)
left.place(x=80,y=250)
right=tk.Button(window,text='右',command=moveright)
right.place(x=160,y=250)
# 实现键盘绑定
window.bind("<KeyPress-Down>", moveit)  #第二个参数传一个回调函数
window.bind("<KeyPress-Left>", moveleft)
window.bind("<KeyPress-Right>", moveright)
window.bind("<KeyPress-Up>", moveup)
##显示出来
window.mainloop()

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • JS移动端/H5同时选择多张图片上传并使用canvas压缩图片

    最近在做一个H5的项目,里边涉及到拍照上传图片的功能以及识别图片的功能,这里对识别图片的功能不做赘述,不属本文范畴.我在做完并上线项目后,同事跟我提了一个要求是可不可以同时选择多张图片上传,我做的时候的想法是如果给file表单加了 multiple 属性就没有办法调用手机的摄像头拍照了,如果不加,就无法同时选择多张图片,于是我就照实跟同事说了这个情况.但回头一想,单张图片可以上传,那多张图片呢?于是就有了本文的内容. HTML5定义了 FileReader 作为文件 API 的重要成员用于读取文

  • Vue利用canvas实现移动端手写板的方法

    本文介绍了Vue利用canvas实现移动端手写板的方法,分享给大家,具体如下: <template> <div class="hello"> <!--touchstart,touchmove,touchend,touchcancel 这--> <button type="" v-on:click="clear">清除</button> <button v-on:click=&quo

  • vue使用canvas实现移动端手写签名

    基于vue使用canvas实现移动端手写签名! 之前自己开发有这么一个需求,需要实现手写签名,然后以图片的形式保存生成图片的base64数据流 .自己在网上找了一堆,都不是很完美.然后参考网上的加自己的优化和修改做了一版.希望有需要的朋友可以拿来直接用. HTML部分: <template> <div class="hello" > <div>请输入您的签名7:</div> <canvas id="canvas"

  • JavaScript canvas实现跟随鼠标移动小球

    本文实例为大家分享了js跟随鼠标移动小球的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> canvas{ border: 1px solid #000; } </style> </head> <body> <canvas

  • vue移动端使用canvas签名的实现

    效果 canvas画板移动端 .gif 需求   在一些项目业务中,经常会使用到画板,让用户自己去写/画一些东西做标示,比如说在线签电子合约.签名等,如果不用插件,那么如何使用h5的canvas画布来实现这一需求呢? [本篇只讨论移动端,PC端请看上篇] 分析   很明显,我们需要一个canvas,关于canvas的一些基本操作可以在w3school或者别的一些平台上熟悉一下,其实本例也是基础操作.本案例在vue中完成.(脱离vue也一样.) 首先,需要一个canvas画布 其次,考虑逻辑 把逻

  • vue+canvas实现移动端手写签名

    本文实例为大家分享了vue+canvas实现移动端手写签名的具体代码,供大家参考,具体内容如下 <template> <div class="sign"> <div class="header"> <i class="el-icon-arrow-left backImg" @click="goBack"></i> <span class="title&

  • 详解python使用canvas实现移动并绑定键盘

    目录 一.任务 二.实现 (1)导库并创建画布 (2)画图形 (3)创建按钮和文本框 (4)功能实现 三.完整代码 四.升级-绑定键盘事件 总结 一.任务 用多个按钮或者按钮+文本框实现不同物体(椭圆,长方形,扇形)的各个方向的运动(上下左右) 效果图: 二.实现 (1)导库并创建画布 import tkinter as tk window = tk.Tk() window.title('my window') ##窗口尺寸 window.geometry('300x350') #新建画布 ca

  • 详解Python如何实现批量为PDF添加水印

    目录 准备环境 获得经销商名字对应的列表 生成水印PDF 合并水印与目标PDF 总结 我们有时候需要把一些机密文件发给多个客户,为了避免客户泄露文件,会在机密文件中添加水印.每个客户收到的文件内容相同,但是水印都不相同.这样一来,如果资料泄露了,通过水印就知道是从谁手上泄露的. 今天,一个做市场的朋友找我咨询PDF加水印的问题,如下图所示: 他有一个Excel文件,文件里面有10000个经销商的名字,他要把价目表PDF发给这些经销商,每个经销商收到的PDF文件上面的水印都是这个经销商自己的名字.

  • 详解Python中matplotlib模块的绘图方式

    目录 1.matplotlib之父简介 2.matplotlib图形结构 3.matplotlib两种画绘图方法 方法一:使用matplotlib.pyplot 方法二:面向对象方法 1.matplotlib之父简介 matplotlib之父John D. Hunter已经去世,他的一生辉煌而短暂,但是他开发的的该开源库还在继续着辉煌.国内介绍的资料太少了,查阅了一番整理如下: 1968 出身于美国的田纳西州代尔斯堡. 之后求学于普林斯顿大学. 2003年发布Matplotlib 0.1版,初衷

  • 详解python里使用正则表达式的分组命名方式

    详解python里使用正则表达式的分组命名方式 分组匹配的模式,可以通过groups()来全部访问匹配的元组,也可以通过group()函数来按分组方式来访问,但是这里只能通过数字索引来访问,如果某一天产品经理需要修改需求,让你在它们之中添加一个分组,这样一来,就会导致匹配的数组的索引的变化,作为开发人员的你,必须得一行一行代码地修改.因此聪明的开发人员又想到一个好方法,把这些分组进行命名,只需要对名称进行访问分组,不通过索引来访问了,就可以避免这个问题.那么怎么样来命名呢?可以采用(?P<nam

  • 详解Python实现多进程异步事件驱动引擎

    本文介绍了详解Python实现多进程异步事件驱动引擎,分享给大家,具体如下: 多进程异步事件驱动逻辑 逻辑 code # -*- coding: utf-8 -*- ''' author: Jimmy contact: 234390130@qq.com file: eventEngine.py time: 2017/8/25 上午10:06 description: 多进程异步事件驱动引擎 ''' __author__ = 'Jimmy' from multiprocessing import

  • 详解Python import方法引入模块的实例

    详解Python import方法引入模块的实例 在Python用import或者from-import或者from-import-as-来导入相应的模块,作用和使用方法与C语言的include头文件类似.其实就是引入某些成熟的函数库和成熟的方法,避免重复造轮子,提高开发速度. python的import方法可以引入系统的模块,也可以引入我们自己写好的共用模块,这点和PHP非常相似,但是它们的具体细节还不是很一样.因为php是在引入的时候指明引入文件的具体路径,而python中不能够写文件路径进

  • 详解python中executemany和序列的使用方法

    详解python中executemany和序列的使用方法 一 代码 import sqlite3 persons=[ ("Jim","Green"), ("Hu","jie") ] conn=sqlite3.connect(":memory:") conn.execute("CREATE TABLE person(firstname,lastname)") conn.executeman

  • 详解Python 序列化Serialize 和 反序列化Deserialize

    详解Python 序列化Serialize 和 反序列化Deserialize 序列化 (serialization) 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化, 它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 序列化和反序列化的目的 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 3.使程序更具维护性 序列化   由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘

  • 详解python里使用正则表达式的全匹配功能

    详解python里使用正则表达式的全匹配功能 python中很多匹配,比如搜索任意位置的search()函数,搜索边界的match()函数,现在还需要学习一个全匹配函数,就是搜索的字符与内容全部匹配,它就是fullmatch()函数. 例子如下: #python 3.6 #蔡军生 #http://blog.csdn.net/caimouse/article/details/51749579 # import re text = 'This is some text -- with punctua

  • 详解python实现读取邮件数据并下载附件的实例

    详解python实现读取邮件数据并下载附件的实例 实现结果图: 实现代码: #!/usr/bin/python2.7 # _*_ coding: utf-8 _*_ """ @Author: MarkLiu """ import poplib import email from email.parser import Parser from email.header import decode_header from email.utils im

随机推荐