multisink.py 3.0 KB

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