pyColorChooser.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. """Color chooser implementing (almost) the tkColorColor interface
  2. """
  3. import os
  4. import Main
  5. import ColorDB
  6. class Chooser:
  7. """Ask for a color"""
  8. def __init__(self,
  9. master = None,
  10. databasefile = None,
  11. initfile = None,
  12. ignore = None,
  13. wantspec = None):
  14. self.__master = master
  15. self.__databasefile = databasefile
  16. self.__initfile = initfile or os.path.expanduser('~/.pynche')
  17. self.__ignore = ignore
  18. self.__pw = None
  19. self.__wantspec = wantspec
  20. def show(self, color, options):
  21. # scan for options that can override the ctor options
  22. self.__wantspec = options.get('wantspec', self.__wantspec)
  23. dbfile = options.get('databasefile', self.__databasefile)
  24. # load the database file
  25. colordb = None
  26. if dbfile != self.__databasefile:
  27. colordb = ColorDB.get_colordb(dbfile)
  28. if not self.__master:
  29. from tkinter import Tk
  30. self.__master = Tk()
  31. if not self.__pw:
  32. self.__pw, self.__sb = \
  33. Main.build(master = self.__master,
  34. initfile = self.__initfile,
  35. ignore = self.__ignore)
  36. else:
  37. self.__pw.deiconify()
  38. # convert color
  39. if colordb:
  40. self.__sb.set_colordb(colordb)
  41. else:
  42. colordb = self.__sb.colordb()
  43. if color:
  44. r, g, b = Main.initial_color(color, colordb)
  45. self.__sb.update_views(r, g, b)
  46. # reset the canceled flag and run it
  47. self.__sb.canceled(0)
  48. Main.run(self.__pw, self.__sb)
  49. rgbtuple = self.__sb.current_rgb()
  50. self.__pw.withdraw()
  51. # check to see if the cancel button was pushed
  52. if self.__sb.canceled_p():
  53. return None, None
  54. # Try to return the color name from the database if there is an exact
  55. # match, otherwise use the "#rrggbb" spec. BAW: Forget about color
  56. # aliases for now, maybe later we should return these too.
  57. name = None
  58. if not self.__wantspec:
  59. try:
  60. name = colordb.find_byrgb(rgbtuple)[0]
  61. except ColorDB.BadColor:
  62. pass
  63. if name is None:
  64. name = ColorDB.triplet_to_rrggbb(rgbtuple)
  65. return rgbtuple, name
  66. def save(self):
  67. if self.__sb:
  68. self.__sb.save_views()
  69. # convenience stuff
  70. _chooser = None
  71. def askcolor(color = None, **options):
  72. """Ask for a color"""
  73. global _chooser
  74. if not _chooser:
  75. _chooser = Chooser(**options)
  76. return _chooser.show(color, options)
  77. def save():
  78. global _chooser
  79. if _chooser:
  80. _chooser.save()
  81. # test stuff
  82. if __name__ == '__main__':
  83. from tkinter import *
  84. class Tester:
  85. def __init__(self):
  86. self.__root = tk = Tk()
  87. b = Button(tk, text='Choose Color...', command=self.__choose)
  88. b.pack()
  89. self.__l = Label(tk)
  90. self.__l.pack()
  91. q = Button(tk, text='Quit', command=self.__quit)
  92. q.pack()
  93. def __choose(self, event=None):
  94. rgb, name = askcolor(master=self.__root)
  95. if rgb is None:
  96. text = 'You hit CANCEL!'
  97. else:
  98. r, g, b = rgb
  99. text = 'You picked %s (%3d/%3d/%3d)' % (name, r, g, b)
  100. self.__l.configure(text=text)
  101. def __quit(self, event=None):
  102. self.__root.quit()
  103. def run(self):
  104. self.__root.mainloop()
  105. t = Tester()
  106. t.run()
  107. # simpler
  108. ## print 'color:', askcolor()
  109. ## print 'color:', askcolor()