Найти - Пользователи
Полная версия: Примеры рефакторинга и MVC в wxPython
Начало » GUI » Примеры рефакторинга и MVC в wxPython
1
Evgen_irk
Добрый день! Читаю в книге “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()
Если в методе buildOneButton использовать self.Bind вместо self.parent.Bind, питон выводит ошибку: AttributeError: MakeWidgets instance has no attribute ‘Bind’? Правильно ли так подключать классы в wxPython и передавать конструктору параметр “self”?
Хотел узнать, кто-нибудь использует подобные приемы в своих работах или в простых приложениях это только излишне усложняет код? И можно ли привести простые примеры приложений с использованием MVC? Заранее всем спасибо.
Андрей Светлов
Уважаемый Evgen_irk.
Я никогда не держал в руках “wxPython in Action” и не представляю, что содержится в знаменитом примере из 11 главы. Лежащем, видимо, во всемирно известном архиве (раз вы не потрудились ни привести код, ни дать ссылку).
Тем более что вы несколько модифицировали код, приведя его в нерабочее состояние, как я понимаю.

На что вы надеялись, отправляя этот пост? На помощь телепата?
Без хорошо заданного вопроса не будет нормального ответа.

Да, MVC использую. Код только упрощает, если умело применен. Мне удобней всего оказалось строить все на Reactions (это такой юный, но бойкий порт Trellis) - тогда контроллер не нужен вообще.
Evgen_irk
Уважаемый Андрей Светлов, не могли бы Вы привести небольшой пример программы с GUI и Reactions?
PooH
Evgen_irk
Уважаемый Андрей Светлов, не могли бы Вы привести небольшой пример программы с GUI и Reactions?
Вообще-то с ними идет и небольшой пример, и большой пример. Жалко только лицензия не позволяет использовать в текущих проектах :(
Андрей Светлов
Если есть заинтересованность - лицензию можно довольно быстро поменять.
На google code не дали выбрать то, что хотелось изначально - а потом вопрос как-то сам собой отошел в разряд не самых первоочередных…
PooH
Андрей Светлов
Если есть заинтересованность - лицензию можно довольно быстро поменять.
Было бы здорово, если бы было что-то BSD-like. Насколько я понимаю, исходная у Trellis - PSF - это позволяет. Библиотека реально облегчает работу с ГУИ.
Андрей Светлов
Вот PSF-то google code и не позволил - нет в готовом списке approved лицензий, а с другими они работать не хотят.
Получение с PJE согласия на переход на MIT - заглохло.

Поправим скоро, думаю.
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