这是我新建的一个项目,主页在 http://code.google.com/p/meide/

背景:

使用wxPython开发GUI时经常要生成界面,
一种是通过工具生成(但我认为这种重用性并不好),另一种就是手工写代码。我主要是手工写代码,但是需要你有耐心。以前创建过叫
EasyGuider 的项目,它可以通过字典形式的数据结构快速生成界面,不过存在一些问题:格式固定,不支持事件。于是我从快速辅助手写代码的需求上创建了这个新项目。它适合用来生成简单,有规律的界面。从我个人的开发体会(UliPad),大量的界面工作并不是很复杂,但是生成组件,布局比较麻烦,因此就想从这里入手,考虑如何快速开发界面。

目标:

方便定义界面
支持事件
支持validate(考虑中)

因此这个项目是从代码级的复用和简化方面来考虑的。目前已经有一些基础代码,有兴趣的可以看一看。不过需要实现的功能还很多。大家有什么好的想法可以交流。

整个框架的设计分为几个层次:

元素
布局
窗体(还未实现)
辅助工具

常见的控件将有对应的类实现。布局目前已经支持HBox, VBox, HGroup, VGroup, Grid, SimpleGrid。布局对象之间可以嵌套。

举一个简单的例子说明使用(可以看tests/test_hbox.py)

import wx
import sys

sys.path.insert(0, ‘..’)

class wxApp(wx.App):
   def OnInit(self):
       return True

class Frame(wx.Frame):
   def __init__(self):
       super(Frame, self).__init__(None, -1)
       self.init()

   def init(self):
       import meide
       self.box = box = meide.VBox(padding=4)
       box.add(”, meide.Label(‘Hello’))
       box.add(‘text’, meide.Text(‘Hello’, size=(100, -1)))
       meide.create(self, box)

if __name__ == ‘__main__’:
   wxApp = wxApp(0)
   frame = Frame()
   frame.Show()
   wxApp.SetTopWindow(frame)
   wxApp.MainLoop()

这是一个VBox的示例。VBox在创建时可以设置一个padding的参数,它表示这个VBox与周围的空白间距为4个像素。

box.add(”, meide.Label(‘Hello’))
这行是加了一个标签。第一个参数是名字,如果不需要可以为”。不过meide会自动生成一个id_开头的名字,不过一般不用。Label将会使用wx.StaticText控件来生成。也就是说每一个meide的控件将对应一个实际或组合的wxPython控件。Label至少需要一个字符串参数。其实meide在处理控件时比较特殊,它是按照wxPython相应控件的构造参数来组织的,你其实可以根据相应的实际控件填入其它的参数。

box.add(‘text’, meide.Text(‘Hello’, size=(100, -1)))
这行是加入一个文本输入字符,对应于单选输入。第一个参数为它的名字。从这个例子你可以看到它多了一个size的参数。100表示宽度,-1表示不关心。那么meide在处理每个控件时会有一个缺省的缩放因子,对于Text它就是(-1,
0)(从meide.py中可以找到,它是一个类属性叫proportion)。当出现size时,这个缩放因子会与size进行比较,如果缩放因子的x,y的值为-1表示可以缩放,同时相应的size的值也为-1的话,就在相应的方向上进行缩放。如果没有size参数,则按照缩放因子来进行设置。所以很有趣。缩放因子用来控制在哪个方向上可以缩放,而size的定义可以取消某个方面的缩放。

在添加完元素之后,执行:meide.create(self, box),这样元素就画出来了,同时box对应的sizer自动与窗体相关联。

以上只是一个简单的示例,还有许多功能在开发中。

同时要指出,目前meide并不是一个完整的界面解决工具,它侧重于代码的局部。如果你想使用更抽象的mvc的方式,建议研究一下enthought的traits。


评论

该日志第一篇评论

发表评论

评论也有版权!