【问题标题】:how to toggle event binding on tabs of notebook widget如何在笔记本小部件的选项卡上切换事件绑定
【发布时间】:2013-11-11 17:24:03
【问题描述】:

我有一个基于 tkinter 和 ttk 的简单应用程序。我有一个笔记本小部件应该创建有限数量的选项卡,这些选项卡是相同的。但我需要对每一个执行不同的操作。当我按下某个按钮时,会创建一个具有自己名称的选项卡,并且事件绑定将集中在它上面。如果我选择使用按钮按下创建的上一个选项卡,事件绑定将不会关注它或​​其子小部件,这是我需要解决的问题。我可以在选项卡之间切换事件绑定吗?有什么建议? 我正在使用 python 2.7

【问题讨论】:

    标签: python events tkinter ttk


    【解决方案1】:

    查看我对问题how to make instances of event for every single tab on multi tab GUI tkinter( notebook widget) 的回答以查看工作示例。

    我使用 MyTab 类创建具有自己的事件绑定的新选项卡 - 因此我可以创建许多相同的选项卡并且每个选项卡都使用自己的事件绑定。在示例选项卡中,当您更改选项卡时会显示不同的消息。

    您没有在问题中附加代码,因此我无法添加更详细的答案。

    编辑:

    上一个链接的示例 + 绑定到框架:

    • 直接在MyTab:self.bind("<Button-1>", self.clickFrame)(鼠标左键调用函数在MyTab
    • Application:tab.bind("<Button-3>", self.clickTab)(Application中的鼠标右键调用函数

    代码:

    #!/usr/bin/env python
    
    from Tkinter import *
    import tkMessageBox
    import ttk
    
    #---------------------------------------------------------------------
    class MyTab(Frame):
    
        def __init__(self, root, name):
            Frame.__init__(self, root)
    
            self.root = root
            self.name = name
    
            self.entry = Entry(self)
            self.entry.pack(side=TOP)
    
            self.entry.bind('<FocusOut>', self.alert)
            self.entry.bind('<Key>', self.printing)
    
            self.bind("<Button-1>", self.clickFrame)
    
        #-------------------------------
    
        def alert(self, event):
            print 'FocusOut event is working for ' + self.name + '  value: ' + self.entry.get()
            #tkMessageBox.showinfo('alert', 'FocusOut event is working for ' + self.name + '  value: ' + self.entry.get())
    
        #-------------------------------
    
        def printing(self, event):
            print event.keysym + ' for ' + self.name
    
        #-------------------------------
    
        def clickFrame(self, event):
            print "MyTab: click at (" + str(event.x) + ", " + str(event.y) + ') for ' + self.name + " (parent name: " + self.root.tab(CURRENT)['text'] + ")"
    
    
    #---------------------------------------------------------------------
    
    class Application():
    
        def __init__(self):
    
            self.tabs = {'ky':1} 
    
            self.root = Tk()
            self.root.minsize(300, 300)
            self.root.geometry("1000x700")
    
            self.notebook = ttk.Notebook(self.root, width=1000, height=650)
    
    #       self.all_tabs = []
    
            self.addTab('tab1')
    
            self.button = Button(self.root, text='generate', command=self.start_generating).pack(side=BOTTOM)
    
            self.notebook.pack(side=TOP)
    
        #-------------------------------
    
        def addTab(self, name):
            tab = MyTab(self.notebook, name)
            tab.bind("<Button-3>", self.clickTab)
            self.notebook.add(tab, text="X-"+name)
    #       self.all_tabs.append(tab)
    
        #-------------------------------
    
        def clickTab(self, event):
            print "Application: click at (" + str(event.x) + ", " + str(event.y) + ') for ' + event.widget.name
    
            #-------------------------------
    
        def start_generating(self):
            if self.tabs['ky'] < 4:
                self.tabs['ky'] += 1
                self.addTab('tab'+ str(self.tabs['ky'])) 
    
        #-------------------------------
    
        def run(self):
            self.root.mainloop()
    
    #----------------------------------------------------------------------
    
    Application().run()     
    

    【讨论】:

    • 好的,但是你的类中的绑定是在条目上..它不适用于框架例如..因为选项卡是一个框架......
    • 我找到了解决方案......因为每个选项卡都有 tabID,我们可以检查哪个选项卡被选中,然后使用 ..easy 与 IF 语句进行绑定
    • 您可以将您的解决方案作为答案 - 如果您制作简单的工作示例会很好。它可以帮助别人。然后我们可以为您的答案投票,您可以将其标记为已接受。
    • 顺便说一句:MyTabFrame,因此您可以使用 MyTab 直接绑定到 MyTab 内的 self.bind 或在 Application 中使用 tab.bind - 参见示例我的答案。在示例中,您还可以看到如何从事件中获取 Frame 属性 - event.widget.name
    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多