Найти - Пользователи
Полная версия: Функция и кнопка
Начало » GUI » Функция и кнопка
1 2
OldSkif
Вот код:
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?..
И как мне реализовать передачу значения только после нажатия кнопки?
Заранее благодарен.
Soteric
knop.bind("<Button-1>", prog(a1, b1, c1))
В метод bind будет передан не указатель на функцию prog, как ожидается, а результат ее выполнения (в ходе которого g и получит свое значение). Я не знаком с tkinter, поэтому подсказать как здесь надо делать не смогу.
sp3
http://python.su/forum/viewtopic.php?id=9215
igor.kaist
Что то у вас как то все через одно место с Tkinter… Зачем биндить на кнопку нажатие кнопки мыши? command в конструкторе кнопки на что?
исчерпывающая документация по Tkinter в pdf
OldSkif
igor.kaist
command в конструкторе кнопки на что?
Насколько я знаю, комманд не возьмет функцию с аргументами. Что мне собственно и нужно.
Griffon
Бинд тоже не возьмёт. Принимается функция! То есть, в вашем случае необходима функция, которая вызывает функцию с параметром.
Хотя пример конечно абсолютно не нуждается в таком подходе.
igor.kaist
OldSkif
Насколько я знаю, комманд не возьмет функцию с аргументами. Что мне собственно и нужно.
Загляните в топик, ссылку на который дал sp3, вы приятно удивитесь…
Да в коде, который вы привели, это не нужно на самом деле…. Подобное обычно практикуется при автоматической генерации GUI
OldSkif
Griffon
Бинд тоже не возьмёт.
Почему бинд не возьмет?.. Он прекрасно с этим справляется…
igor.kaist
OldSkif
Почему бинд не возьмет?.. Он прекрасно с этим справляется…
ок, давайте разберемся…
1. Прочтите еще раз топик, ссылку на который дали выше.
В вашем коде (не важно bind это или command), вы ВЫЗЫВАЕТЕ функцию с аргументами, причем вызывается она тут же, на месте, а не когда наступает событие, а не даете указатель на ту функцию которая должна быть вызвана. Сравните:
def foo():return 'hello
print foo()
print foo
2. При использовании bind, вы нарушаете стандартное поведение и реакцию виджета. Например, становится невозможным использование навигации с клавиатуры (кнопочка должна наживаться при нажатии пробела при активном фокусе виджета). Да и кнопка “наживается” при отпускании кнопки мыши, а не при нажатии.
Мы же хотим учиться, давайте стараться делать все правильно, а не быдлокодить, лишь бы сейчас работало.
3. Как уже говорили выше, не очень то правильно передавать таким образом аргументы, по крайней мере в вашем случае. Общей картины не видно конечно, но в большинстве случаях этого делать не надо. Нужно изначально правильно проектировать приложение: это не только красиво, но и помогает избежать трудностей в дальнейшем.
OldSkif
Я согласен с вашими доводами, Игорь. Второй вечер бьюсь с этим кодом…
Как же мне передать таки значение х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,
...
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