From aa218988fd0074b4850d391537655c56e73e71ab Mon Sep 17 00:00:00 2001 From: LSaldyt Date: Sat, 21 Oct 2017 14:12:42 -0700 Subject: [PATCH] Adds play/pause button --- copycat/copycat.py | 36 +++++++++++++++++++++--------------- copycat/gui/control.py | 22 ++++++++++++++++++++++ copycat/gui/primary.py | 11 +++++++++-- copycat/gui/status.py | 2 +- 4 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 copycat/gui/control.py diff --git a/copycat/copycat.py b/copycat/copycat.py index f3192be..458da74 100644 --- a/copycat/copycat.py +++ b/copycat/copycat.py @@ -34,26 +34,33 @@ class Copycat(object): self.reporter = reporter or Reporter() self.showgui = showgui self.gui = GUI('Copycat') + self.lastUpdate = float('-inf') - def mainLoop(self, lastUpdate): + def step(self): + if (not self.showgui) or (self.showgui and not self.gui.app.primary.control.paused): + self.coderack.chooseAndRunCodelet() + self.reporter.report_coderack(self.coderack) + self.reporter.report_temperature(self.temperature) + self.reporter.report_workspace(self.workspace) + + def update_workspace(self, currentTime): + self.workspace.updateEverything() + self.coderack.updateCodelets() + self.slipnet.update(self.random) + self.temperature.update(self.workspace.getUpdatedTemperature()) + self.lastUpdate = currentTime + self.reporter.report_slipnet(self.slipnet) + + def mainLoop(self): currentTime = self.coderack.codeletsRun self.temperature.tryUnclamp(currentTime) # Every 15 codelets, we update the workspace. - if currentTime >= lastUpdate + 15: - self.workspace.updateEverything() - self.coderack.updateCodelets() - self.slipnet.update(self.random) - self.temperature.update(self.workspace.getUpdatedTemperature()) - lastUpdate = currentTime - self.reporter.report_slipnet(self.slipnet) - self.coderack.chooseAndRunCodelet() - self.reporter.report_coderack(self.coderack) - self.reporter.report_temperature(self.temperature) - self.reporter.report_workspace(self.workspace) + if currentTime >= self.lastUpdate + 15: + self.update_workspace(currentTime) + self.step() if self.showgui: self.gui.update(self) - return lastUpdate def runTrial(self): """Run a trial of the copycat algorithm""" @@ -61,9 +68,8 @@ class Copycat(object): self.slipnet.reset() self.temperature.reset() self.workspace.reset() - lastUpdate = float('-inf') while self.workspace.finalAnswer is None: - lastUpdate = self.mainLoop(lastUpdate) + self.mainLoop() answer = { 'answer': self.workspace.finalAnswer, 'temp': self.temperature.last_unclamped_value, diff --git a/copycat/gui/control.py b/copycat/gui/control.py new file mode 100644 index 0000000..98ea173 --- /dev/null +++ b/copycat/gui/control.py @@ -0,0 +1,22 @@ +import tkinter as tk +import tkinter.ttk as ttk + +class Control(ttk.Frame): + def __init__(self, parent, *args, **kwargs): + tk.Frame.__init__(self, parent, *args, **kwargs) + + self.paused = True + + #self.style = ttk.Style() + #self.style.configure('TButton', background='black', foreground='white') + + #self.playbutton = ttk.Button(self, text='Play/Pause', command=lambda : self.play()) + self.playbutton = tk.Button(self, text='Play', command=lambda : self.toggle(), background='black', foreground='white', activebackground='black', activeforeground='blue') + self.playbutton.grid(column=0, row=0, stick=tk.N+tk.E+tk.S+tk.W) + self.rowconfigure(0, weight=1) + self.columnconfigure(0, weight=1) + + def toggle(self): + self.paused = not self.paused + self.playbutton['text'] = 'Pause' if not self.paused else 'Play' + #def step(self): diff --git a/copycat/gui/primary.py b/copycat/gui/primary.py index 22f86a4..73c1468 100644 --- a/copycat/gui/primary.py +++ b/copycat/gui/primary.py @@ -4,6 +4,8 @@ import tkinter.ttk as ttk from tkinter import scrolledtext from tkinter import filedialog +from .control import Control + font1Size = 32 font2Size = 16 font1 = ('Helvetica', str(font1Size)) @@ -47,12 +49,17 @@ class Primary(ttk.Frame): ttk.Frame.__init__(self, parent, *args, **kwargs) self.canvas = create_main_canvas(self, 'abc', 'abd', 'ijk', '?') - self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.E+tk.W) + self.canvas.grid(column=0, row=0, rowspan=2, sticky=tk.N+tk.S+tk.E+tk.W) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) + self.control = Control(self) + self.control.grid(column=0, row=2, sticky=tk.N+tk.S+tk.E+tk.W) + self.rowconfigure(0, weight=1) + self.columnconfigure(2, weight=1) + def update(self, copycat): answer = '' if copycat.workspace.rule is None else copycat.workspace.rule.buildTranslatedRule() self.canvas = create_main_canvas(self, 'abc', 'abd', 'ijk', answer) - self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.E+tk.W) + self.canvas.grid(column=0, row=0, rowspan=2, sticky=tk.N+tk.S+tk.E+tk.W) diff --git a/copycat/gui/status.py b/copycat/gui/status.py index 123e7dd..b1949c9 100644 --- a/copycat/gui/status.py +++ b/copycat/gui/status.py @@ -17,9 +17,9 @@ plt.style.use('dark_background') class StatusFrame(tk.Frame): def __init__(self, parent, status, title, toolbar=False): + tk.Frame.__init__(self, parent) self.status = status - tk.Frame.__init__(self, parent) self.canvas = FigureCanvasTkAgg(status.figure, self) self.canvas.show() self.canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)