Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Tkinter. Передача дополнительных параметров в функцию нажатия кнопки. [RSS Feed]

#1 Авг. 13, 2013 08:43:46

trympyrym
Зарегистрирован: 2013-08-13
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.

Добрый день. Задача такая: есть массив кнопок и функция, обрабатывающая нажатие на любую из них. Необходимо при ее вызове передать в нее номер нажатой кнопки. Ранее для этой задачи были использованы Entry, Combobox и кусочек кода такого типа:

sv = StringVar()
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv))
, который позволял передать в функцию все, что я захочу. Теперь нужно сделать то же самое для кнопки. Можно ли сделать такую же конструкцию с лямбдой и что в этом случае писать вместо name, index, mode? Или известен вам способ другой? Буду рад помощи

Офлайн

#2 Авг. 13, 2013 09:11:23

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.

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



Отредактировано FishHook (Авг. 13, 2013 09:12:26)

Офлайн

#3 Авг. 13, 2013 10:25:11

trympyrym
Зарегистрирован: 2013-08-13
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.

Спасибо, помогло.

Офлайн

#4 Авг. 13, 2013 15:31:22

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.

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 вываливает, естественно, ошибку :)



Отредактировано 4kpt (Авг. 13, 2013 15:48:45)

Офлайн

#5 Авг. 13, 2013 15:55:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.

4kpt, я понимаю Ваши побуждения, но рекомендую направить критику в адрес авторов руководства по библиотекам питона, ибо пример за небольшим изменением слизан оттуда.
взято тута A Simple Hello World Program



Офлайн

#6 Авг. 13, 2013 19:14:42

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.

FishHook
Ну не надо же бездумно здирать. Это не Ваш стиль явно :)

P.S. Я просто дал советы. Часть из них носит только рекомендательный характер. Это была не критика в явном понимании этого слова.



Отредактировано 4kpt (Авг. 13, 2013 19:19:16)

Офлайн

#7 Авг. 13, 2013 19:19:58

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.

4kpt,
Ok, прошу простить, больше так не буду



Офлайн

  • Начало
  • » GUI
  • » Tkinter. Передача дополнительных параметров в функцию нажатия кнопки.[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version