Percolator.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from idlelib.WidgetRedirector import WidgetRedirector
  2. from idlelib.Delegator import Delegator
  3. class Percolator:
  4. def __init__(self, text):
  5. # XXX would be nice to inherit from Delegator
  6. self.text = text
  7. self.redir = WidgetRedirector(text)
  8. self.top = self.bottom = Delegator(text)
  9. self.bottom.insert = self.redir.register("insert", self.insert)
  10. self.bottom.delete = self.redir.register("delete", self.delete)
  11. self.filters = []
  12. def close(self):
  13. while self.top is not self.bottom:
  14. self.removefilter(self.top)
  15. self.top = None
  16. self.bottom.setdelegate(None); self.bottom = None
  17. self.redir.close(); self.redir = None
  18. self.text = None
  19. def insert(self, index, chars, tags=None):
  20. # Could go away if inheriting from Delegator
  21. self.top.insert(index, chars, tags)
  22. def delete(self, index1, index2=None):
  23. # Could go away if inheriting from Delegator
  24. self.top.delete(index1, index2)
  25. def insertfilter(self, filter):
  26. # Perhaps rename to pushfilter()?
  27. assert isinstance(filter, Delegator)
  28. assert filter.delegate is None
  29. filter.setdelegate(self.top)
  30. self.top = filter
  31. def removefilter(self, filter):
  32. # XXX Perhaps should only support popfilter()?
  33. assert isinstance(filter, Delegator)
  34. assert filter.delegate is not None
  35. f = self.top
  36. if f is filter:
  37. self.top = filter.delegate
  38. filter.setdelegate(None)
  39. else:
  40. while f.delegate is not filter:
  41. assert f is not self.bottom
  42. f.resetcache()
  43. f = f.delegate
  44. f.setdelegate(filter.delegate)
  45. filter.setdelegate(None)
  46. def _percolator(parent):
  47. import Tkinter as tk
  48. import re
  49. class Tracer(Delegator):
  50. def __init__(self, name):
  51. self.name = name
  52. Delegator.__init__(self, None)
  53. def insert(self, *args):
  54. print self.name, ": insert", args
  55. self.delegate.insert(*args)
  56. def delete(self, *args):
  57. print self.name, ": delete", args
  58. self.delegate.delete(*args)
  59. root = tk.Tk()
  60. root.title("Test Percolator")
  61. width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
  62. root.geometry("+%d+%d"%(x, y + 150))
  63. text = tk.Text(root)
  64. p = Percolator(text)
  65. t1 = Tracer("t1")
  66. t2 = Tracer("t2")
  67. def toggle1():
  68. if var1.get() == 0:
  69. var1.set(1)
  70. p.insertfilter(t1)
  71. elif var1.get() == 1:
  72. var1.set(0)
  73. p.removefilter(t1)
  74. def toggle2():
  75. if var2.get() == 0:
  76. var2.set(1)
  77. p.insertfilter(t2)
  78. elif var2.get() == 1:
  79. var2.set(0)
  80. p.removefilter(t2)
  81. text.pack()
  82. var1 = tk.IntVar()
  83. cb1 = tk.Checkbutton(root, text="Tracer1", command=toggle1, variable=var1)
  84. cb1.pack()
  85. var2 = tk.IntVar()
  86. cb2 = tk.Checkbutton(root, text="Tracer2", command=toggle2, variable=var2)
  87. cb2.pack()
  88. if __name__ == "__main__":
  89. from idlelib.idle_test.htest import run
  90. run(_percolator)