Files
@ eb2effd8ec35
Branch filter:
Location: OneEye/src/gui.py
eb2effd8ec35
3.3 KiB
text/x-python
GUI modifications
removed Hello World
added correct handling for clicked board corners
added board for showing the detected game state
removed Hello World
added correct handling for clicked board corners
added board for showing the detected game state
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 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.grid(column=0,row=0)
self.createWidgets()
def createWidgets(self):
# 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.imgView['width']),int(self.imgView['height'])),resample=PIL.Image.BILINEAR))
self.imgView.bind('<1>',lambda e: self.addCorner(e.x,e.y))
self.redrawImgView()
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)
# 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)
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()
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()
|