Files
@ 29f28718a69b
Branch filter:
Location: OneEye/src/gui/__init__.py - annotation
29f28718a69b
3.8 KiB
text/x-python
transitional data processing
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 127 128 129 130 131 132 133 134 | 18d23ce9a53f 18d23ce9a53f 0d57edb8be11 0d57edb8be11 0d57edb8be11 6f9ec51a8142 0d57edb8be11 0d57edb8be11 5f2136fcbebd 0d57edb8be11 18d23ce9a53f 18d23ce9a53f 0d57edb8be11 0d57edb8be11 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 0d57edb8be11 0d57edb8be11 0d57edb8be11 bc96e653888e 0d57edb8be11 6f9ec51a8142 2b850618ba88 6f9ec51a8142 6f9ec51a8142 8a0de753f06f 0d57edb8be11 0d57edb8be11 2b850618ba88 5a1d87ee0f8a 2b850618ba88 18d23ce9a53f 0d57edb8be11 0d57edb8be11 0d57edb8be11 0d57edb8be11 5a1d87ee0f8a 5a1d87ee0f8a 5f2136fcbebd dc1ed8ff56ef 0d57edb8be11 2b850618ba88 5a1d87ee0f8a 0d57edb8be11 8a0de753f06f 0d57edb8be11 0d57edb8be11 dc1ed8ff56ef dc1ed8ff56ef 0d57edb8be11 0d57edb8be11 0d57edb8be11 0d57edb8be11 0d57edb8be11 0d57edb8be11 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 2b850618ba88 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 18d23ce9a53f 18d23ce9a53f 18d23ce9a53f 2b850618ba88 2b850618ba88 6f9ec51a8142 6f9ec51a8142 6f9ec51a8142 5a1d87ee0f8a 2b850618ba88 2b850618ba88 2b850618ba88 2b850618ba88 dc1ed8ff56ef dc1ed8ff56ef dc1ed8ff56ef dc1ed8ff56ef dc1ed8ff56ef 0d57edb8be11 18d23ce9a53f 52d1a214c032 18d23ce9a53f 18d23ce9a53f 18d23ce9a53f 0d57edb8be11 0d57edb8be11 0d57edb8be11 0d57edb8be11 52d1a214c032 6f9ec51a8142 52d1a214c032 d5d8fe073c1c 2b850618ba88 6f9ec51a8142 52d1a214c032 0d57edb8be11 0d57edb8be11 9ab11204b0f9 2b850618ba88 2b850618ba88 2b850618ba88 9ab11204b0f9 9ab11204b0f9 0d57edb8be11 6f9ec51a8142 18d23ce9a53f 18d23ce9a53f 18d23ce9a53f 6f9ec51a8142 6f9ec51a8142 18d23ce9a53f 18d23ce9a53f 0d57edb8be11 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a 5a1d87ee0f8a | import logging
import threading
import tkinter as tk
import config
from analyzer import ImageAnalyzer
from .mainwindow import MainWindow
from .boardview import BoardView
from .settings import Settings
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.detector=ImageAnalyzer()
self._frame=None
self._frameKey=0
self._ownMessages=None
self._coreMessages=None
self._state=GUI.RECORDING
self.mainWindow = MainWindow(self)
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.mainWindow.bind("<Destroy>",lambda e: self._shutDown())
self.setRecording()
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"))
self._state=GUI.SETUP
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
if self._coreMessages: self.sendParams()
self._state=GUI.RECORDING
def sendParams(self):
self.sendMsg("setParams",(self.detector.params.copy(),))
def preview(self):
if self.detector.analyze(self._frame):
self.mainWindow.boardView.redrawState(self.detector.board)
def _shutDown(self):
log.info("GUI proc exiting.")
self._ownMessages.send("!kill",("gui",))
self._listenerThread.join()
def _handleEvent(self,e):
actions={
"setFrame": self._frameHandler,
"setGameState": self._stateHandler,
"setParams": self._paramsHandler
}
(actionName,args,kwargs)=e
return actions[actionName](*args,**kwargs)
def _frameHandler(self,frame,type,key):
if self._state!=type and self.mainWindow.imgView.isSet():
log.info("ignored setFrame event, wrong type")
return
self._frame=frame
self._frameKey=key
self.mainWindow.setFrame(frame)
self.root.event_generate("<<redrawImgView>>")
def _stateHandler(self,gameState,moves):
if self._state==GUI.SETUP:
log.info("ignored incoming gameState")
return
labels={(row,col):(i+1) for (i,(c,row,col)) in enumerate(moves)}
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.detector.setParams(params)
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
"""
|