Changeset - 5a1d87ee0f8a
[Not reviewed]
default
0 4 1
Laman - 6 years ago 2018-12-07 16:58:56

splitting setup mode and recording mode
5 files changed with 86 insertions and 5 deletions:
0 comments (0 inline, 0 general)
src/core.py
Show inline comments
 
@@ -47,8 +47,12 @@ class Core:
 
		self._imgIndex=(self._imgIndex+step)%len(self._imgs)
 
		imgPath=os.path.join(cfg.misc.imgDir,self._imgs[self._imgIndex])
 
		self._frame=PIL.Image.open(imgPath)
 
		self._guiMessages.send("setCurrentFrame",(self._frame.copy(),))
 
		self.analyze()
 
		self._guiMessages.send("setCurrentFrame",(self._frame.copy(),gui.PREVIEW))
 
		self.preview()
 

	
 
	def preview(self):
 
		if self.detector.analyze(self._frame):
 
			self._guiMessages.send("setGameState", (self.detector.board,[]))
 

	
 
	def analyze(self):
 
		if self.detector.analyze(self._frame):
src/gui/__init__.py
Show inline comments
 
@@ -8,6 +8,9 @@ from .settings import Settings
 

	
 

	
 
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))
 
@@ -16,16 +19,20 @@ class GUI:
 
		self._ownMessages=None
 
		self._coreMessages=None
 

	
 
		self._state=GUI.SETUP
 

	
 
		self.mainWindow = MainWindow(self, master=self.root)
 
		self.root.columnconfigure(0,weight=1)
 
		self.root.rowconfigure(0,weight=1)
 

	
 
		self.root.bind("<<redrawImgView>>", lambda e: self.mainWindow.redrawImgView())
 
		self.root.bind("<Left>",lambda e: self.sendMsg("prevFrame"))
 
		self.root.bind("<Right>",lambda e: self.sendMsg("nextFrame"))
 
		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._ownMessages.send("!kill",("gui",)))
 

	
 
		self.setUp()
 

	
 
	def __call__(self,ownMessages,coreMessages):
 
		self._ownMessages=ownMessages
 
		self._coreMessages=coreMessages
 
@@ -38,13 +45,24 @@ class GUI:
 
	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)
 

	
 
	def _handleEvent(self,e):
 
		actions={"setCurrentFrame":self._frameHandler, "setGameState":self._stateHandler}
 
		(actionName,args,kwargs)=e
 

	
 
		return actions[actionName](*args,**kwargs)
 

	
 
	def _frameHandler(self,newFrame):
 
	def _frameHandler(self,newFrame,type):
 
		if self._state!=type: return
 
		self.mainWindow.setCurrentFrame(newFrame)
 
		self.root.event_generate("<<redrawImgView>>")
 

	
 
@@ -53,3 +71,18 @@ class GUI:
 
		self.mainWindow.boardView.redrawState(gameState,labels)
 

	
 
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
 
"""
src/gui/imgview.py
Show inline comments
 
@@ -75,6 +75,12 @@ class ImgView(ResizableCanvas):
 
		self.create_line(x-3,y-3,x+4,y+4,fill="#00ff00")
 
		self.create_line(x-3,y+3,x+4,y-4,fill="#00ff00")
 

	
 
	def setUp(self):
 
		self.bind('<1>',lambda e: self.addCorner(e.x,e.y))
 

	
 
	def setRecording(self):
 
		self.bind('<1>',lambda e: None)
 

	
 
	def _onResize(self,event):
 
		w=self._width
 
		super()._onResize(event)
src/gui/mainwindow.py
Show inline comments
 
@@ -5,6 +5,7 @@ from .util import MsgMixin
 
from .menu import MainMenu
 
from .boardview import BoardView
 
from .imgview import ImgView
 
from .statusbar import StatusBar
 

	
 

	
 
class MainWindow(tk.Frame,MsgMixin):
 
@@ -38,9 +39,22 @@ class MainWindow(tk.Frame,MsgMixin):
 
		self.columnconfigure(1,weight=1)
 
		self.rowconfigure(0,weight=1)
 

	
 
		self._statusBar=StatusBar(self)
 
		self._statusBar.grid(column=0,row=1,columnspan=2,sticky=(S,E,W))
 

	
 
		self.rowconfigure(1,weight=0)
 

	
 
		# render everything
 
		self.imgView.redraw()
 

	
 
	## Redraws the current image and its overlay.
 
	def redrawImgView(self):
 
		self.imgView.redraw()
 

	
 
	def setUp(self):
 
		self._statusBar.setUp()
 
		self.imgView.setUp()
 

	
 
	def setRecording(self):
 
		self._statusBar.setRecording()
 
		self.imgView.setRecording()
src/gui/statusbar.py
Show inline comments
 
new file 100644
 
import tkinter as tk
 
from tkinter import LEFT,DISABLED,NORMAL
 

	
 

	
 
class StatusBar(tk.Frame):
 
	def __init__(self,parent):
 
		super().__init__(parent,width=480,height=20,borderwidth=1,relief="sunken")
 
		self._parent=parent
 
		self._createWidgets()
 

	
 
	def _createWidgets(self):
 
		self._setupButton=tk.Button(self,text="[] Set up",command=lambda: self.event_generate("<<setUp>>"),state=DISABLED)
 
		self._setupButton.pack(side=LEFT)
 

	
 
		self._recordButton=tk.Button(self,text="> Record",command=lambda: self.event_generate("<<setRecording>>"))
 
		self._recordButton.pack(side=LEFT)
 

	
 
	def setUp(self):
 
		self._setupButton.config(state=DISABLED)
 
		self._recordButton.config(state=NORMAL)
 

	
 
	def setRecording(self):
 
		self._setupButton.config(state=NORMAL)
 
		self._recordButton.config(state=DISABLED)
0 comments (0 inline, 0 general)