Files
@ 0fd3bebe7462
Branch filter:
Location: OneEye/src/gui/__init__.py
0fd3bebe7462
3.5 KiB
text/x-python
export sample cells
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 120 121 122 123 124 125 126 | import os
import json
import logging
import threading
import tkinter as tk
import config
from .mainwindow import MainWindow
from .boardview import BoardView
from .settings import Settings
from util import exportBoard
log=logging.getLogger(__name__)
class GUI:
SETUP=PREVIEW=0
RECORDING=REAL=1
def __init__(self):
self.root = tk.Tk()
self.root.title("OneEye {0}.{1}.{2}".format(*config.misc.version))
self.root.option_add('*tearOff',False) # for menu
self._ownMessages=None
self._coreMessages=None
self._state=GUI.SETUP
self._board=[]
self._filename=""
self.mainWindow = MainWindow(self, master=self.root)
self.settings=None
self.root.columnconfigure(0,weight=1)
self.root.rowconfigure(0,weight=1)
self.root.bind("<<redrawImgView>>", lambda e: self.mainWindow.redrawImgView())
self.root.bind("<<setUp>>", lambda e: self.setUp())
self.root.bind("<<setRecording>>", lambda e: self.setRecording())
self.root.bind("<F12>",lambda e: Settings(self))
self.root.bind("s",lambda e: self._save())
self.mainWindow.bind("<Destroy>",lambda e: self._ownMessages.send("!kill",("gui",)))
self.setUp()
def __call__(self,ownMessages,coreMessages):
self._ownMessages=ownMessages
self._coreMessages=coreMessages
self.listenerThread=threading.Thread(target=lambda: ownMessages.listen(self._handleEvent))
self.listenerThread.start()
self.mainWindow.mainloop()
def sendMsg(self,actionName,args=tuple(),kwargs=None):
self._coreMessages.send(actionName,args,kwargs)
def setUp(self):
self.mainWindow.setUp()
self.root.bind("<Left>",lambda e: self.sendMsg("prevFrame"))
self.root.bind("<Right>",lambda e: self.sendMsg("nextFrame"))
def setRecording(self):
self.mainWindow.setRecording()
self.root.bind("<Left>",lambda e: None)
self.root.bind("<Right>",lambda e: None)
if self.settings:
self.settings.destroy()
self.settings=None
def _save(self):
board=exportBoard(self._board)
corners=[[p.x,p.y] for p in self.mainWindow.imgView.exportCorners()]
res={
self._filename: {
"board": board,
"corners": corners
}
}
with open(os.path.join(config.misc.imgDir,self._filename+".json"), mode="wt") as f:
json.dump(res,f,indent="\t")
def _handleEvent(self,e):
actions={
"setCurrentFrame": self._frameHandler,
"setGameState": self._stateHandler,
"setParams": self._paramsHandler
}
(actionName,args,kwargs)=e
return actions[actionName](*args,**kwargs)
def _frameHandler(self,newFrame,type,filename):
if self._state!=type: return
self._filename=filename
self.mainWindow.setCurrentFrame(newFrame)
self.root.event_generate("<<redrawImgView>>")
def _stateHandler(self,gameState,moves):
labels={(row,col):(i+1) for (i,(c,row,col)) in enumerate(moves)}
self._board=gameState
self.mainWindow.boardView.redrawState(gameState,labels)
def _paramsHandler(self,**params):
if not self.settings:
log.warning("received 'setParams' message while settings is '%s'",str(self.settings))
return
self.settings.setParams(**params)
gui=GUI()
"""
# setup #
* we can click around the ImgView
* we can walk through the frames back and forth
* BoardView is showing what the reading of ImgView _would_ be
* core is reading and analyzing frames, pushing results to StateBag, but not showing them
# recording #
* ImgView is showing the current picture, is not clickable
* BoardView is showing last detected position
* on switch to recording (if parameters have changed):
* feed analyzer new parameters and start using them
* in the background reanalyze cached frames with the new parameters and merge them into StateBag
"""
|