lab3q2.py
import sys
import random
import time
import tkinter as tk
class Gui:
def __init__(self, root):
self.root = root
self.col = 4
self.row = 4
self.frame0 = tk.Frame(self.root)
self.btnReset = tk.Button(self.frame0,text='Reset')
self.btnReset.bind('', self.reset)
self.btnReset.pack()
self.btnRandom = tk.Button(self.frame0,text='Randomize')
self.btnRandom.bind('', self.randomize)
self.btnRandom.pack()
self.frame1 = tk.Frame(self.root)
self.seq=[[0 for x in range(self.col)] for y in range(self.row)]
self.picture=[[0 for x in range(self.col)] for y in range(self.row)]
self.btn=[[0 for x in range(self.col)] for y in range(self.row)]
for x in range(self.col):
for y in range(self.row):
self.seq[x][y]=x*4+y
self.picture[x][y] = tk.PhotoImage(file='./ptr/'+str(x*4+y)+'.gif')
self.btn[x][y]=tk.Button(self.frame1, image=self.picture[x][y],
command= lambda x=x, y=y: self.doClick(x,y))
self.btn[x][y].image=self.picture[x][y]
self.btn[x][y].grid(column=x, row=y)
self.frame0.pack()
self.frame1.pack()
def toUp(self,x,y):
tmp=self.btn[x][y].image
self.btn[x][y].config(image = self.btn[x][y-1].image)
self.btn[x][y].image = self.btn[x][y-1].image
self.btn[x][y-1].config(image = tmp)
self.btn[x][y-1].image = tmp
self.seq[x][y],self.seq[x][y-1]=self.seq[x][y-1],self.seq[x][y]
def toDown(self,x,y):
tmp=self.btn[x][y].image
self.btn[x][y].config(image = self.btn[x][y+1].image)
self.btn[x][y].image = self.btn[x][y+1].image
self.btn[x][y+1].config(image = tmp)
self.btn[x][y+1].image = tmp
self.seq[x][y],self.seq[x][y+1]=self.seq[x][y+1],self.seq[x][y]
def toRight(self,x,y):
tmp = self.btn[x][y].image
self.btn[x][y].config(image = self.btn[x+1][y].image)
self.btn[x][y].image = self.btn[x+1][y].image
self.btn[x+1][y].config(image = tmp)
self.btn[x+1][y].image = tmp
self.seq[x][y],self.seq[x+1][y]=self.seq[x+1][y],self.seq[x][y]
def toLeft(self,x,y):
tmp = self.btn[x][y].image
self.btn[x][y].config(image = self.btn[x-1][y].image)
self.btn[x][y].image = self.btn[x-1][y].image
self.btn[x-1][y].config(image = tmp)
self.btn[x-1][y].image = tmp
self.seq[x][y],self.seq[x-1][y]=self.seq[x-1][y],self.seq[x][y]
def doClick(self,x, y):
if ((x == 0) and (y == 0)): #top left corner
if self.seq[x+1][y]==0:
self.toRight(x, y)
elif self.seq[x][y+1]==0:
self.toDown(x, y)
elif ((x == 0) and (y == self.row-1)): #bottom left corner
if self.seq[x+1][y]==0:
self.toRight(x, y)
elif self.seq[x][y-1]==0:
self.toUp(x, y)
elif (x == 0): #left column
if self.seq[x+1][y]==0:
self.toRight(x, y)
elif self.seq[x][y+1]==0:
self.toDown(x, y)
elif self.seq[x][y-1]==0:
self.toUp(x, y)
elif ( (x == self.col - 1 ) and (y == 0)): #top right corner
if self.seq[x-1][y]==0:
self.toLeft(x, y)
elif self.seq[x][y+1]==0:
self.toDown(x, y)
elif (y == 0): #top row
if self.seq[x+1][y]==0:
self.toRight(x, y)
elif self.seq[x-1][y]==0:
self.toLeft(x, y)
elif self.seq[x][y+1]==0:
self.toDown(x, y)
elif ((x==self.col-1) and (y==self.row-1)): #right bottom corner
if self.seq[x-1][y]==0:
self.toLeft(x, y)
elif self.seq[x][y-1]==0:
self.toUp(x, y)
elif (x == self.col - 1): #right column
if self.seq[x][y-1]==0:
self.toUp(x, y)
elif self.seq[x][y+1]==0:
self.toDown(x, y)
elif self.seq[x-1][y]==0:
self.toLeft(x, y)
elif (y == self.row - 1): #bottom row
if self.seq[x][y-1]==0:
self.toUp(x, y)
elif self.seq[x-1][y]==0:
self.toLeft(x, y)
elif self.seq[x+1][y]==0:
self.toRight(x, y)
else: #other positions
if self.seq[x-1][y]==0:
self.toLeft(x, y)
elif self.seq[x+1][y]==0:
self.toRight(x, y)
elif self.seq[x][y-1]==0:
self.toUp(x, y)
elif self.seq[x][y+1]==0:
self.toDown(x, y)
def reset(self, event):
for x in range(self.col):
for y in range(self.row):
self.seq[x][y]=x*4+y
self.btn[x][y].config(image = self.picture[x][y])
self.btn[x][y].image=self.picture[x][y]
self.root.update()
def randomize(self, event):
random.seed()
x = 0
y = 0
for i in range(100):
rand=random.random()
for j in range(1000000):pass
self.root.update()
if ((x == 0) and (y == 0)): #top left corner
if rand < 0.5:
self.toDown(x, y)
y += 1
else:
self.toRight(x, y)
x += 1
elif ((x == 0) and (y == self.row-1)): #bottom left corner
if rand < 0.5:
self.toUp(x, y)
y -= 1
else:
self.toRight(x, y)
x += 1
elif (x == 0): #left column
if rand < 0.333:
self.toDown(x, y)
y += 1
elif rand < 0.666:
self.toUp(x, y)
y -= 1
else:
self.toRight(x, y)
x += 1
elif ( (x == self.col - 1 ) and (y == 0)): #top right corner
if rand < 0.5:
self.toDown(x, y)
y += 1
else:
self.toLeft(x, y)
x -= 1
elif (y == 0): #top row
if rand < 0.333:
self.toRight(x, y)
x += 1
elif rand < 0.666:
self.toDown(x, y)
y += 1
else:
self.toLeft(x, y)
x -= 1
elif ((x==self.col-1) and (y==self.row-1)): #right bottom corner
if rand < 0.5:
self.toLeft(x, y)
x -= 1
else:
self.toUp(x, y)
y -= 1
elif (x == self.col - 1): #right column
if rand < 0.333:
self.toUp(x, y)
y -= 1
elif rand < 0.666:
self.toDown(x, y)
y += 1
else:
self.toLeft(x, y)
x -= 1
elif (y == self.row - 1): #bottom row
if rand < 0.333:
self.toUp(x, y)
y -= 1
elif rand < 0.666:
self.toLeft(x, y)
x -= 1
else:
self.toRight(x, y)
x += 1
else: #other positions
if rand < 0.25:
self.toLeft(x, y)
x -= 1
elif rand < 0.50:
self.toRight(x, y)
x += 1
elif rand < 0.75:
self.toUp(x, y)
y -= 1
else:
self.toDown(x, y)
y += 1
def main():
root = tk.Tk()
Gui(root)
root.mainloop()
if __name__ == '__main__':
sys.exit(main())