Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Примеры рефакторинга и MVC в wxPython [RSS Feed]

#1 Авг. 14, 2009 06:43:40

Evgen_irk
От: Иркутск
Зарегистрирован: 2009-02-02
Сообщения: 45
Репутация: +  4  -
Профиль   Отправить e-mail  

Примеры рефакторинга и MVC в wxPython

Добрый день! Читаю в книге “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? Заранее всем спасибо.



wxPython

Отредактировано (Авг. 15, 2009 10:18:02)

Офлайн

#2 Авг. 14, 2009 15:46:35

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Примеры рефакторинга и MVC в wxPython

Уважаемый Evgen_irk.
Я никогда не держал в руках “wxPython in Action” и не представляю, что содержится в знаменитом примере из 11 главы. Лежащем, видимо, во всемирно известном архиве (раз вы не потрудились ни привести код, ни дать ссылку).
Тем более что вы несколько модифицировали код, приведя его в нерабочее состояние, как я понимаю.

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

Да, MVC использую. Код только упрощает, если умело применен. Мне удобней всего оказалось строить все на Reactions (это такой юный, но бойкий порт Trellis) - тогда контроллер не нужен вообще.



Офлайн

#3 Авг. 23, 2009 12:48:01

Evgen_irk
От: Иркутск
Зарегистрирован: 2009-02-02
Сообщения: 45
Репутация: +  4  -
Профиль   Отправить e-mail  

Примеры рефакторинга и MVC в wxPython

Уважаемый Андрей Светлов, не могли бы Вы привести небольшой пример программы с GUI и Reactions?



wxPython

Офлайн

#4 Авг. 24, 2009 05:40:20

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Примеры рефакторинга и MVC в wxPython

Evgen_irk
Уважаемый Андрей Светлов, не могли бы Вы привести небольшой пример программы с GUI и Reactions?
Вообще-то с ними идет и небольшой пример, и большой пример. Жалко только лицензия не позволяет использовать в текущих проектах :(



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Авг. 24, 2009 21:43:55

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Примеры рефакторинга и MVC в wxPython

Если есть заинтересованность - лицензию можно довольно быстро поменять.
На google code не дали выбрать то, что хотелось изначально - а потом вопрос как-то сам собой отошел в разряд не самых первоочередных…



Офлайн

#6 Авг. 25, 2009 10:21:19

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Примеры рефакторинга и MVC в wxPython

Андрей Светлов
Если есть заинтересованность - лицензию можно довольно быстро поменять.
Было бы здорово, если бы было что-то BSD-like. Насколько я понимаю, исходная у Trellis - PSF - это позволяет. Библиотека реально облегчает работу с ГУИ.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Авг. 25, 2009 11:31:46

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Примеры рефакторинга и MVC в wxPython

Вот PSF-то google code и не позволил - нет в готовом списке approved лицензий, а с другими они работать не хотят.
Получение с PJE согласия на переход на MIT - заглохло.

Поправим скоро, думаю.



Офлайн

  • Начало
  • » GUI
  • » Примеры рефакторинга и MVC в wxPython[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version