簡體   English   中英

在ttk中更新選項卡開關上的框架。

[英]Update frame on tab switch in ttk.Notebook

我有一個帶有update方法的自定義Frame ,每次用戶使用python2.7 ttk在筆記本中切換選項卡時,我都希望調用該python2.7 ttk

我的第一個想法是攔截一些“選項卡切換事件”,從事件中獲取幀並調用update方法。 但是,使用谷歌搜索不會產生好的結果。 我似乎無法捕捉到該事件,也無法很好地從“選項卡單擊事件”中獲取框架。 我目前的以下解決方案可以,但是我正在尋找更好的選擇。 (還有我真正的更新方法,我會收到一些討厭的分配錯誤)。

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()

可以想象,隨着制表符數量的增加,這變得非常不干燥...

您可以綁定到框架的<Visibility><Map>事件。 例如:

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()

代替

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

但是,@ BryanOakley提出的解決方案可能在您具有不同類型的幀(無法確定是否存在.update()方法.update()時更好地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM