Уведомления

Группа в Telegram: @pythonsu

#1 Март 1, 2011 20:16:46

OldSkif
От:
Зарегистрирован: 2011-02-25
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция и кнопка

Вот код:

g = DoubleVar()
def prog (a1, b1, c1):
D = (b1*b1) - 4*a1*c1
x1 = int()
x1 = -(b1 + math.sqrt(D))/2*a1
x2 = -(b1 - math.sqrt(D))/2*a1
g.set(x1)
knop = Button(tk,
text=k,) #надпись на кнопке
knop.bind("<Button-1>", prog(a1, b1, c1))
knop.pack()
Label(tk,
textvariable=g,
relief="groove",
borderwidth=3,
font=("Courier", 14, "bold"),
justify=LEFT,
width=80,
padx=10,
pady=20,
takefocus=True,
).pack()
tk.mainloop()
Объясните мне, почему переменной g дается значение х1 еще до нажатия кнопки knop?..
И как мне реализовать передачу значения только после нажатия кнопки?
Заранее благодарен.



Офлайн

#2 Март 1, 2011 20:48:21

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Функция и кнопка

knop.bind("<Button-1>", prog(a1, b1, c1))
В метод bind будет передан не указатель на функцию prog, как ожидается, а результат ее выполнения (в ходе которого g и получит свое значение). Я не знаком с tkinter, поэтому подсказать как здесь надо делать не смогу.



Офлайн

#3 Март 1, 2011 21:17:40

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

Функция и кнопка

Офлайн

#4 Март 1, 2011 21:37:45

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Функция и кнопка

Что то у вас как то все через одно место с Tkinter… Зачем биндить на кнопку нажатие кнопки мыши? command в конструкторе кнопки на что?
исчерпывающая документация по Tkinter в pdf



Офлайн

#5 Март 1, 2011 21:42:12

OldSkif
От:
Зарегистрирован: 2011-02-25
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция и кнопка

igor.kaist
command в конструкторе кнопки на что?
Насколько я знаю, комманд не возьмет функцию с аргументами. Что мне собственно и нужно.



Офлайн

#6 Март 1, 2011 21:47:48

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Функция и кнопка

Бинд тоже не возьмёт. Принимается функция! То есть, в вашем случае необходима функция, которая вызывает функцию с параметром.
Хотя пример конечно абсолютно не нуждается в таком подходе.



Офлайн

#7 Март 1, 2011 21:48:51

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Функция и кнопка

OldSkif
Насколько я знаю, комманд не возьмет функцию с аргументами. Что мне собственно и нужно.
Загляните в топик, ссылку на который дал sp3, вы приятно удивитесь…
Да в коде, который вы привели, это не нужно на самом деле…. Подобное обычно практикуется при автоматической генерации GUI



Офлайн

#8 Март 1, 2011 21:54:41

OldSkif
От:
Зарегистрирован: 2011-02-25
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция и кнопка

Griffon
Бинд тоже не возьмёт.
Почему бинд не возьмет?.. Он прекрасно с этим справляется…



Офлайн

#9 Март 1, 2011 22:40:38

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Функция и кнопка

OldSkif
Почему бинд не возьмет?.. Он прекрасно с этим справляется…
ок, давайте разберемся…
1. Прочтите еще раз топик, ссылку на который дали выше.
В вашем коде (не важно bind это или command), вы ВЫЗЫВАЕТЕ функцию с аргументами, причем вызывается она тут же, на месте, а не когда наступает событие, а не даете указатель на ту функцию которая должна быть вызвана. Сравните:
def foo():return 'hello
print foo()
print foo
2. При использовании bind, вы нарушаете стандартное поведение и реакцию виджета. Например, становится невозможным использование навигации с клавиатуры (кнопочка должна наживаться при нажатии пробела при активном фокусе виджета). Да и кнопка “наживается” при отпускании кнопки мыши, а не при нажатии.
Мы же хотим учиться, давайте стараться делать все правильно, а не быдлокодить, лишь бы сейчас работало.
3. Как уже говорили выше, не очень то правильно передавать таким образом аргументы, по крайней мере в вашем случае. Общей картины не видно конечно, но в большинстве случаях этого делать не надо. Нужно изначально правильно проектировать приложение: это не только красиво, но и помогает избежать трудностей в дальнейшем.



Офлайн

#10 Март 1, 2011 22:50:24

OldSkif
От:
Зарегистрирован: 2011-02-25
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция и кнопка

Я согласен с вашими доводами, Игорь. Второй вечер бьюсь с этим кодом…
Как же мне передать таки значение х1 в Lable только после нажатия клавиши?..

...
a1 = a.get()
b1 = b.get()
c1 = c.get()
g = IntVar()
g.set(0)
def prog (aa, bb, cc):
D = (b1*b1) - 4*a1*c1
x1 = -(b1 + math.sqrt(D))/2*a1
x2 = -(b1 - math.sqrt(D))/2*a1
g.set(x1)
knop = Button(tk,
text=k,)
knop.bind("<Button>", prog(a1, b1, c1))
knop.pack()

Label(tk,
textvariable=g,
...



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version