Форум сайта python.su
Простейший пример скрипта на Tkinter (“hello world” практически), создаёт окно с кнопкой “Завершение работы”.
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
import sys
# функция обработки события для кнопки
def die(event):
sys.exit()
root = Tk() # создаётся главное окно
button = Button(root) # создаётся кнопка в главном окне
button["text"] = u"Завершение работы" # объект кнопки обрабатывается как словарь
button.bind("<Button-1>", die) # регистрация события нажатия первой кнопки мыши
# первый строковый параметр задаёт имя события
# второй параметр указывает имя функции обработки события,
# которая может принимать единственный параметр — event (событие)
# есть альтернативный способ определения функции обработки события:
# button["command"] = die
# при таком подходе параметр event в функции обработки события
# никогда не используется (и не должен быть указан в описании самой функции)
button.pack() # элемент упаковывается в родительском контейнере
root.mainloop() # запуск главного окна и цикла его событий
>>> Traceback (most recent call last):Что это и как с этим бороться?
File “/tmp/py6882Ofk”, line 25, in <module>
root.mainloop() # запуск главного окна и цикла его событий
File “/usr/lib/python2.5/lib-tk/Tkinter.py”, line 1023, in mainloop
self.tk.mainloop(n)
File “/usr/lib/python2.5/lib-tk/Tkinter.py”, line 1405, in __call__
raise SystemExit, msg
SystemExit
>>>
Офлайн
1. Зачем такое извращение как event? можно же просто button = Button(root,command=die)
2. Попробуй sys.exit(0) сделать
Добавлено:
а можно и так попробовать:
from Tkinter import *
root=Tk()
def die():
root.destroy() # Уничтожаем родителькое окно, вместе с тем mainloop выходим из mainloop
b=Button(root,text='hello',command=die)
b.pack()
root.mainloop()
Отредактировано (Окт. 20, 2008 15:47:02)
Офлайн
igor.kaistОба пункта не меняют вообще ничего.
1. Зачем такое извращение как event? можно же просто button = Button(root,command=die)
2. Попробуй sys.exit(0) сделать
Офлайн
Спасибо, “destroy” помогло.
Выходит, “sys.exit()” emacs действительно неадекватно воспринимает.
Офлайн
Но кстати, вот это в emacs тоже адекватно не работает:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
# функция обработки события для кнопки
def die(event):
root.destroy() # уничтожаем родителькое окно, и вместе с тем выходим из цикла его событий
root = Tk() # создаётся главное окно
button = Button(root) # создаётся кнопка в главном окне
button["text"] = u"Завершение работы" # объект кнопки обрабатывается как словарь
button.bind("<Button-1>", die) # регистрация события нажатия первой кнопки мыши
# первый строковый параметр задаёт имя события
# второй параметр указывает имя функции обработки события,
# которая может принимать единственный параметр — event (событие)
# есть альтернативный способ определения функции обработки события:
# button["command"] = die
# при таком подходе параметр event в функции обработки события
# никогда не используется (и не должен быть указан в описании самой функции)
button.pack() # элемент упаковывается в родительском контейнере
root.mainloop() # запуск главного окна и цикла его событий
>>> invalid command name “.3082336396L”
while executing
“$w cget -state”
(procedure “tk::ButtonDown” line 12)
invoked from within
“tk::ButtonDown .3082336396L”
(command bound to event)
Офлайн
Блин, а как вообще в emacs работать-то?
Офлайн
Мне кажется что проблема всетаки в эвенте…
Всетаки гламурнее сделать так :)
#-*- coding:utf-8-*-
from Tkinter import *
root=Tk()
def die(event):
print event # вот тебе и замена эвента, можешь хоть в одном хендлере обрабатывать все кнопки
root.destroy()
b=Button(root,text='Кнопка',command=lambda: die('Я кнопка 1'))
b.pack()
b2=Button(root,text='Еще кнопка',command=lambda: die('Я кнопка 2'))
b2.pack()
root.mainloop()
Отредактировано (Окт. 20, 2008 20:30:56)
Офлайн
Дело не формально в event'е, потому что вот это в emacs работает правильно:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
tk = Tk()
txt = Text(tk)
txt.pack()
def event_info(event):
txt.delete("1.0", END) # очистка с начала до конца текста
for k in dir(event): # цикл по атрибутам события
if k[0] != "_": # берутся только неслужебные атрибуты
# готовится описание атрибута события
ev = "%15s: %s\n" % (k, repr(getattr(event, k)))
txt.insert(END, ev) # добавляется в конец текста
txt.bind("<KeyPress>", event_info)
tk.mainloop()
Офлайн
Вариант в 7 посте работает?
Ты немного путаешь. Я в tkinter'е вроде от и до разобрался. Много книг даже прочитал :)
у конструктора виджета Button, в отличии от Text есть аргумент command, это не я так придумал.
Подумай сам.. Зачем у баттона есть такой аргумент?? Не просто так же для разнообразия он там..
Во всех туториалах призывают использовать именно этот аргумент почему то. Но мой вариант работает? Уверен что да..
Глянь в профиле мой сайт, там в разделе проекты, есть пару приложений с исходниками, гуи сделаны на тк. На днях появится еще одно. Будет сюрприз для доброй половины пользователей этой гуи библиотеки :)
P.S. Попрошу не пугать меня примерами из интуитовского учебника. Давно уже пройденная тема
Отредактировано (Окт. 20, 2008 23:07:35)
Офлайн
igor.kaistДа, спасибо.
Вариант в 7 посте работает?
igor.kaistДля упрощения кодирования, ну и что?
Зачем у баттона есть такой аргумент?? Не просто так же для разнообразия он там..
Отредактировано (Окт. 21, 2008 10:03:42)
Офлайн