Форум сайта python.su
OldSkifсейчас угадаю… вы сделали что то типа
По варианту Игоря следующая ошибка
label=Label(....).pack()
label=Label(...)
label.pack()
4kptОпять… Говорили же о том, что не надо делать bind на кнопку, юзайте command, это не нарушит стандартное поведение кнопки.
Как-то так. Хотя это то же, что и Игорь предложил, только через bind.
Отредактировано (Март 6, 2011 20:28:48)
Офлайн
Возможно я и ошибаюсь, но…
Привык использовать bind, потому что он позволяет описать различные события. command - лишь только одно событие.
Например:
Button.bind("<Button-1>", front)
Button.bind("<Button-3>", help)
Офлайн
Button.bind(“<Button-1>”, front) - генерится при нажатии (кнопка 1 вниз)
Button(tk,command = comand) - полноценная кнопка: генерится при нажатии и отпускании на этой же кнопке, либо табом поместить на ней фокус и нажать пробел
import Tkinter
tk = Tkinter.Tk()
def comand(*k):
print 'this comand'
def bind(*k):
print 'this bind'
Button = Tkinter.Button(tk,text='='*5,command = comand)
Button.pack()
Button.bind("<Button-1>", bind)
Button1 = Tkinter.Button(tk,text='='*5,command = comand)
Button1.pack()
Button1.bind("<Button-1>", bind)
tk.mainloop()
Офлайн
Не совсем то. Как на нажатие кнопок разными клавишами мышки повесить разные события через command. Я привел пример: при нажатии левой кнопки - одно событие, при нажатии правой - другое. Просто очень часто такие выкрутасы мне бывают нужны.
Прошу прощения за возможное недопонимание.
Офлайн
4kptПри bind на левую кнопку мыши и command, совершенно разная реакция и поведение виджета, запомните это!
Просто очень часто такие выкрутасы мне бывают нужны.
Прошу прощения за возможное недопонимание.
Офлайн
Хорошо. С кнопкой конечно не тот пример. Ну вот например с Entry. Я на него всегда двойной щелчек мыши вешаю на очистку. При одном нажатии мышка подсвечивает область, при двойном ее очищает. Это например нужно при редактировании данных, которые есть в базе. Данные открываються и сразу переносяться в Entry и пользователь может их или подправить, или полностью записать заново. При “подправить” действует одинарное нажатие кнопки мыши, при “переписать” - двойное нажатие.
Кроме того, в моих программах, мне глубоко серенево, работает ли событие при нажатии или после отпускания. В моем случае нажатия кнопки инициируют появление новых окон или объектов, поэтому я использую метод bind. Да и кто зажмет кнопку мышки и будет ее держать пол-дня? Я про этот момент догадался, только тогда, когда у меня кнопка форму изменила.
Вот как-то так.
P.S. Насчет нестандартного подхода - сказывается увлечение математикой и (или) мотоциклами. Я пишу как мне удобно, и как мне потом легче в том, что я пишу, разобраться.
Отредактировано (Март 7, 2011 23:51:48)
Офлайн
4kptТоже неудачный пример. Стандартно, двойной щелчок, это выделение слова. Тройной, это выделение всего текста.
С кнопкой конечно не тот пример. Ну вот например с Entry. Я на него всегда двойной щелчек мыши вешаю на очистку.
4kptЭто был не совсем комплимент :) Если на чистоту, это называется быдлокодингом :)
P.S. Насчет нестандартного подхода - сказывается увлечение математикой и (или) мотоциклами. Я пишу как мне удобно, и как мне потом легче в том, что я пишу, разобраться.
Офлайн
Игорь, ну не надо все идеализировать. Я не пишу универсальные программные продукты для всех и вся. Я пишу специализированные ПО под определенные задачи. Под мат расчеты, под БД отдельных людей. И навигацию с клавиатуры я добавляю, тоже методом bind. И, еще раз, мое ПО никто не читает. Если надо его исправить, исправляю исключительно я.
Возможно, если мне придется писать ПО для широкого круга пользователей, я изменю свое отношение к процессу написания программ, но пока не вижу в этом смысла.
Повторюсь еще раз - мое ПО очень и очень узкоспециализированное. Нет потребности его делать понятным для всех и вся.
Хотя, возможно, Вы правы. Надо будет попробовать написать одно ПО через command, только как повесить несколько функций на один виджет - надо будет подумать.
Офлайн
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()
#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()
#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()
Отредактировано (Март 8, 2011 12:04:21)
Офлайн
С помощью bind третий код переписал, чтобы он работал как 4 код, но получилось через ОПЖУ. Теперь понятно, что Вы имели ввиду, когда говорили, что bind нарушает поведение кнопки. Формально кнопка замораживается до полного прохождения события. Ее нельзя менять, менять ее свойства или поведение. При методе команд кнопка срабатывает и становиться свободной.
Спасибо большое, но все равно полностью отказаться от bind не получиться. Будет, наверное, сказываться привычка.
И еще, Игорь, по моему вопросу о меню - ничем не можете помочь?
Офлайн