Найти - Пользователи
Полная версия: Tkinter: использование процедур с параметрами в bind
Начало » GUI » Tkinter: использование процедур с параметрами в bind
1 2
Dr.Livsi
Доброе время суток!
вопрос: возможно ли использование процедур с параметрами с методом bind? Если нет, то есть ли какие-то другие варинты привязки процедур и функций с параметрами к событиям виджетов?
PooH
Dr.Livsi
вопрос: возможно ли использование процедур с параметрами с методом bind?
Обернуть в lambda?
Dr.Livsi
PooH
Dr.Livsi
вопрос: возможно ли использование процедур с параметрами с методом bind?
Обернуть в lambda?
гмм… хороший вариант, попробую. Спасибо!
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()
Dr.Livsi
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
Dr.Livsi
вопрос: возможно ли использование процедур с параметрами с методом bind?
Обернуть в lambda?
попробовал, но что-то не вышло, может быть приведете пример, как можно использовать lambda?
PooH
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()
sp3
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()
PooH
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()
Subideal Ox
Каррирование, ух!!! Красота!!!

Можно без функтулов - будет еще заумнее :-) В предыдущем примере change_title можно сделать вот так:

def change_title(name):
def my_func(evt):
root.title(name)
return my_func
То что в интерфейсе нет evt делает ее, на мой взгляд, немного чище. И потом, соответственно, вызвать:

text.tag_bind(t, "<Button-1>", change_title(t) )
Но, вообще-то это на любителя. Согласитесь, класс с перегруженным __call__ все-таки понятнее для непривычных к функциональному программированию в духе Haskell или Lisp.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB