Форум сайта python.su
Доброе время суток!
вопрос: возможно ли использование процедур с параметрами с методом bind? Если нет, то есть ли какие-то другие варинты привязки процедур и функций с параметрами к событиям виджетов?
Офлайн
Dr.LivsiОбернуть в lambda?
вопрос: возможно ли использование процедур с параметрами с методом bind?
Офлайн
PooHгмм… хороший вариант, попробую. Спасибо!Dr.LivsiОбернуть в lambda?
вопрос: возможно ли использование процедур с параметрами с методом bind?
Офлайн
я примерно так делал
from Tkinter import *
root = Tk()
root.title("test ")
class ButtonCaller(object):
def __init__(self,name):
self.name = name
def __call__(self,*arg):
root.title(self.name)
but = {}
for x in range(10):
but[x] = Button(root, text = " Button %s"%x)
but[x].pack(side= LEFT)
but[x].bind("<Button-1>",ButtonCaller("This Button %s"%x))
root.mainloop()
Офлайн
sp3Спасибо за вариант.
я примерно так делалfrom Tkinter import *
root = Tk()
root.title("test ")
class ButtonCaller(object):
def __init__(self,name):
self.name = name
def __call__(self,*arg):
root.title(self.name)
but = {}
for x in range(10):
but[x] = Button(root, text = " Button %s"%x)
but[x].pack(side= LEFT)
but[x].bind("<Button-1>",ButtonCaller("This Button %s"%x))
root.mainloop()
PooHпопробовал, но что-то не вышло, может быть приведете пример, как можно использовать lambda?Dr.LivsiОбернуть в lambda?
вопрос: возможно ли использование процедур с параметрами с методом bind?
Офлайн
Dr.LivsiНу как-то так:PooHпопробовал, но что-то не вышло, может быть приведете пример, как можно использовать lambda?
Обернуть в lambda?
from Tkinter import *
root = Tk()
root.title("test ")
def handler(s):
root.title(s)
but = Button(root, text = " Button 1")
but.pack(side= LEFT)
but.bind("<Button-1>", lambda _: handler('button 1 pressed'))
but = Button(root, text = " Button 2")
but.pack(side= LEFT)
but.bind("<Button-1>", lambda _: handler('Qu-qu'))
root.mainloop()
Офлайн
PooHвот более “жизненный” пример, как на lambda это сделать? у меня неполучилось
from Tkinter import *
root = Tk()
root.title("test ")
class ButtonCaller(object):
def __init__(self,name):
self.name = name
def __call__(self,*arg):
root.title(self.name)
class TextBold():
def __init__(self,arg):
self.name = arg
def __call__(self,*arg):
text.tag_config(self.name,font="Verdana 14 bold", foreground="red")
class TextNormal():
def __init__(self,arg):
self.name = arg
def __call__(self,*arg):
text.tag_config(self.name,font="Verdana 10 normal", foreground="blue")
text = Text(root,font="Verdana 10",wrap=WORD,cursor="arrow")
text.pack(side= LEFT)
for x in range(100):
t = str(x)
text.tag_config(t, foreground="blue")
text.tag_bind(t, "<Enter>", TextBold(t))
text.tag_bind(t, "<Leave>", TextNormal(t))
text.tag_bind(t, "<Button-1>", ButtonCaller('click %s'%t))
text.insert(END, t, t)
root.mainloop()
Офлайн
sp3Ну здесь лямбда не поможет, а поможет каррирование ;)
вот более “жизненный” пример, как на lambda это сделать? у меня неполучилось
from Tkinter import *
from functools import partial
root = Tk()
root.title("test ")
def change_font(name, font, foreground, evt):
text.tag_config(name, font=font, foreground=foreground)
def change_title(name, title, evt):
root.title(name)
text = Text(root,font="Verdana 10",wrap=WORD,cursor="arrow")
text.pack(side= LEFT)
for x in range(100):
t = str(x)
text.tag_config(t, foreground="blue")
text.tag_bind(t, "<Enter>", partial(change_font, t, "Verdana 14 bold", "red"))
text.tag_bind(t, "<Leave>", partial(change_font, t, "Verdana 10 normal", "blue"))
text.tag_bind(t, "<Button-1>", partial(change_title, t, 'click %s' % t))
text.insert(END, t, t)
root.mainloop()
Офлайн
Ну отчего же. Можно и здесь лямбдами, если очень хочется.
from Tkinter import *
from functools import partial
root = Tk()
root.title("test ")
def change_font(name, font, foreground, evt):
text.tag_config(name, font=font, foreground=foreground)
def change_title(name, title, evt):
root.title(name)
text = Text(root,font="Verdana 10",wrap=WORD,cursor="arrow")
text.pack(side= LEFT)
for x in range(100):
t = str(x)
text.tag_config(t, foreground="blue")
text.tag_bind(t, "<Enter>", lambda evt, t=t:
text.tag_config(t, font="Verdana 14 bold", foreground="red"))
text.tag_bind(t, "<Leave>", lambda evt, t=t:
text.tag_config(t, font="Verdana 10 normal", foreground="blue"))
text.tag_bind(t, "<Button-1>", lambda evt, t=t:
root.title('click %s' % t))
text.insert(END, t, t)
root.mainloop()
Офлайн
Каррирование, ух!!! Красота!!!
Можно без функтулов - будет еще заумнее :-) В предыдущем примере change_title можно сделать вот так:
def change_title(name):
def my_func(evt):
root.title(name)
return my_func
text.tag_bind(t, "<Button-1>", change_title(t) )
Отредактировано (Ноя. 23, 2010 16:47:15)
Офлайн