这是很早之前写的拼图游戏,基于Py/Tk,今天翻出来,然后重新整理,并且发布出来,供大家参考学习,自己看CSDN里有很多了类似的游戏代码,虽然代码逻辑上大同小异,但每个开发者都有自己独特的开发个性和习惯,这并无优劣,而且都可以从代码中都可以一窥究竟。下午整理代码的时候才发现之前写Code的时候,居然一句注释也没有加,搞得自己又重新梳理了一遍Code逻辑,才将注释全部添加上,不添加注释实在不是个好的习惯。虽然拼图小游戏虽然只有几百行的代码,但是对于了解Tkinter的模块以及熟悉Py编程却是既有好处,废话少说,直接上代码吧
1.类初始化
import random
import os
import Pmw
import time
from Tkinter import *
from PIL import Image,ImageTk
class image_crop():
#拼图游戏
def __init__(self):
self.now_path=os.getcwd()
self.num_page=0
2.设置--图片设置界面--游戏图片的选择
def image_set(self):
#设置界面关于拼图游戏中--游戏图片的选择
path1=[]
path_flod=self.now_path+"\image_\\"
for i in(os.listdir(path_flod)):
path1.append(path_flod+i)
main_frame1=self.root.grid_slaves(row=1,column=0)
main_frame1[0].grid_remove()
self.imageset_toplevel=Frame(self.root)
self.imageset_toplevel.grid(row=1,column=0,columnspan=3,rowspan=3,sticky=NSEW)
frame_titleimage=Frame(self.imageset_toplevel)
frame_titleimage.pack(side=TOP)
label_tag=Label(frame_titleimage,text=u"图片名称:",width=10,font=('Verdana bold',10))
label_tag.grid(row=0,column=0,sticky='ws')
self.image_name=StringVar()
label_name=Label(frame_titleimage,textvariable=self.image_name,width=20,font=('Verdana bold',10))
label_name.grid(row=0,column=1)
self.image_name.set(' ')
but=Button(frame_titleimage,text=u"确定",width=10,font=('Verdana bold',9),command=sure_comd)
but.grid(row=0,column=2)
self.widgets_group=Pmw.ScrolledFrame(self.imageset_toplevel,usehullsize=1,frame_relief="flat",hull_width=500,
hull_height=400,
scrollmargin=0)
self.widgets_group.pack(side=TOP,fill=BOTH,expand=1)
frame_page=Frame(self.imageset_toplevel)
frame_page.pack(side=TOP)
up_page=Button(frame_page,text=u"上一页",width=10,font=('Verdana bold',9),command=test_up)
up_page.pack(side=LEFT)
self.ent=StringVar()
entry_page=Entry(frame_page,width=10,font=('Verdana bold',10),textvariable=self.ent,state='readonly')
entry_page.pack(side=LEFT)
self.ent.set(u"第1页")
down_page=Button(frame_page,text=u"下一页",width=10,font=('Verdana bold',9),command=test_down)
down_page.pack(side=LEFT)
for i in range(3):
for j in range(3):
#生成图片标签Label
img_labelq=Label(self.widgets_group.interior(),borderwidth=2,relief='groove')
img_labelq.grid(row=i,column=j)
#加载图片
image_1(path1[0])
image_2(path1[1])
image_3(path1[2])
image_4(path1[3])
image_5(path1[4])
image_6(path1[5])
image_7(path1[6])
image_8(path1[7])
image_9(path1[8])
#注意:这里需要注意一下,图片文件至少需要大于9张,如果不是,系统报错,因为时间关系这块没有修改
3.设置---图片设置界面--鼠标选中图片后的操作
def comd_show(event,fr_,path_img):
#左键-选中图片后--加载图片名称
fr_.configure(relief='solid')
self.root.update()
time.sleep(0.2)
fr_.configure(relief='groove')
image_path=os.path.basename(path_img)
self.image_name.set(image_path.decode("cp936"))
def doublue_comd(event,path_img):
#右键-选中图片后--弹窗显示选中图片大图
imageshow_toplevel=Toplevel()
imageshow_toplevel.geometry('+400+140')
imageshow_toplevel.overrideredirect(0)
image_show=Image.open(path_img)
if image_show.size[1]>image_show.size[0]:
self.size_img_2=image_show.resize((350, 450))
elif image_show.size[1]<image_show.size[0]:
self.size_img_2=image_show.resize((450, 350))
self.showimage=ImageTk.PhotoImage(self.size_img_2)
img_label_show=Label(imageshow_toplevel,borderwidth=2,relief='groove',image=self.showimage)
img_label_show.grid(row=0,column=0)
4.设置---图片设置界面--所有图片包中图片显示模块
注:这部分代码虽然有些重复,有优化的地方,但逻辑上完备的,这里先将代码贴出来,如果读者有兴趣,可以将此部分优化
def image_1(path_image):
#图片选择器---加载第一张图片
image_set_1=Image.open(path_image)
if image_set_1.size[1]>image_set_1.size[0]:
self.size_img_1=image_set_1.resize((128, 170))
elif image_set_1.size[1]<image_set_1.size[0]:
self.size_img_1=image_set_1.resize((170, 128))
self.setimage_label_1=ImageTk.PhotoImage(self.size_img_1)
qws1=self.widgets_group.interior().grid_slaves(row=0,column=0)
qws1[0].configure(image=self.setimage_label_1,relief='groove')
qws1[0].bind("<Button-1>",lambda e,fr_=qws1[0],path_img=path_image: comd_show(e,fr_,path_img))
qws1[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
def image_2(path_image):
#图片选择器---加载第二张图片
image_set_2=Image.open(path_image)
if image_set_2.size[1]>image_set_2.size[0]:
self.size_img_2=image_set_2.resize((128, 170))
elif image_set_2.size[1]<image_set_2.size[0]:
self.size_img_2=image_set_2.resize((170, 128))
self.setimage_2=ImageTk.PhotoImage(self.size_img_2)
qws2=self.widgets_group.interior().grid_slaves(row=0,column=1)
qws2[0].configure(image=self.setimage_2,relief='groove')
qws2[0].bind("<Button-1>",lambda e,fr_=qws2[0],path_img=path_image: comd_show(e,fr_,path_img))
qws2[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
def image_3(path_image):
#图片选择器---加载第二张图片
image_set_3=Image.open(path_image)
if image_set_3.size[1]>image_set_3.size[0]:
self.size_img_3=image_set_3.resize((128, 170))
elif image_set_3.size[1]<image_set_3.size[0]:
self.size_img_3=image_set_3.resize((170, 128))
self.setimage_label_3=ImageTk.PhotoImage(self.size_img_3)
qws3=self.widgets_group.interior().grid_slaves(row=0,column=2)
qws3[0].configure(image=self.setimage_label_3,relief='groove')
qws3[0].bind("<Button-1>",lambda e,fr_=qws3[0],path_img=path_image: comd_show(e,fr_,path_img))
qws3[0].bind(