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("<>", lambda e: self.mainWindow.redrawImgView()) self.root.bind("",lambda e: self.sendMsg("prevFrame")) self.root.bind("",lambda e: self.sendMsg("nextFrame")) self.root.bind("",lambda e: Settings(self)) self.mainWindow.bind("",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("<>") 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()