4kpt, давайте попробую немного по другому объяснить то, что я хочу вам сказать :)
Лучше изначально учиться все делать правильно, поверьте.
Есть виджеты, которые должны вести себя предсказуемо при любых обстоятельствах. Не спорю, можно сделать все что угодно. Можно даже Entry использовать в роли кнопки, но зачем?
Кнопка должна нажиматься, если приходится ей навешивать что то более, значит GUI спроектировано не правильно.
Я понимаю, что у вас какой то специфичный софт, единичные экземпляры, но неужели не хочется сделать красиво и правильно. Прежде всего для себя.
Приведу пример: в своей работе, мы использовали одну софтину. По сути дела, тоже самое. Заказы, клиенты, отслеживание заказов, статусы и прочее. Купили лицензию на одно место.
Когда заказов стало больше, оператор стал не успевать добавлять заказы. GUI было ужасно и запутано. Для добавления одного заказа открывалось много окон, нужно было сделать много щелчков мышкой и т.д.
Решено было написать свою программу, что я собственно и сделал. Сейчас добавление нового заказа происходит вообще без помощи мышки. ctrl+n > появляется окно с фокусом на первом поле > забиваем > Tab > забиваем следующее …. потом пробел на кнопке Добавить, все… Экономится куча времени человека, который работает с программой.
Если бы программисты той программы все сделали правильно, мы купили бы еще минимум 8 лицензии на ту программу.
Вот простой пример. Нужно по нажатию на кнопку умножить число из entry на два и вывести на label.
Можно тупо:
#coding:utf-8
from Tkinter import *
root=Tk()
def calc(*arg):
if ent.get().isdigit():
lab['text']=int(ent.get())*2
lab=Label(root)
lab.pack()
ent=Entry(root)
ent.pack()
but=Button(root,text='Посчитать')
but.bind('<Button-1>',calc)
but.pack()
root.mainloop()
А можно потратить еще пару минут с сделать все более красиво и очевидно:
#coding:utf-8
from Tkinter import *
root=Tk()
def validate(*data):
if not s.get().isdigit():
ent['foreground']='red'
but['state']='disable'
lab['text']='Не верное число'
else:
ent['foreground']='black'
but['state']='normal'
lab['text']='Вот теперь можно нажать на кнопку'
def calc():
lab['text']=int(ent.get())*2
s=StringVar()
s.trace('w',validate)
lab=Label(root)
lab.pack()
ent=Entry(root,textvariable=s)
ent.pack()
but=Button(root,text='Посчитать',command=calc)
but.pack()
root.mainloop()
Тут кстати, вообще кнопку можно убрать, как лишнюю сущность :)
Или еще пример… По нажатию на кнопку должна произойти долгая операция.
Делаем в лоб, с bind:
#coding:utf-8
from Tkinter import *
import time
root=Tk()
def doit(*arg):
time.sleep(1)
but=Button(root,text='Сделать это!',width=20)
but.bind('<Button-1>',doit)
but.pack()
root.mainloop()
В этом примере, попробуйте заменить bind на command, и вы уже почувствуете разницу
А теперь сделаем более красиво и понятно пользователю:
#coding:utf-8
from Tkinter import *
import time
root=Tk()
def doit():
but['text']='Делаю..'
but['state']='disable'
root.update()
time.sleep(1)
but['text']='Сделать это!'
but['state']='normal'
but=Button(root,text='Сделать это!',command=doit,width=20)
but.pack()
root.mainloop()