Changeset - eb2effd8ec35
[Not reviewed]
default
0 2 0
Laman - 10 years ago 2015-08-23 22:09:28

GUI modifications
removed Hello World
added correct handling for clicked board corners
added board for showing the detected game state
2 files changed with 73 insertions and 24 deletions:
0 comments (0 inline, 0 general)
.hgignore
Show inline comments
 
^images/
 
^__pycache__/
 
\ No newline at end of file
 
^src/__pycache__/
 
\ No newline at end of file
src/gui.py
Show inline comments
 
import tkinter as tk
 
from PIL import ImageTk
 
import PIL
 
import math
 
 
 
class EPoint:
 
  def __init__(self,x,y):
 
    self.x=x
 
    self.y=y
 
  
 
  def dist(self,a):
 
    return math.sqrt((self.x-a.x)**2+(self.y-a.y)**2)
 
    
 
  def __str__(self): return "({0},{1})".format(self.x,self.y)
 
  def __repr__(self): return "EPoint({0},{1})".format(self.x,self.y)
 
 
 
class Application(tk.Frame):
 
  def __init__(self, master=None):
 
    self.corners=[]
 
    
 
    tk.Frame.__init__(self, master)
 
    self.pack()
 
    self.grid(column=0,row=0)
 
    self.createWidgets()
 
 
  def createWidgets(self):
 
    self.hi_there = tk.Button(self)
 
    self.hi_there["text"] = "Hello World\n(click me)"
 
    self.hi_there["command"] = self.say_hi
 
    self.hi_there.pack(side="top")
 
    
 
    self.canvas=tk.Canvas(self)
 
    self.canvas.configure(width=480,height=360,background="#ff4444")
 
    # a captured frame with overlay graphics
 
    self.imgView=tk.Canvas(self)
 
    self.imgView.configure(width=480,height=360)
 
    imgOrig=PIL.Image.open("../images/1.jpg")
 
    self.img=ImageTk.PhotoImage(imgOrig.resize((int(self.canvas['width']),int(self.canvas['height'])),resample=PIL.Image.BILINEAR))
 
    self.img=ImageTk.PhotoImage(imgOrig.resize((int(self.imgView['width']),int(self.imgView['height'])),resample=PIL.Image.BILINEAR))
 
    
 
    self.canvas.bind('<1>',lambda e: self.addCorner(e.x,e.y))
 
    self.canvas.create_image(2,2,anchor="nw",image=self.img)
 
    self.canvas.create_line(30,30,40,40,fill="#00ff00")
 
    self.canvas.create_line(30,40,40,30,fill="#00ff00")
 
    self.imgView.bind('<1>',lambda e: self.addCorner(e.x,e.y))
 
    self.redrawImgView()
 
    
 
    self.canvas.pack()
 
 
    self.QUIT = tk.Button(self, text="QUIT", fg="red", command=root.destroy)
 
    self.QUIT.pack(side="bottom")
 
 
  def say_hi(self):
 
    print("hi there, everyone!")
 
    self.imgView.grid(column=0,row=0)
 
    
 
    # board with detected stones
 
    self.boardView=BoardView(self)
 
    self.boardView.grid(column=1,row=0)
 
    
 
  def addCorner(self,x,y):
 
    a=EPoint(x,y)
 
    for i,c in enumerate(self.corners): # move an improperly placed point
 
      if a.dist(c)<20:
 
        self.corners[i]=a
 
        # print(self.corners)
 
        self.redrawImgView()
 
        return
 
    
 
    if len(self.corners)<4: # add a new corner
 
      self.corners.append(a)
 
      return
 
      # print(self.corners)
 
      self.redrawImgView()
 
    
 
    if len(self.corners)<4: return
 
    
 
    index,minDist=0,float('inf') # replace the corner closest to the clicked point
 
    for i,c in enumerate(self.corners):
 
      if a.dist(c)<minDist:
 
        index,minDist=i,a.dist(c)
 
    
 
    self.corners[index]=a
 
    print(self.corners)
 
    # print(self.corners)
 
    
 
    self.redrawImgView()
 
    
 
  def redrawImgView(self):
 
    self.imgView.create_image(2,2,anchor="nw",image=self.img)
 
    for corner in self.corners:
 
      self.markPoint(corner.x,corner.y)
 
    
 
    self.imgView.grid()
 
    
 
  def markPoint(self,x,y):
 
    self.imgView.create_line(x-3,y-3,x+4,y+4,fill="#00ff00")
 
    self.imgView.create_line(x-3,y+3,x+4,y-4,fill="#00ff00")
 
    
 
    self.imgView.grid()
 
 
 
class BoardView(tk.Canvas):
 
  def __init__(self, master=None):
 
    tk.Canvas.__init__(self, master)
 
    self.configure(width=360,height=360,background="#ffcc00")
 
    
 
    self.drawGrid()
 
    self.drawStones()
 
    
 
  def redrawGrid(self):
 
    self.grid()
 
    
 
  def drawGrid(self):
 
    for i in range(19):
 
      self.create_line(18,18*(i+1),360-18,18*(i+1),fill="#000000") # rows
 
      self.create_line(18*(i+1),18,18*(i+1),360-18,fill="#000000") # cols
 
      
 
    self.drawStars()
 
      
 
  def drawStars(self):
 
    for r in range(4,19,6):
 
      for c in range(4,19,6):
 
        self.create_oval(r*18-2,c*18-2,r*18+2,c*18+2,fill='#000000')
 
      
 
  def drawStones(self):
 
    pass
 
      
 
  ## Draws a stone at provided coordinates.
 
  #  
 
  #  @param r row coordinate, [0-18], counted from top
 
  #  @param c column coordinate, [0-18], counted from left
 
  #  @param color color indicator, {'b','w'}
 
  def drawStone(self,r,c,color):
 
    self.create_oval(r*18-9,c*18-9,r*18+9,r*18+9,'#000000' if color=='b' else '#ffffff')
 
 
 
root = tk.Tk()
 
app = Application(master=root)
 
app.mainloop()
0 comments (0 inline, 0 general)