Найти - Пользователи
Полная версия: Установка цвета
Начало » GUI » Установка цвета
1 2 3
igor.kaist
OldSkif
По варианту Игоря следующая ошибка
сейчас угадаю… вы сделали что то типа
label=Label(....).pack()
pack() ничего не возвращает, нужно работать с классом виджета. Да почитайте вы в конце концов доку по Tkinter и освойте более менее python. Программировать методом тыка не очень то хорошая идея
Сделайте так:
label=Label(...)
label.pack()
4kpt
Как-то так. Хотя это то же, что и Игорь предложил, только через bind.
Опять… Говорили же о том, что не надо делать bind на кнопку, юзайте command, это не нарушит стандартное поведение кнопки.
4kpt
Возможно я и ошибаюсь, но…
Привык использовать bind, потому что он позволяет описать различные события. command - лишь только одно событие.
Например:
Button.bind("<Button-1>", front)
Button.bind("<Button-3>", help)
При нажатии левой кнопки - одно событие, при нажатии правой - второе. Можно ли это реализовать с помощью command и как?
А чтобы не нарушать поведения кнопки - я формирование кнопок свожу в одну функцию - и повторно ее запускаю в случае необходимости: после выполнения всех операций внутри функции вызова.
sp3
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()
4kpt
Не совсем то. Как на нажатие кнопок разными клавишами мышки повесить разные события через command. Я привел пример: при нажатии левой кнопки - одно событие, при нажатии правой - другое. Просто очень часто такие выкрутасы мне бывают нужны.

Прошу прощения за возможное недопонимание.
igor.kaist
4kpt
Просто очень часто такие выкрутасы мне бывают нужны.
Прошу прощения за возможное недопонимание.
При bind на левую кнопку мыши и command, совершенно разная реакция и поведение виджета, запомните это!
Кнопка “нажимается” не при нажатии кнопки мыши, а при ее отпускании - это раз!
Подумайте еще о навигации с клавиатуры, при bind на правую кнопку мыши, она у вас работать не будет.
GUI должно взаимодействовать с пользователем предсказуемым для него способом. Ни одному человеку не придет в голову нажимать по кнопке правой кнопкой мыши.
Судя по вашим постам, вы любите идти нестандартными способами. Зачем, если проще, надежнее и быстрее сделать так как оно должно быть?
4kpt
Хорошо. С кнопкой конечно не тот пример. Ну вот например с Entry. Я на него всегда двойной щелчек мыши вешаю на очистку. При одном нажатии мышка подсвечивает область, при двойном ее очищает. Это например нужно при редактировании данных, которые есть в базе. Данные открываються и сразу переносяться в Entry и пользователь может их или подправить, или полностью записать заново. При “подправить” действует одинарное нажатие кнопки мыши, при “переписать” - двойное нажатие.

Кроме того, в моих программах, мне глубоко серенево, работает ли событие при нажатии или после отпускания. В моем случае нажатия кнопки инициируют появление новых окон или объектов, поэтому я использую метод bind. Да и кто зажмет кнопку мышки и будет ее держать пол-дня? Я про этот момент догадался, только тогда, когда у меня кнопка форму изменила.
Вот как-то так.

P.S. Насчет нестандартного подхода - сказывается увлечение математикой и (или) мотоциклами. Я пишу как мне удобно, и как мне потом легче в том, что я пишу, разобраться.
igor.kaist
4kpt
С кнопкой конечно не тот пример. Ну вот например с Entry. Я на него всегда двойной щелчек мыши вешаю на очистку.
Тоже неудачный пример. Стандартно, двойной щелчок, это выделение слова. Тройной, это выделение всего текста.
Вы не представляете, сколько я видел поделок (не важно на чем написанных), где было жуткое GUI. Запускаешь программу, и с первых минут понимаешь что дальше ей пользоваться не будешь.
Ваша программа работает с базой данных, соответственно человек будет много с ней работать. Пожалейте его, все должно быть продуманно. Не лишним будет сделать нормальную навигацию с клавиатуры.

4kpt
P.S. Насчет нестандартного подхода - сказывается увлечение математикой и (или) мотоциклами. Я пишу как мне удобно, и как мне потом легче в том, что я пишу, разобраться.
Это был не совсем комплимент :) Если на чистоту, это называется быдлокодингом :)
4kpt
Игорь, ну не надо все идеализировать. Я не пишу универсальные программные продукты для всех и вся. Я пишу специализированные ПО под определенные задачи. Под мат расчеты, под БД отдельных людей. И навигацию с клавиатуры я добавляю, тоже методом bind. И, еще раз, мое ПО никто не читает. Если надо его исправить, исправляю исключительно я.

Возможно, если мне придется писать ПО для широкого круга пользователей, я изменю свое отношение к процессу написания программ, но пока не вижу в этом смысла.

Повторюсь еще раз - мое ПО очень и очень узкоспециализированное. Нет потребности его делать понятным для всех и вся.

Хотя, возможно, Вы правы. Надо будет попробовать написать одно ПО через command, только как повесить несколько функций на один виджет - надо будет подумать.
igor.kaist
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()
4kpt
С помощью bind третий код переписал, чтобы он работал как 4 код, но получилось через ОПЖУ. Теперь понятно, что Вы имели ввиду, когда говорили, что bind нарушает поведение кнопки. Формально кнопка замораживается до полного прохождения события. Ее нельзя менять, менять ее свойства или поведение. При методе команд кнопка срабатывает и становиться свободной.

Спасибо большое, но все равно полностью отказаться от bind не получиться. Будет, наверное, сказываться привычка.

И еще, Игорь, по моему вопросу о меню - ничем не можете помочь?
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