Форум сайта python.su
Здравствуйте. Подскажите, как сделать так, чтобы программа в окне создавала кнопки, и потом их удаляла.
Это можно представить как окно содержащее 2 кнопка “Добавить” и “Удалить” и EditBox в который пишется название кнопки.
По нажатию кнопки “Добавить” создается кнопка с названием указанным в Edit
По нажатию кнопки “Удалить” удаляетя кнопка с названием указанным в Edit.
С помощью pygtk я могу “нарисовать” кнопку в HBox() с помошью следующего кода:
self.container = gtk.HBox()
self.button = gtk.Button("Button1")
self.container.add(self.button)
self.button.show()
self.container.show()
self.button = gtk.Button("Button2")
self.container.add(self.button)
self.button.show()
self.container.show()
Офлайн
помести кнопки в список, и рули элементами списка
Офлайн
pasaranax
Пример можно?
Офлайн
D_Darth
Если правильно понял, то следующий код - примерно то, что вам нужно.
Последовательнось действий: в поле self.entry вводите название создаваемой кнопки, нажимаете Enter, далее Добавить - кнопка создается. Для удаления соотвественно - вводите название удаляемой кнопки, опять Enter,Удалить - кнопка удаляется. Код писался на скорую руку, за шероховатости (global, exec, отсутствие обработки ошибок) прошу извинить. Удачи :)
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
entry_text='blablabla'
class Buttons:
def add_button(self,widget):
exec 'self.'+entry_text+' = gtk.Button()'
exec 'self.'+entry_text+'.set_label('+'entry_text'+')'
exec 'self.container.add(self.'+entry_text+')'
exec 'self.'+entry_text+'.show()'
self.container.show()
def delete_button(self, widget):
exec 'self.'+entry_text+'.destroy()'
def enter_callback(self, widget, entry):
global entry_text
entry_text = entry.get_text()
print 'in enter_callback', entry_text
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("destroy", lambda wid: gtk.main_quit())
self.container = gtk.VBox()
self.button_add = gtk.Button( stock=gtk.STOCK_ADD)
self.container.add(self.button_add)
self.button_add.show()
self.container.show()
self.button_delete = gtk.Button( stock=gtk.STOCK_DELETE)
self.container.add(self.button_delete)
self.button_delete.show()
self.container.show()
self.entry=gtk.Entry()
self.entry.connect("activate", self.enter_callback, self.entry)
self.container.add(self.entry)
self.entry.show()
self.container.show()
self.button_add.connect("clicked", self.add_button)
self.button_delete.connect("clicked", self.delete_button)
self.window.add(self.container)
self.window.show()
Buttons()
gtk.main()
Офлайн
D_DarthКажется, я ошибся, я гтк не знаю, видимо с гткшным методом работы с элементами так не получится.
pasaranax
Пример можно?
Офлайн
gmorgunov
Спасибо большое. Бегло посмотрел, и по моему как раз то, что мне надо
Офлайн
Теперь возник другой вопрос. мне нужно заменить gtk.Button на gtk.HBox внутри которого находится gtk.Image вместе с gtk.Label. Тоесть мне нужно создать класс(я его представляю таким):
class myButton():
def __init__(self):
self.path_icon = ""
self.button = gtk.HBox()
self.icon = gtk.Image()
self.icon.set_from_file(self.path_icon)
self.icon.show()
self.button.add(self.icon)
self.label = gtk.Label()
self.label.show()
self.button.add(self.label)
self.container = gtk.HBox()
self.evbox = gtk.EventBox()
self.evbox.connect("button-press-event",self.click)
self.container.add(self.evbox)
self.button = myButton()
self.evbox.add(self.button)
Отредактировано (Июль 28, 2009 11:13:41)
Офлайн
Всем спасибо. сам разобрался. Выкладываю мой класс. Мож комунить пригодится.
class myButton(gtk.HBox):
def __init__(self):
gtk.HBox.__init__(self)
self.textlabel = "Labellabel"
self.iconpath = "/usr/share/pixmaps/firefox-3.0.png"
self.icon = gtk.Image()
self.icon.set_from_file(self.iconpath)
self.icon.show()
self.pack_start(self.icon)
self.label = gtk.Label(self.textlabel)
self.label.show()
self.pack_start(self.label)
Офлайн
def add_button(self,widget):
exec 'self.'+entry_text+' = gtk.Button()'
exec 'self.'+entry_text+'.set_label('+'entry_text'+')'
exec 'self.container.add(self.'+entry_text+')'
exec 'self.'+entry_text+'.show()'
def add_button(self,widget):
button = gtk.Button()
self.container.add(button)
button.set_label(entry_text)
button.show()
setattr(self, entry_text, button)
Офлайн
bazookaдак вродь и так я написал без execdef add_button(self,widget):
exec 'self.'+entry_text+' = gtk.Button()'
exec 'self.'+entry_text+'.set_label('+'entry_text'+')'
exec 'self.container.add(self.'+entry_text+')'
exec 'self.'+entry_text+'.show()'не лучше без exec ?def add_button(self,widget):
button = gtk.Button()
self.container.add(button)
button.set_label(entry_text)
button.show()
setattr(self, entry_text, button)
Офлайн