tkinter_widget.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. '''
  2. Created on 27-jul.-2014
  3. @author: Simon
  4. '''
  5. import Tkinter as tk
  6. from python_runtime.statecharts_core import Event
  7. class TkinterWidget:
  8. controller = None
  9. def __init__(self, configure_later=False):
  10. if not configure_later:
  11. self.set_bindable_and_tagorid(None, None)
  12. def set_bindable_and_tagorid(self, bindable=None, tagorid=None):
  13. if bindable is None:
  14. bindable = self
  15. self.bindable = bindable
  16. self.mytagorid = tagorid
  17. if isinstance(self, tk.Toplevel):
  18. self.protocol("WM_DELETE_WINDOW", self.window_close)
  19. if tagorid is not None:
  20. if not isinstance(tagorid, list):
  21. tagorid = [tagorid]
  22. for t in tagorid:
  23. self.bindable.tag_bind(t, "<Button>", self.on_click)
  24. self.bindable.tag_bind(t, "<ButtonRelease>", self.on_release)
  25. self.bindable.tag_bind(t, "<Motion>", self.on_motion)
  26. self.bindable.tag_bind(t, "<Enter>", self.on_enter)
  27. self.bindable.tag_bind(t, "<Leave>", self.on_leave)
  28. self.bindable.tag_bind(t, "<Key>", self.on_key)
  29. self.bindable.tag_bind(t, "<KeyRelease>", self.on_key_release)
  30. else:
  31. self.bindable.bind("<Button>", self.on_click)
  32. self.bindable.bind("<ButtonRelease>", self.on_release)
  33. self.bindable.bind("<Motion>", self.on_motion)
  34. self.bindable.bind("<Enter>", self.on_enter)
  35. self.bindable.bind("<Leave>", self.on_leave)
  36. self.bindable.bind("<Key>", self.on_key)
  37. self.bindable.bind("<KeyRelease>", self.on_key_release)
  38. self.last_x = 50
  39. self.last_y = 50
  40. def on_click(self, event):
  41. event_name = None
  42. if event.num == 1:
  43. event_name = "left-click"
  44. elif event.num == 2:
  45. event_name = "middle-click"
  46. elif event.num == 3:
  47. event_name = "right-click"
  48. if event_name:
  49. self.last_x = event.x
  50. self.last_y = event.y
  51. TkinterWidget.controller.addInput(Event(event_name, "input", [id(self)]))
  52. def on_release(self, event):
  53. event_name = None
  54. if event.num == 1:
  55. event_name = "left-release"
  56. elif event.num == 2:
  57. event_name = "middle-release"
  58. elif event.num == 3:
  59. event_name = "right-release"
  60. if event_name:
  61. self.last_x = event.x
  62. self.last_y = event.y
  63. TkinterWidget.controller.addInput(Event(event_name, "input", [id(self)]))
  64. def on_motion(self, event):
  65. self.last_x = event.x
  66. self.last_y = event.y
  67. TkinterWidget.controller.addInput(Event("motion", "input", [id(self)]))
  68. def on_enter(self, event):
  69. TkinterWidget.controller.addInput(Event("enter", "input", [id(self)]))
  70. def on_leave(self, event):
  71. TkinterWidget.controller.addInput(Event("leave", "input", [id(self)]))
  72. def on_key(self, event):
  73. event_name = None
  74. if event.keysym == 'Escape':
  75. event_name = "escape"
  76. elif event.keysym == 'Return':
  77. event_name = "return"
  78. elif event.keysym == 'Delete':
  79. event_name = "delete"
  80. elif event.keysym == 'Shift_L':
  81. event_name = "shift"
  82. elif event.keysym == 'Control_L':
  83. event_name = "control"
  84. if event_name:
  85. TkinterWidget.controller.addInput(Event(event_name, "input", [id(self)]))
  86. def on_key_release(self, event):
  87. event_name = None
  88. if event.keysym == 'Escape':
  89. event_name = "escape-release"
  90. elif event.keysym == 'Return':
  91. event_name = "return-release"
  92. elif event.keysym == 'Delete':
  93. event_name = "delete-release"
  94. elif event.keysym == 'Shift_L':
  95. event_name = "shift-release"
  96. elif event.keysym == 'Control_L':
  97. event_name = "control-release"
  98. if event_name:
  99. TkinterWidget.controller.addInput(Event(event_name, "input", [id(self)]))
  100. def window_close(self):
  101. TkinterWidget.controller.addInput(Event("window-close", "input", [id(self)]))