2015-06-05 2 views
2

Я делаю приложение python с графическим интерфейсом Tkinter. Пока у него есть несколько динамически созданных списков, которые я свяжу всех с одной полосой прокрутки. Мне нужно, чтобы yscroll() знал, какой список был прокручен. Передача переменной i на yscroll() не работает.Какой динамически созданный объект называется функцией?

from Tkinter import * 

class MyApp(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     self.title(' - My App - ') 

     self.listboxes = [] 
     for i in xrange(5): 
      lb = Listbox(self, yscrollcommand=lambda i, *args: self.yscroll(i, *args)) 
      for x in xrange(30): 
       lb.insert('end', x) 

      lb.pack(fill='y', side='left') 
      self.listboxes.append(lb) 

     self.scrollbar = Scrollbar(self, orient='vertical') 
     self.scrollbar.pack(side='right', fill='y') 

    def yscroll(self, i, *args): 
     print i 
     print args 

ma = MyApp() 
ma.mainloop() 
+0

** TL; DR **: попробуйте 'yscrollcommand = lambda i = i, * args: ...' – jonrsharpe

+0

ваше предложение 'yscrollcommand = lambda i = i, * args: ...' не работает, но ' lb = eval ('Listbox (self, yscrollcommand = lambda * args: ma.yscroll (% d, * args))'% i) 'делает. Есть ли более чистое решение? –

+0

Вы смотрели, например, http://effbot.org/tkinterbook/listbox.htm? Это дает рецепт для прокрутки нескольких списков с помощью одной полосы прокрутки. – jonrsharpe

ответ

2

Похоже, что usual recipe for using a variable from a loop in a lambda не работает должным образом при использовании вместе с параметром распаковки с *args. Но так как *args, кажется, всегда состоят из двух значений в этом случае (в начале и в конце просмотра, если я не ошибаюсь), вы могли бы переписать lambda так:

lb = Listbox(self, yscrollcommand = lambda x, y, i=i: self.yscroll(i, x, y)) 

Или вы можете создать своего рода «мета лямбда», создавая лямбда с правильным значением для i

make_callback = lambda i: lambda *args: self.yscroll(i, *args) 
lb = Listbox(self, yscrollcommand = make_callback(i)) 

Оба свяжут i к значению i в итерации, когда lambda была определена.

Смежные вопросы