multisink.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/python3
  2. from gi.repository import GLib
  3. from gi.repository import Gtk
  4. from gi.repository import GFlow
  5. from gi.repository import GtkFlow
  6. import sys
  7. class CalculatorNode(GFlow.SimpleNode):
  8. def __new__(cls, *args, **kwargs):
  9. x = GFlow.SimpleNode.new()
  10. x.__class__ = cls
  11. return x
  12. class NumberNode(CalculatorNode):
  13. def __init__(self, number=0):
  14. self.number = GFlow.SimpleSource.new(float(number))
  15. self.number.set_name("output")
  16. self.add_source(self.number)
  17. adjustment = Gtk.Adjustment(0, 0, 100, 1, 10, 0)
  18. self.spinbutton = Gtk.SpinButton()
  19. self.spinbutton.set_adjustment(adjustment)
  20. self.spinbutton.set_size_request(50,20)
  21. self.spinbutton.connect("value_changed", self.do_value_changed)
  22. self.number.set_value(float(self.spinbutton.get_value()))
  23. self.set_name("NumberGenerator")
  24. def do_value_changed(self, widget=None, data=None):
  25. self.number.set_value(float(self.spinbutton.get_value()))
  26. class PrintNode(CalculatorNode):
  27. def __init__(self):
  28. self.number = GFlow.SimpleSink.new(float(0))
  29. self.number.set_name("input")
  30. self.number.connect("changed", self.do_printing)
  31. self.number.set_max_sources(10)
  32. self.add_sink(self.number)
  33. self.childlabel = Gtk.Label()
  34. self.set_name("Output")
  35. def do_printing(self, dock):
  36. report = ""
  37. for i in range(len(self.number.get_sources())):
  38. n = self.number.get_value(i)
  39. if n is not None:
  40. report += "Dock #{} contains value: {}\n".format(i, n)
  41. self.childlabel.set_text(report)
  42. class Calculator(object):
  43. def __init__(self):
  44. w = Gtk.Window.new(Gtk.WindowType.TOPLEVEL)
  45. self.nv = GtkFlow.NodeView.new()
  46. hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
  47. create_numbernode_button = Gtk.Button("Create NumberNode")
  48. create_numbernode_button.connect("clicked", self.do_create_numbernode)
  49. hbox.add(create_numbernode_button)
  50. create_printnode_button = Gtk.Button("Create PrintNode")
  51. create_printnode_button.connect("clicked", self.do_create_printnode)
  52. hbox.add(create_printnode_button)
  53. vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
  54. vbox.pack_start(hbox, False, False, 0)
  55. vbox.pack_start(self.nv, True, True, 0)
  56. w.add(vbox)
  57. w.add(self.nv)
  58. w.show_all()
  59. w.connect("destroy", self.do_quit)
  60. Gtk.main()
  61. def do_create_numbernode(self, widget=None, data=None):
  62. n = NumberNode()
  63. self.nv.add_with_child(n, n.spinbutton)
  64. def do_create_printnode(self, widget=None, data=None):
  65. n = PrintNode()
  66. self.nv.add_with_child(n, n.childlabel)
  67. def do_quit(self, widget=None, data=None):
  68. Gtk.main_quit()
  69. sys.exit(0)
  70. if __name__ == "__main__":
  71. Calculator()