runner_no_ui.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. '''
  2. Created on 27-jul.-2014
  3. @author: Simon
  4. '''
  5. import threading
  6. import Tkinter as tk
  7. import sccd_no_ui as target
  8. from sccd.runtime.libs.ui import ui
  9. from sccd.runtime.statecharts_core import Event
  10. from sccd.runtime.tkinter_eventloop import *
  11. from ui_classes import *
  12. from widget_private_ports import Widget
  13. if __name__ == '__main__':
  14. root = tk.Tk()
  15. root.withdraw()
  16. # def add_event(*args):
  17. # print "okay adding %s" % args
  18. #
  19. # root.bind("<<ADD_EVENT>>", add_event)
  20. #
  21. # controller = target.Controller(TkEventLoop(root))
  22. #
  23. # def raw_inputter():
  24. # while 1:
  25. # #controller.addInput(Event(raw_input(), "input", []))
  26. # root.event_generate("<<ADD_EVENT>>")
  27. # input_thread = threading.Thread(target=raw_inputter)
  28. # input_thread.daemon = True
  29. # input_thread.start()
  30. # output_listener = controller.addOutputListener(["ui_out"])
  31. # def outputter():
  32. # while 1:
  33. # event = output_listener.fetch(-1)
  34. # print event
  35. # output_thread = threading.Thread(target=outputter)
  36. # output_thread.daemon = True
  37. # output_thread.start()
  38. controller = target.Controller(TkEventLoop(root))
  39. Widget.controller = controller
  40. listener = controller.addOutputListener(controller.output_ports["ui_out"])
  41. windows = {}
  42. def check_output():
  43. while True:
  44. output_event = listener.fetch(0)
  45. if not output_event is None:
  46. if output_event.getName() == "create_new_window":
  47. assoc_name = output_event.getParameters()[0]
  48. sccd_object = output_event.getParameters()[1]
  49. windows[assoc_name] = WindowVis(sccd_object)
  50. elif output_event.getName() == "delete_window":
  51. assoc_name = output_event.getParameters()[0]
  52. windows[assoc_name].destruct()
  53. del windows[assoc_name]
  54. elif output_event.getName() == "stop_ui":
  55. root.quit()
  56. else:
  57. break
  58. root.after(40, check_output) # hmm yeah so this delay is problematic: the visualization is created a bit AFTER the statechart object is, which means that the output listener is created too late, which means events are getting lost
  59. root.after(40, check_output)
  60. controller.start()
  61. root.mainloop()