Форум сайта python.su
Здравствуйте, недавно натолкнулся на такую вещь, опишу в виде примера:
Необходимо создать несколько одинаковых кнопок с одной функцией, но разными аргументами. Первое, что пришло мне в голову было что-то вот такое:
import Tkinter def f(x,y): print(x+y) root=Tkinter.Tk() for x in range(10): for y in range(10): Tkinter.Button(root,text=str(x)+'+'+str(y),command=lambda:f(x,y)).grid(row=x, column=y) root.mainloop()
import Tkinter class but: def __init__(self,x,y): Tkinter.Button(root,text=str(x)+'+'+str(y),command=lambda:self.f(x,y)).grid(row=x, column=y) def f(self,x,y): print (x+y) root=Tkinter.Tk() for x in range(10): for y in range(10): but(x,y) root.mainloop()
Офлайн
Нужно явно передавать. Тогда не будут затираться.
Ваш пример:
import Tkinter def f(x, y): print(x + y) root = Tkinter.Tk() for x in range(10): for y in range(10): Tkinter.Button(root, text = str(x) + '+' + str(y), command=lambda x=x, y=y: f(x,y)).grid(row=x, column=y) root.mainloop()
Офлайн
4kpt_III
Спасибо, стало понятно.
Еще решил попробовать сделать вкладочки и, почитав этот топик, кстати с вашими ответами: http://python.su/forum/topic/21802/, написал вот это (фреймы специально не удаляются, а скрываются, т.к. к ним может быть обращение с других вкладок) :
import Tkinter import ttk def go(index, frobj, butobj): global active frobj[active].grid_remove() frobj[index].grid(row = 0, column = 2, rowspan=10) butobj[active].config(bg="white") butobj[index].config(bg="yellow") active = index root=Tkinter.Tk() but=[] fr=[Tkinter.Frame(root) for x in range(5)] Tkinter.Label(fr[0],text="I`m label").grid(row = 0, column = 0) Tkinter.Frame(fr[1],bg="red", height=200, width=600).grid(row = 0, column = 0) Tkinter.Button(fr[2],text="I`m button :D").grid(row = 0, column = 0) Tkinter.Frame(fr[3],bg="yellow", height=100, width=200).grid(row = 0, column = 0) Tkinter.Text(fr[4], height=10, width=20).grid(row = 0, column = 0) for x in xrange(9): if x%2 == 0: but.append(Tkinter.Button(root, text="Button", command=lambda y=int(x/2), fr=fr: go(y,fr,but), bd=0, height=2, width=10, bg="white")) but[int(x/2)].grid(row = x, column = 0) else: ttk.Separator(root, orient="horizontal").grid(row = x, column = 0, sticky="ew") s = ttk.Separator(root, orient="vertical") s.grid(row = 0, column = 1, rowspan=10, sticky="ns") global active active=1 go(0, fr, but) root.mainloop()
Офлайн
Тут два варианта. Либо ООП, либо явно передавать в lambda.
Офлайн
4kpt_IIIно в функции изменяется переменная
либо явно передавать в lambda.
active = index
Офлайн
Получилось как-то так:
import Tkinter import ttk class button_note: def __init__(self,root): self.but=[] self.enabled=0 for index in xrange(9): if index%2 == 0: self.but.append(Tkinter.Button(root,text="Button", command=lambda x=int(index/2): self.enable(x), bd=0, height=2, width=10, bg="white")) self.but[int(index/2)].grid(row = index, column = 0) else: ttk.Separator(root, orient="horizontal").grid(row = index, column = 0, sticky="ew") self.fr=[Tkinter.Frame(root) for x in range(5)] Tkinter.Label(self.fr[0],text="I`m label").grid(row = 0, column = 0) Tkinter.Frame(self.fr[1],bg="red", height=200, width=600).grid(row = 0, column = 0) Tkinter.Button(self.fr[2],text="I`m button :D").grid(row = 0, column = 0) Tkinter.Frame(self.fr[3],bg="yellow", height=100, width=200).grid(row = 0, column = 0) Tkinter.Text(self.fr[4], height=10, width=20).grid(row = 0, column = 0) ttk.Separator(root, orient="vertical").grid(row = 0, column = 1, rowspan=10, sticky="ns") self.enable(self.enabled) def enable(self,index): self.fr[self.enabled].grid_remove() self.fr[index].grid(row = 0, column = 2, rowspan=10) self.but[self.enabled].config(bg="white") self.but[index].config(bg="yellow") self.enabled = index root=Tkinter.Tk() note=button_note(root) root.mainloop()
Офлайн
Практически верно. Преобразование толковое. Даже ошибки описывать не хочется
terabayt
но в функции изменяется переменная
Офлайн
4kpt_IIIто что числа в пайтоне immutable, а active это число
И что Вас смутило?
Офлайн
Все верно. Только не засунуть, а использовать вместо целого числа список или словарь (если управляющих параметров множество). Что тут Вас смутило? Неужели никогда в коде такого не видели?
Я же не написал, что в lambda нужно передавать именно число. Не люблю себя цитировать, но все же
4kpt_III
Тут два варианта. Либо ООП, либо явно передавать в lambda.
Отредактировано 4kpt_III (Янв. 9, 2015 10:48:57)
Офлайн
4kpt_IIIвидел и для меня эт очень запутано
Неужели никогда в коде такого не видели?
4kpt_IIIпонял, вопросов больше нету
Я же не написал, что в lambda нужно передавать именно число.
Отредактировано terabayt (Янв. 9, 2015 18:04:13)
Офлайн