Найти - Пользователи
Полная версия: Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.
Начало » GUI » Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.
1
trympyrym
Добрый день. Задача такая: есть массив кнопок и функция, обрабатывающая нажатие на любую из них. Необходимо при ее вызове передать в нее номер нажатой кнопки. Ранее для этой задачи были использованы Entry, Combobox и кусочек кода такого типа:
sv = StringVar()
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv))
, который позволял передать в функцию все, что я захочу. Теперь нужно сделать то же самое для кнопки. Можно ли сделать такую же конструкцию с лямбдой и что в этом случае писать вместо name, index, mode? Или известен вам способ другой? Буду рад помощи
FishHook
from Tkinter import *
import tkMessageBox
class Application(Frame):
   def createWidgets(self):
        self.b1 = Button(self)
        self.b1["text"] = "1"
        self.b1.bind('<Button-1>', lambda _: self.button_click(1))
        self.b1.pack({"side": "left"})
        self.b2 = Button(self)
        self.b2["text"] = "2"
        self.b2.bind('<Button-1>', lambda _: self.button_click(2))
        self.b2.pack({"side": "left"})
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()
    def button_click(self, number):
        tkMessageBox.askokcancel("Number is", number)
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()
trympyrym
Спасибо, помогло.
4kpt
FishHook
Все верно, но не учли несколько маленьких ньюансов:
1. .bind хорош только с event, а Вы его задушили :) Для простого действия кнопки лучше использовать command…

2. Можно self.b2.pack(side= “left”)

3. Зачем создавать root и при этом наследовать рамку? Если root не будет передан, рамка сама для себя его построит, т.е.
root = Tk()
app = Application(master=root)
Равнозначно
app = Application()
Вот если бы вы меняли размеры окна или производили с ним другие управляющие действия - вот тогда сам бог велел использовать root, хотя и от этого можно уйти, ведь у рамки (self в нашем случае) есть параметр - .master, который ссылается непосредственно на корневое окно.

4. Не очень хорошая практика назначения одного параметра через обращению к элементу списка, т.е. желательно было бы (хотя и не обязательно)
self.b1["text"] = "1"
лучше вставить в процесс создания экземпляра класса, т.е.
self.b1 = Button(self, text="1")
Имеет смысл использовать такой способ замены свойства виджета, когда нужно его изменить и только его. В противном случае рационально использовать метод .config или .configure :)

5. Зачем использовать askokcancel. В Вашем случае лучше будет showinfo…

6. И последнее. Этого делать никак нельзя:
app.mainloop()
root.destroy()
Как можно после обработчика событий “забивать” главное окно? Окончание работы обработчика - это и есть закрытие главного окна. Вы пытаетесь его повторно грохнуть. tcl вываливает, естественно, ошибку :)
FishHook
4kpt, я понимаю Ваши побуждения, но рекомендую направить критику в адрес авторов руководства по библиотекам питона, ибо пример за небольшим изменением слизан оттуда.
взято тута A Simple Hello World Program
4kpt
FishHook
Ну не надо же бездумно здирать. Это не Ваш стиль явно :)

P.S. Я просто дал советы. Часть из них носит только рекомендательный характер. Это была не критика в явном понимании этого слова.
FishHook
4kpt,
Ok, прошу простить, больше так не буду
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