Browse Source

added some functionality to interact with tkinter

sampieters 1 year ago
parent
commit
a3e44de14c

+ 3 - 26
examples/BouncingBalls/PyDEVS/runner.py

@@ -2,7 +2,7 @@ from pypdevs.simulator import Simulator
 import target as target
 
 from tkinter import *
-from sccd.runtime.libs.ui_v2 import UI
+from sccd.runtime.libs.DEVui_v2 import UI
 
 class OutputListener:
 	def __init__(self, ui):
@@ -26,30 +26,7 @@ if __name__ == '__main__':
 	sim.setVerbose(None)
 	sim.setRealTimePlatformTk(tkroot)
 
-
-	#controller = target.Controller(TkEventLoop(tkroot))
-	ui = UI(tkroot, "controller")
-	#controller.addMyOwnOutputListener(OutputListener(ui))
-	#controller.start()
+	ui = UI(tkroot, sim)
+	model.atomic1.addMyOwnOutputListener(OutputListener(ui))
 	sim.simulate()
 	tkroot.mainloop()
-
-
-"""
-model = target.Controller(name="controller")
-refs = {"ui": model.ui, "field_ui": model.atomic1.field_ui}
-ui.window = Tk()
-ui.window.withdraw()
-
-sim = Simulator(model)
-sim.setRealTime(True)
-sim.setRealTimeInputFile(None)
-sim.setRealTimePorts(refs)
-sim.setVerbose(None)
-sim.setRealTimePlatformTk(ui.window)
-
-ui.simulator = sim
-
-sim.simulate()
-ui.window.mainloop()
-"""

+ 16 - 15
examples/BouncingBalls/PyDEVS/target.py

@@ -11,7 +11,7 @@ from sccd.runtime.DEVS_statecharts_core import *
 from pypdevs.DEVS import *
 from pypdevs.infinity import *
 from pypdevs.simulator import *
-from sccd.runtime.libs import ui_v2 as ui
+from sccd.runtime.libs import DEVui_v2 as ui
 from sccd.runtime.libs.utils import utils
 import random
 
@@ -269,7 +269,7 @@ class MainApp(AtomicDEVS, ObjectManagerBase):
         next_earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
         if not (len(self.to_send) == 0):
             self.next_time = 0
-        if next_earliest == INFINITY:
+        elif next_earliest == INFINITY:
             self.next_time = INFINITY
         else:
             self.next_time = next_earliest - earliest
@@ -492,10 +492,10 @@ class FieldInstance(RuntimeClassBase):
         self.states["/root/running"].addTransition(_root_running_0)
     
     def _root_creating_window_enter(self):
-        self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", self.inports['field_ui']]))
+        self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", 'field_ui']))
     
     def _root_creating_canvas_enter(self):
-        self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, 800, 550, {'background':'#eee'}, self.inports['field_ui']]))
+        self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, 800, 550, {'background':'#eee'}, 'field_ui']))
     
     def _root_creating_button_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.window_id, 'create_new_field', 'Spawn New Window']))
@@ -511,15 +511,15 @@ class FieldInstance(RuntimeClassBase):
     def _root_creating_window_0_exec(self, parameters):
         window_id = parameters[0]
         self.window_id = window_id
-        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
-        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.KEY_PRESS, 'key_press', self.inports['field_ui']]))
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', 'field_ui']))
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.KEY_PRESS, 'key_press', 'field_ui']))
     
     def _root_creating_canvas_0_exec(self, parameters):
         canvas_id = parameters[0]
         self.canvas_id = canvas_id
-        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RIGHT_CLICK, 'right_click', self.inports['field_ui']]))
-        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', self.inports['field_ui']]))
-        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RELEASE, 'mouse_release', self.inports['field_ui']]))
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RIGHT_CLICK, 'right_click', 'field_ui']))
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', 'field_ui']))
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RELEASE, 'mouse_release', 'field_ui']))
     
     def _root_creating_button_0_exec(self, parameters):
         association_name = parameters[0]
@@ -590,7 +590,7 @@ class Field(AtomicDEVS, ObjectManagerBase):
             if isinstance(input, str):
                 tem = eval(input)
                 self.addInput(tem)
-            if input[3].name == "create_instance":
+            elif input[3].name == "create_instance":
                 self.instances.add(FieldInstance(self))
                 ev = Event("instance_created", None, parameters=[f"{input[3].parameters[0]}[{len(self.instances)-1}]"])
                 self.to_send.append((input[1], input[0], input[2], ev))
@@ -611,7 +611,7 @@ class Field(AtomicDEVS, ObjectManagerBase):
             elif input[3].name == "instance_created":
                 instance = list(self.instances)[input[2]]
                 instance.addEvent(input[3])
-                instance.associations['fields'].instances[0] = input[3].parameters[0]
+                instance.associations['buttons'].instances[0] = input[3].parameters[0]
             elif input[3].name == "instance_started":
                 instance = list(self.instances)[input[2]]
                 instance.addEvent(input[3])
@@ -639,7 +639,7 @@ class Field(AtomicDEVS, ObjectManagerBase):
         next_earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
         if not (len(self.to_send) == 0):
             self.next_time = 0
-        if next_earliest == INFINITY:
+        elif next_earliest == INFINITY:
             self.next_time = INFINITY
         else:
             self.next_time = next_earliest - earliest
@@ -786,8 +786,9 @@ class Button(AtomicDEVS, ObjectManagerBase):
             if isinstance(input, str):
                 tem = eval(input)
                 self.addInput(tem)
-            if input[3].name == "create_instance":
-                self.instances.add(ButtonInstance(self))
+            elif input[3].name == "create_instance":
+                # TODO: In generator add parameters
+                self.instances.add(ButtonInstance(self, input[3].parameters[1], input[3].parameters[2], input[3].parameters[3]))
                 ev = Event("instance_created", None, parameters=[f"{input[3].parameters[0]}[{len(self.instances)-1}]"])
                 self.to_send.append((input[1], input[0], input[2], ev))
             elif input[3].name == "start_instance":
@@ -835,7 +836,7 @@ class Button(AtomicDEVS, ObjectManagerBase):
         next_earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
         if not (len(self.to_send) == 0):
             self.next_time = 0
-        if next_earliest == INFINITY:
+        elif next_earliest == INFINITY:
             self.next_time = INFINITY
         else:
             self.next_time = next_earliest - earliest

+ 10 - 1
sccd/runtime/DEVS_statecharts_core.py

@@ -698,6 +698,8 @@ class ObjectManagerBase(object):
                          "start_instance": self.handleStartInstanceEvent,
                          "delete_instance": self.handleDeleteInstanceEvent,
                          "create_and_start_instance": self.handleCreateAndStartEvent}
+        
+        self.output_listeners = []
     
     #def getEarliestEventTime(self):
         #while self.instance_times and self.instance_times[0][0] < self.instance_times[0][1].earliest_event_time:
@@ -786,6 +788,10 @@ class ObjectManagerBase(object):
     def handleEvent(self, e):
         self.handlers[e.getName()](e.getParameters())
 
+    def outputEvent(self, event):
+        for listener in self.output_listeners:
+            listener.add(event)
+
     def processAssociationReference(self, input_string):
         if len(input_string) == 0:
             raise AssociationReferenceException("Empty association reference.")
@@ -1025,4 +1031,7 @@ class ObjectManagerBase(object):
     def createInstance(self, to_class, construct_params = []):
         instance = self.instantiate(to_class, construct_params)
         self.instances.add(instance)
-        return instance
+        return instance
+
+    def addMyOwnOutputListener(self, listener):
+        self.output_listeners.append(listener)

File diff suppressed because it is too large
+ 189 - 0
sccd/runtime/libs/DEVui_v2.py