Files @ eb6c3126cf26
Branch filter:

Location: OneEye/src/gui/__init__.py - annotation

Laman
StateBag: optimized estimateDistance, tests for dealing with wrong states
import threading
import tkinter as tk

import config
from .mainwindow import MainWindow
from .boardview import BoardView
from .settings import Settings


class GUI:
	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.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("<F12>",lambda e: Settings(self))
		self.mainWindow.bind("<Destroy>",lambda e: self._ownMessages.send("!kill",("gui",)))

	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 _handleEvent(self,e):
		actions={"setCurrentFrame":self._frameHandler, "setGameState":self._stateHandler}
		(actionName,args,kwargs)=e

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

	def _frameHandler(self,newFrame):
		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.mainWindow.boardView.redrawState(gameState,labels)

gui=GUI()