【问题标题】:Update frame on tab switch in ttk.Notebook更新 ttk.Notebook 中选项卡开关的框架
【发布时间】:2015-10-19 05:57:09
【问题描述】:

我有一个自定义的Frame,它带有一个更新方法,每次用户使用python2.7 ttk 在笔记本中切换选项卡时我都想调用它。

我的第一个想法是拦截一些“标签切换事件”,从事件中获取框架并调用更新方法。但是,谷歌搜索不会产生好的结果。我似乎无法捕捉到该事件,也无法以一种好的方式从“标签点击事件”中获取框架。我下面的当前解决方案工作正常,但我正在寻找更好的选择。 (同样使用我真正的更新方法,我得到了一些令人讨厌的分配错误)。

import ttk
import Tkinter as tk

class MyFrame(ttk.Frame):
    def __init__(self, master, name):
        ttk.Frame.__init__(self, master)
        self.name = name
        self.pack()

    def update(self):
        # Update the contents of the frame...
        print "Updating %s" % self.name

class App():
    def __init__(self):
        root = tk.Tk()

        nb = ttk.Notebook(root)

        f1_name = "Tab1"
        f2_name = "Tab2"
        f1 = MyFrame(nb, f1_name)
        f2 = MyFrame(nb, f2_name)

        nb.add(f1, text=f1_name)
        nb.add(f2, text=f2_name)

        def tab_switch(event):
            if event.widget.identify(event.x, event.y) == "label":
                index = event.widget.index("@%d,%d" % (event.x, event.y))
                title = event.widget.tab(index, "text")

                if title == f1_name:
                    f1.update()
                elif title == f2_name:
                    f2.update()
                # and so on...

        nb.bind("<Button-1>", tab_switch)
        nb.pack(fill="both", expand=True)

        f1.update()  # Initial update of first displayed tab

        root.geometry("200x200")
        root.mainloop()

App()

正如你可以想象的那样,随着标签数量的增加,这变得非常不干燥......

【问题讨论】:

    标签: python python-2.7 tabs tkinter ttk


    【解决方案1】:

    您可以绑定到框架的&lt;Visibility&gt;&lt;Map&gt; 事件。例如:

    class MyFrame(ttk.Frame):
        def __init__(self, master, name):
            ttk.Frame.__init__(self, master)
            self.name = name
            self.pack()
            self.bind("<Visibility>", self.on_visibility)
    
        def on_visibility(self, event):
            self.update()
    

    【讨论】:

      【解决方案2】:

      代替

      def tab_switch():
          # see question...
      
      nb.bind("<Button-1>", tab_switch)
      

      你可以做以下技巧

      b.bind("<<NotebookTabChanged>>", 
             lambda event: event.widget.winfo_children()[event.widget.index("current")].update())
      

      这也消除了调用的需要

      f1.update()  # Initial update of first displayed tab
      

      但是,当您有不同类型的框架且无法确定是否存在 .update() 方法时,@BryanOakley 提出的解决方案可能会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-04
        • 2016-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多