Форум сайта python.su
Добрый день! Читаю в книге “wxPython in Action” о рефакторинге и MVC. Решил попробовать сделать такой же пример, но с использованием словаря для хранения виджетов, чтобы позже иметь возможность обращаться к ним при размещении в sizers и т.п.
import wx
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "Test refactoring")
makewid = MakeWidgets(self)
panel = wx.Panel(self)
self.dicData = {}
self.dicData.update(makewid.createButton(panel, self.buttonData))
self.dicData.update(makewid.createTextCtrl(panel, self.textCtrlData))
mainSizer = wx.BoxSizer(wx.VERTICAL)
mainSizer.Add(self.dicData.get("name"), 1, wx.EXPAND|wx.ALL, 10)
mainSizer.Add(self.dicData.get("showBtn"), 0, wx.EXPAND|wx.ALL, 10)
panel.SetSizer(mainSizer)
mainSizer.Fit(self)
mainSizer.SetSizeHints(self)
def buttonData(self):
return (("showBtn", "Show", self.OnShow),)
def textCtrlData(self):
return (("name", "", (180, 40), wx.TE_READONLY),)
def OnShow(self, event): self.dicData.get("name").SetValue("Press showBtn")
class MakeWidgets:
def __init__(self, parent):
self.gui = parent
def createButton(self, panel, function_name):
dic = {}
for eachKey, eachLabel, eachHandler in function_name():
dic[eachKey] = self.buildOneButton(panel, eachLabel, eachHandler)
return dic
def buildOneButton(self, parent, label, handler):
button = wx.Button(parent, wx.NewId(), label)
self.gui.Bind(wx.EVT_BUTTON, handler, button)
return button
def createTextCtrl(self, panel, function_name):
dic = {}
for sequence in function_name():
eachKey = sequence[0]
otherItems = sequence[1:]
dic[eachKey] = self.buildOneTextCtrl(panel, *otherItems)
return dic
def buildOneTextCtrl(self, parent, label, sz=wx.DefaultSize, st=0):
textCtrl = wx.TextCtrl(parent, wx.NewId(), label, size=sz, style=st)
return textCtrl
app = wx.PySimpleApp()
TestFrame().Show()
app.MainLoop()
Отредактировано (Авг. 15, 2009 10:18:02)
Офлайн
Уважаемый Evgen_irk.
Я никогда не держал в руках “wxPython in Action” и не представляю, что содержится в знаменитом примере из 11 главы. Лежащем, видимо, во всемирно известном архиве (раз вы не потрудились ни привести код, ни дать ссылку).
Тем более что вы несколько модифицировали код, приведя его в нерабочее состояние, как я понимаю.
На что вы надеялись, отправляя этот пост? На помощь телепата?
Без хорошо заданного вопроса не будет нормального ответа.
Да, MVC использую. Код только упрощает, если умело применен. Мне удобней всего оказалось строить все на Reactions (это такой юный, но бойкий порт Trellis) - тогда контроллер не нужен вообще.
Офлайн
Уважаемый Андрей Светлов, не могли бы Вы привести небольшой пример программы с GUI и Reactions?
Офлайн
Evgen_irkВообще-то с ними идет и небольшой пример, и большой пример. Жалко только лицензия не позволяет использовать в текущих проектах :(
Уважаемый Андрей Светлов, не могли бы Вы привести небольшой пример программы с GUI и Reactions?
Офлайн
Если есть заинтересованность - лицензию можно довольно быстро поменять.
На google code не дали выбрать то, что хотелось изначально - а потом вопрос как-то сам собой отошел в разряд не самых первоочередных…
Офлайн
Андрей СветловБыло бы здорово, если бы было что-то BSD-like. Насколько я понимаю, исходная у Trellis - PSF - это позволяет. Библиотека реально облегчает работу с ГУИ.
Если есть заинтересованность - лицензию можно довольно быстро поменять.
Офлайн
Вот PSF-то google code и не позволил - нет в готовом списке approved лицензий, а с другими они работать не хотят.
Получение с PJE согласия на переход на MIT - заглохло.
Поправим скоро, думаю.
Офлайн