Пытаюсь повторить это, но получается, что сгенерированный в цикле handler существует для всех виджетов только в том виде, в каком он генерится в последнем цикле.
Создаю в цикле 5 чекбатонов, ниже вывожу для наглядности переменную данного чекбатона (0 или 1). При снятии или проставке “галочки” с чекбатона срабатывает handler, для проверки в консоль выводится аргумент с которым этот handler срабатывает и это всегда номер последнего шага в цикле, а нужен номер того шага, в котором был сгенерён данный виджет.
Не пойму где моё художество спотыкается. Мозг свело.
Вот пример как он есть в книге:
def __createWidgets ( self ):
...
self.cbList = [] # Create the checkbutton list
for i in range(10):
cb = Checkbutton ( self, ... )
self.cbList.append ( cb )
cb.grid( row=1, column=i )
def handler ( event, self=self, i=i ):
return self.__cbHandler ( event, i )
cb.bind ( "<Button-1>", handler )
...
def __cbHandler ( self, event, cbNumber ):
...
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Tkinter import *
class App(Frame):
def __init__(self,master=None):
Frame.__init__(self, master)
self.grid()
self.chcks=[]
self.dots=[]
self.status_=[]
#в цикле создаю чекбаттоны и их переменные
for step in range(1,6):
self.chk=Checkbutton()
self.chk.grid(row=0,column=step)
self.dot=IntVar()
self.dot.set(0)
self.chk["variable"]=self.dot
def handler (event, self=self, x=step):
#примитивная проверка
print ">>>>>>>>>>handler№ ", step
return self.__statset (event, step)
self.chk.bind ("<1>", handler)
self.statusbar=Label() #current dot display
self.statusbar.grid(row=1,column=step)
self.statusbar["textvariable"]=self.dot
self.dots.append(self.dot) #appending things into lists
self.chcks.append(self.chk)
self.status_.append(self.statusbar)
self.svar=StringVar() #summary variable
self.svar.set(self.dots[2].get())
self.summ=Label() #summary display
self.summ.grid(row=2,column=0)
self.summ["textvariable"]=self.svar
def __statset(self, num):
self.svar.set(num)
root=App()
root.mainloop()