how to make instances of event for every single tab on multi tab GUI tkinter( notebook widget)

拟墨画扇 提交于 2019-12-13 08:30:51

问题


this is my code.. and i need the event binding to work for all tabs the same time..the problem is when generate new tab the event binding will be related to the last generated tab and not working any more for pre-generated tabs..please help--(python 2.7)

#!/usr/bin/env python
import Tkinter
from Tkinter import *
import tkMessageBox
import ttk



root = Tkinter.Tk()
root.minsize(300,300)
root.geometry("1000x700")

body=ttk.Notebook(root,width=1000,height=650,)

tabs={'ky':1} 
def generate_tabs(tab,name):

  tab=Tkinter.Frame(body)                            
  entry=Entry(tab).pack(side=TOP)

  def alert(event):
    tkMessageBox.showinfo('alert1','FocusOut event is working for '+name)
  def printing(event):
    print event.keysym+' for '+name


  root.bind("<Key>",printing)

  tab.bind_class('Entry',"<FocusOut>",alert)
  body.add(tab,text=name)

def start_generating():
  if tabs['ky']==4:pass
  elif tabs['ky']==3: generate_tabs('tab4','tab4') ; tabs['ky']=4
  elif tabs['ky']==2: generate_tabs('tab3','tab3') ; tabs['ky']=3
  elif tabs['ky']==1: generate_tabs('tab2','tab2') ; tabs['ky']=2
  else:pass
generate_tabs('tab1','tab1')
button=Button(root,text='generate',command=start_generating).pack(side=LEFT)
body.pack(side=TOP)
root.mainloop()

回答1:


I use class MyTab to create new tab with own function alert (called when you focus out entry) and printing (called when you type in entry).

I use print in place of tkMessageBox because messagebox focuse out entry on new selected tab (when you change tab) so you don't see messagebox from previous tab, but from current tab.

#!/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)

    #-------------------------------

    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

#---------------------------------------------------------------------

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)
        self.notebook.add(tab, text=name)
#       self.all_tabs.append(tab)

    #-------------------------------

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


来源:https://stackoverflow.com/questions/19888697/how-to-make-instances-of-event-for-every-single-tab-on-multi-tab-gui-tkinter-no

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!