今天我们利用canvas绘制、删除图片的的函数,以及鼠标事件的绑定来制作一个简单的九宫格拼图游戏。

首先从网上下九张图,它们是把一张图分割成了九宫图,打乱后显示在canvas画布上。

接下来我们只要实现图片的选中与拖动即可,用到了鼠标左键、按下并拖动左键、鼠标右键和鼠标移动四个事件的绑定。

其他的并不难,直接看完整代码和注释吧:

from tkinter import *

import tkinter as tk

from PIL import Image, ImageTk

import random

a=0 #用来记录绘制的图片编号,其中1-9为初始的9张

List = [1,2,3,4,5,6,7,8,9]

random.shuffle(List) #打乱图片顺序

root = Tk()

root.title("拼图游戏")

root.geometry("1400x690")

canvas = Canvas(root,width=1400, height=690)

canvas.pack()

#获得鼠标位置

def callback(event):

global x,y

x = event.x

y = event.y

#删除刚绘制的图片

def delete(event):

try:

if a>14: #前九张和五条边界线不能删除

canvas.delete(a)

except:

return

#根据鼠标位置,确定当前区域,即选中的图片编号

def pick(event):

global a

if x<=230 and y<=230:

a=1

elif 230

a=2

elif 460

a=3

elif x<=230 and 230

a=4

elif 230

a=5

elif 460

a=6

elif x<=230 and 460

a=7

elif 230

a=8

elif 460

a=9

#删除并重新绘制选中的图片

def call(event):

global a,aa

if a>14: #原图和边界线不删除

canvas.delete(a)

exec('canvas.create_image(x,y,image=var{})'.format(i))

a=aa+1 #记录新的图片编号,aa的初始值为14

aa+=1

#九张图片的位置,以图片中心点为基准

lc=[[115,115],[230+115,115],[460+115,115],[115,230+115],[230+115,230+115],[460+115,230+115],[115,460+115],[230+115,460+115],[460+115,460+115]]

#绘制初始九张图

for j in range(1,10):

load = Image.open("pt/%s.png"%List[j-1])

exec('var{}= ImageTk.PhotoImage(load)'.format(j)) #批量创建变量

exec('canvas.create_image(lc[j-1][0],lc[j-1][1],image=var{})'.format(j))

#绘制初始五条边界线

canvas.create_line(690,0,690,690)

canvas.create_line(690,230,1400,230,fill="white")

canvas.create_line(690,460,1400,460,fill="white")

canvas.create_line(920,0,920,690,fill="white")

aa=canvas.create_line(1150,0,1150,690,fill="white")

#绑定鼠标事件

canvas.bind("",call) #拖动左键,移动图片

canvas.bind("",pick) #点击左键,确定图片编号

canvas.bind("",delete) #右键删除

root.bind("",callback) #移动鼠标获取坐标

root.mainloop()

注意事项:

代码中的难点是如何动态创建变量。exec('canvas.create_image(x,y,image=var{})'.format(i))

之所以必须动态创建,是因为用上面这句赋给image值的时候,传进来的变量不能在后续发生改变,否则就会显示不出图片。因此显示九张图,就得创建九个变量var1、var2……var9,而不能用同一个变量给image传值。为了简便,我们只能动态地创建变量和调用。

另外,注意call函数中,之所以通过aa来给a赋值,而不是直接用:exec('a=canvas.create_image(x,y,image=var{})'.format(i))

原因在于,exec里面赋值语句是不生效的(我也不知道为啥),a不会在里面被赋值。

成果展示:https://www.zhihu.com/video/1243626378958036992

其实拼图游戏只是次要的,重点是怎么用tkinter实现图片的拖动效果。如果真的想做拼图游戏的话,完全可以用点击对应区域的方法,让图片位置更新,而且摆放的位置肯定比手动拖的更加精准。

python设计拼图游戏tkinter_tkinter做一个拼图游戏相关推荐

  1. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  2. python大作业数独_python做一个数独小游戏

    最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...

  3. 用 Python 做一个 H5 游戏机器人

    原文地址:Creating An HTML5 Game Bot Using Python 原文作者:vesche 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- ...

  4. 做一个FLASH游戏你需要掌握的东西【实用】

    做一个FLASH游戏你需要掌握的东西 作者:jianzhong 一直想着什么时间好好做一个像样点的游戏,于是刻意的开始去了解FLASHGAME的相关资料,在这里把自己在整个制作和收集过程中的一些感觉使 ...

  5. 单枪匹马:4年只做一个iOS游戏 收入破千万美元

    2011 年,一款叫做<Tiny Wings>的手游被苹果推荐为最佳 iPhone 游戏,对手游市场有所了解的同学一定会赞同<Tiny Wings>是过去几年中全球知名度仅次于 ...

  6. Python设计和实现聪明的尼姆游戏

    Python设计和实现聪明的尼姆游戏 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品 ...

  7. 用 JS 做一个数独游戏(二)

    用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...

  8. scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...

    导语 如何做一个多线程游戏框架?腾讯游戏学院专家Tao将在本文通过一个demo来说说游戏逻辑的多线程化. 众所周知现在各种游戏终端的发展十分迅猛.其中一个共同的特征是"多核化",由 ...

  9. 利用python加上ffmpeg,ffmpy,做一个音视频格式转换器

    利用python加上ffmpeg,可以做一个简单的音乐或者视频格式转换器. 可以利用PyQt5做界面,本例中比较简单: 流程非常简单,点击"选择源文件",选取要转换的音频或者视频文 ...

最新文章

  1. java2实用教程--第二章基本数据类型与数组
  2. 在Python中,如何确定对象是否可迭代?
  3. Python监听剪切板的两种方法
  4. 全国计算机等级考试题库二级C操作题100套(第35套)
  5. System.Text.Json 自定义 Conveter
  6. 王道考研 计算机网络18 私有IP地址 网络地址转发NAT 路由器 路由表 路由转发
  7. java输出结果校验_2. Bean Validation声明式校验方法的参数、返回值
  8. Java计算两个经纬度间的距离
  9. 设置不输入密码ssh登录
  10. 【JQuery NoviceToNinja系列】目录
  11. 201671010139 徐楠 关于学习继承
  12. Synchronized的底层实现原理(看这篇就够了)
  13. QQ for linux不用udp8000端口?
  14. linux挂载ipsan存储,centos系统ISCSI挂载IPSAN存储
  15. FineBI 新增字段后 更新缓慢问题
  16. TestCase和TestSuite详解
  17. 深度揭秘阿里云函数计算异步任务能力
  18. 计算机的问卷调查的题目,新颖的调查问卷的题目
  19. Kali社会工程学套件入侵Windows
  20. nginx架构(修改版)

热门文章

  1. win8回收站里的文件删除了怎么恢复
  2. Android布局初学习
  3. Java面向对象笔记:【第一章 面向对象】
  4. 任务态fMRI重测信度能有多低?
  5. style.cssText
  6. H5上传照片调用相册拍照(附源码)
  7. 武汉东方y神话服饰有限公司
  8. 判断QQ,微信,微博是否安装
  9. Django跨域CROS
  10. Vue Router 组件内的守卫、导航解析流程