# helloworld.py import pygubu import sys import os sys.path.insert(0, "GUI/TKinter/.") from interpreter import imageWrapper as imageWrapper from interpreter import lexer as lexer from interpreter import tokens as lexerTokens from interpreter import colors as colors from interpreter import movement as movement from interpreter import executionFunctions as main from interpreter.dataStructures import programState, direction, position import threading from GUI import infoManager from GUI import canvasManager class GUI: def __init__(self): # In pixelWidth/height per pixel. scaleSize = 25 means that every pixel will show as a 25x25 square self.scaleSize = 25 # In percentage self.executionSpeed = 15 # In seconds self.maxWait = 5 self.image = None self.graph = None self.programState = None self.selectedPosition = None self.optionBar = None self.actionBar = None self.content = None self.canvas = None #1: Create a builder self.builder = builder = pygubu.Builder() #2: Load an ui file builder.add_from_file("{}/tkinterLayout.ui".format(os.path.abspath(os.path.dirname(__file__)))) #3: Create the mainwindow self.mainwindow = builder.get_object('rootWindow') self.initializeFrames() self.initializeCallbacks() self.infoManager = infoManager.infoManager(self.builder, self.generalInfoFrame, self.programStateInfoFrame) self.canvasManager = canvasManager.canvasManager(self.canvas, self.image, self.programState, self.scaleSize) def run(self): self.mainwindow.mainloop() def initializeCallbacks(self): self.builder.connect_callbacks({ 'loadFile': self.loadFile, 'setScale': self.setScale, 'takeStep': self.takeStep, 'setExecutionSpeed': self.setExecutionSpeed, 'setBreakpoint': self.setBreakpoint, 'runProgram': self.runProgram, 'updateHighlight': self.toggleHighlight }) self.canvas.bind("", self.canvasPressed) def initializeFrames(self): self.optionBar = self.builder.get_object('optionBar', self.mainwindow) self.content = self.builder.get_object('content', self.mainwindow) self.actionBar = self.builder.get_object('actionBar', self.mainwindow) self.generalInfoFrame = self.builder.get_object("generalInfoFrame", self.content) self.programStateInfoFrame = self.builder.get_object("programStateInfoFrame", self.content) canvasFrame = self.builder.get_object('canvasFrame', self.content) self.canvas = self.builder.get_object('canvas', canvasFrame) def update(self): self.infoManager.updateInfo(self.image, self.graph, self.programState) self.canvasManager.updateScaleSize(self.scaleSize) self.canvasManager.updateImage(self.image) self.canvasManager.updateProgramState(self.programState) self.canvasManager.updateCanvas() def takeStep(self): if self.image is None or self.programState is None or self.graph is None: return None newProgramState = main.takeStep(self.image, self.programState) if isinstance(newProgramState, bool): return False self.programState = newProgramState self.selectedPosition = self.programState.position self.update() print("Take step!") return True def setBreakpoint(self): print("BREAKPOINT") def setFileText(self, filePath): print("Filepath: {}".format(filePath)) self.builder.get_object("fileNameEntry", self.optionBar).delete(0, len(self.builder.get_object("fileNameEntry", self.optionBar).get())) self.builder.get_object("fileNameEntry", self.optionBar).insert(0, filePath) print("Get filepath: {}".format(self.builder.get_object("fileNameEntry", self.optionBar).get())) def setExecutionSpeed(self, pos): if 0 < float(pos) < 100: self.executionSpeed = float(pos) def toggleHighlight(self): print(self.builder.get_object("highlightEdgeCheck", self.actionBar).instate(['selected'])) def getWaitTime(self): return self.executionSpeed/100*self.maxWait def runProgram(self): if self.graph is None or self.image is None: return None step = self.takeStep() if step: timer = threading.Timer(self.getWaitTime(), self.runProgram) timer.start() return True else: return False def setScale(self): scaleValue = int(self.builder.get_object('scaleEntry', self.optionBar).get()) if 0 < scaleValue < 100: self.scaleSize = int(scaleValue) self.update() print("SCALE") def loadFile(self): fileName = self.builder.get_object('fileNameEntry', self.optionBar).get() if len(fileName) < 1: return None self.image = imageWrapper.getImage(fileName) self.graph = lexer.graphImage(self.image)[0] self.programState = programState(self.graph, position((0,0)), direction((0,0))) self.update() print("LOAD FILE!") def canvasPressed(self, event): unscaled_x = int(event.x / self.scaleSize) unscaled_y = int(event.y / self.scaleSize) self.selectedPosition = (unscaled_x, unscaled_y) self.update() if __name__ == '__main__': app = GUI() app.run()