2016-09-12 11 views
0

tkinter.ttk.Notebookの各タブに閉じるボタンを追加したいとします。画像を追加してクリックイベントに反応してみましたが、残念ながらBitmapImageにはbind()メソッドがありません。tkinter.ttk.Notebookのタブにクローズボタンを追加する方法はありますか?

このコードを修正するにはどうすればよいですか?

#!/usr/binenv python3 

from tkinter import * 
from tkinter.ttk import * 


class Application(Tk): 
    def __init__(self): 
     super().__init__() 
     notebook = Notebook(self) 
     notebook.pack(fill=BOTH, expand=True) 
     self.img = BitmapImage(master=self, file='./image.xbm') 
     self.img.bind('<Button-1>', self._on_click) 
     notebook.add(Label(notebook, text='tab content'), text='tab caption', image=self.img) 

    def _on_click(self, event): 
     print('it works') 

app = Application() 
app.mainloop() 

image.xbmをテーマにした(TTK)のウィジェットの

#define bullet_width 11 
#define bullet_height 9 
static char bullet_bits = { 
    0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00 
} 

答えて

5

一つの利点は、あなたが、個々のウィジェット "要素" のうち、新しいウィジェットを作成できることです。まったく単純ではありませんが、文書化されていないとしても、新しい「閉じるタブ」要素add tab thatを「タブ」要素に作成することができます。

私は1つの解決策を提示します。私はそれが特に理解するのは簡単ではないと認めます。おそらく、カスタムウィジェットスタイルを作成するための最良のソースの1つは、tkdocs.comでStyles and Themesセクションから始まります。

try: 
    import Tkinter as tk 
    import ttk 
except ImportError: # Python 3 
    import tkinter as tk 
    from tkinter import ttk 

class CustomNotebook(ttk.Notebook): 
    """A ttk Notebook with close buttons on each tab""" 

    __initialized = False 

    def __init__(self, *args, **kwargs): 
     if not self.__initialized: 
      self.__initialize_custom_style() 
      self.__inititialized = True 

     kwargs["style"] = "CustomNotebook" 
     ttk.Notebook.__init__(self, *args, **kwargs) 

     self._active = None 

     self.bind("<ButtonPress-1>", self.on_close_press, True) 
     self.bind("<ButtonRelease-1>", self.on_close_release) 

    def on_close_press(self, event): 
     """Called when the button is pressed over the close button""" 

     element = self.identify(event.x, event.y) 

     if "close" in element: 
      index = self.index("@%d,%d" % (event.x, event.y)) 
      self.state(['pressed']) 
      self._active = index 

    def on_close_release(self, event): 
     """Called when the button is released over the close button""" 
     if not self.instate(['pressed']): 
      return 

     element = self.identify(event.x, event.y) 
     index = self.index("@%d,%d" % (event.x, event.y)) 

     if "close" in element and self._active == index: 
      self.forget(index) 
      self.event_generate("<<NotebookTabClosed>>") 

     self.state(["!pressed"]) 
     self._active = None 

    def __initialize_custom_style(self): 
     style = ttk.Style() 
     self.images = (
      tk.PhotoImage("img_close", data=''' 
       R0lGODlhCAAIAMIBAAAAADs7O4+Pj9nZ2Ts7Ozs7Ozs7Ozs7OyH+EUNyZWF0ZWQg 
       d2l0aCBHSU1QACH5BAEKAAQALAAAAAAIAAgAAAMVGDBEA0qNJyGw7AmxmuaZhWEU 
       5kEJADs= 
       '''), 
      tk.PhotoImage("img_closeactive", data=''' 
       R0lGODlhCAAIAMIEAAAAAP/SAP/bNNnZ2cbGxsbGxsbGxsbGxiH5BAEKAAQALAAA 
       AAAIAAgAAAMVGDBEA0qNJyGw7AmxmuaZhWEU5kEJADs= 
       '''), 
      tk.PhotoImage("img_closepressed", data=''' 
       R0lGODlhCAAIAMIEAAAAAOUqKv9mZtnZ2Ts7Ozs7Ozs7Ozs7OyH+EUNyZWF0ZWQg 
       d2l0aCBHSU1QACH5BAEKAAQALAAAAAAIAAgAAAMVGDBEA0qNJyGw7AmxmuaZhWEU 
       5kEJADs= 
      ''') 
     ) 

     style.element_create("close", "image", "img_close", 
          ("active", "pressed", "!disabled", "img_closepressed"), 
          ("active", "!disabled", "img_closeactive"), border=8, sticky='') 
     style.layout("CustomNotebook", [("CustomNotebook.client", {"sticky": "nswe"})]) 
     style.layout("CustomNotebook.Tab", [ 
      ("CustomNotebook.tab", { 
       "sticky": "nswe", 
       "children": [ 
        ("CustomNotebook.padding", { 
         "side": "top", 
         "sticky": "nswe", 
         "children": [ 
          ("CustomNotebook.focus", { 
           "side": "top", 
           "sticky": "nswe", 
           "children": [ 
            ("CustomNotebook.label", {"side": "left", "sticky": ''}), 
            ("CustomNotebook.close", {"side": "left", "sticky": ''}), 
           ] 
         }) 
        ] 
       }) 
      ] 
     }) 
    ]) 

if __name__ == "__main__": 
    root = tk.Tk() 

    notebook = CustomNotebook(width=200, height=200) 
    notebook.pack(side="top", fill="both", expand=True) 

    for color in ("red", "orange", "green", "blue", "violet"): 
     frame = tk.Frame(notebook, background=color) 
     notebook.add(frame, text=color) 

    root.mainloop() 

は、ここでは、Linuxシステム上で次のようになります。

enter image description here

+0

タブごとに新しい要素を一意にするためにどのように難しいことが可能でしょうか?私のアプリでは、コンテンツが現在保存されていない、または保存されているときに(メモ帳++のように)赤色または灰色になる「閉じる」要素と「保存/変更」要素が必要です。私が直面している問題は、各タブの "保存"要素の色を制御する方法です。だから、あなたの答えは、 "閉じる"要素をクリックすると、どのように "閉じる"要素の色を変えることができますか? (タブ/子供を閉じるのではなく) – Gary02127

+0

さて、私はhttps://stackoverflow.com/questions/23038356/change-color-of-tab-header-in-ttk-notebookを見つけました。これはテーマについて語りますスタイルの代わりにまだそれを消化しようとしています...そしてもちろん、その例は、あなたの追加要素の余分な複雑さに対処していません... – Gary02127

関連する問題