Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Tkinter: использование процедур с параметрами в bind [RSS Feed]

#1 Ноя. 21, 2010 22:47:36

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в bind

Доброе время суток!
вопрос: возможно ли использование процедур с параметрами с методом bind? Если нет, то есть ли какие-то другие варинты привязки процедур и функций с параметрами к событиям виджетов?



Офлайн

#2 Ноя. 22, 2010 04:14:20

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в bind

Dr.Livsi
вопрос: возможно ли использование процедур с параметрами с методом bind?
Обернуть в lambda?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Ноя. 22, 2010 09:09:10

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в bind

PooH
Dr.Livsi
вопрос: возможно ли использование процедур с параметрами с методом bind?
Обернуть в lambda?
гмм… хороший вариант, попробую. Спасибо!



Офлайн

#4 Ноя. 22, 2010 16:53:26

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в 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()



Офлайн

#5 Ноя. 22, 2010 22:56:25

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в bind

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?



Офлайн

#6 Ноя. 23, 2010 09:01:34

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в 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()



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Ноя. 23, 2010 10:14:24

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в bind

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



Офлайн

#8 Ноя. 23, 2010 13:39:20

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в bind

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



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Ноя. 23, 2010 16:18:52

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Tkinter: использование процедур с параметрами в bind

Ну отчего же. Можно и здесь лямбдами, если очень хочется.

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



Офлайн

#10 Ноя. 23, 2010 16:36:22

Subideal Ox
От:
Зарегистрирован: 2010-11-23
Сообщения: 65
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter: использование процедур с параметрами в bind

Каррирование, ух!!! Красота!!!

Можно без функтулов - будет еще заумнее :-) В предыдущем примере 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.



Отредактировано (Ноя. 23, 2010 16:47:15)

Офлайн

  • Начало
  • » GUI
  • » Tkinter: использование процедур с параметрами в bind[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version