как переключить привязку событий на вкладках виджета записной книжки

У меня есть простое приложение на основе tkinter и ttk. У меня есть виджет блокнота, который должен создавать ограниченное количество вкладок, и вкладки - это одно и то же. Но мне нужно делать разные действия на каждом из них. Когда я нажимаю какую-либо кнопку, создается вкладка с собственным именем, и привязка события будет фокусироваться на ней. Если я выберу предыдущую вкладку, созданную нажатием кнопки, привязка события не будет фокусироваться ни на ней, ни на ее дочерних виджетах, и это проблема, которую мне нужно решить. Могу ли я переключать привязку событий между вкладками? Какие-либо предложения? Я использую питон 2.7


person user2980054    schedule 11.11.2013    source источник


Ответы (1)


См. мой ответ на вопрос как создать экземпляры события для каждой отдельной вкладки в графическом интерфейсе с несколькими вкладками tkinter (виджет ноутбука), чтобы увидеть рабочий пример.

Я использую класс 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()     
person furas    schedule 11.11.2013
comment
хорошо, но привязка в вашем классе находится на входе... она не будет работать, например, для фрейма... так как вкладка - это фрейм... - person user2980054; 11.11.2013
comment
Я нашел решение... поскольку каждая вкладка имеет tabID, мы можем проверить, какая вкладка выбрана, а затем сделать привязку к ней с помощью... легко с оператором IF - person user2980054; 11.11.2013
comment
Вы можете поместить свое решение в качестве ответа - было бы неплохо, если бы вы сделали простой рабочий пример. Это может помочь другим. Затем мы можем проголосовать за ваш ответ, и вы можете пометить его как принятый. - person furas; 12.11.2013
comment
кстати: MyTab это Frame, поэтому вы можете напрямую привязаться к этому Frame внутри MyTab, используя self.bind, или в Application, используя tab.bind - см. Пример в моем ответе. В примере вы также можете увидеть, как получить свойство Frame из события - event.widget.name - person furas; 12.11.2013