Tutorialspoint WxPython 教程
来源:易百教程
wxPython开发环境安装 - WxPython教程™
在Windows上安装
预编译的二进制在Windows操作系统(32位和64位)可在页面: http://www.wxpython.org/download.php 下载。最新版本的安装程序是 − wxPython3.0-win64-3.0.2.0-py27.exe 和 wxPython3.0-win64-3.0.2.0-py27.exe 对应操作系统版本。
wxPython的示例以及 wxWidgets 文档也可以在同一页上下载。wxPython3.0-win32-docs-demos.exe
在Linux系统上安装
wxPython的二进制文件很多Linux发行版,可以在各自的资料库中找到。相应的包管理器将需要下载和安装。例如,在Debian Linux上,下面的命令应该能够用来安装 wxPython。
sudo apt-get install python-wxgtk3.0
在MacOS系统上安装
可在官方网站的下载页面上下载预编译的二进制文件,在MacOS的磁盘映像的形式来安装文件。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython开发环境安装
wxPython入门(Hello World) - WxPython教程™
一个简单的GUI应用程序显示Hello World消息使用以下构建步骤 −
- 导入 wx 模块
- 定义应用程序类的一个对象
- 创建一个顶层窗口的 wx.Frame 类的对象。 给出构造标题和尺寸参数。
- 虽然其他控件可以在Frame对象加入,但它们的布局无法管理。因此,把一个Panel对象到框架。
- 添加一个静态文本对象,以显示 ‘Hello World’在窗口内的任意位置。
- 通过show()方法激活框架窗口。
- 输入应用程序对象的主事件循环。
创建一个 HelloWord.py 代码,如下:
import wx
app = wx.App()
window = wx.Frame(None, title = "wxPython - www.yiibai.com", size = (400,300))
panel = wx.Panel(window)
label = wx.StaticText(panel, label = "Hello World", pos = (100,100))
window.Show(True)
app.MainLoop()
上面的代码产生下面的输出 −
wxFrame对象是最常用的顶层窗口。它是从 wxWindow 类派生的。 frame其大小和位置可以由用户改变的一种窗口。它有一个标题栏和控制按钮。如果需要的话,其他组件,如菜单栏,工具栏和状态栏等都可以启用。wxFrame窗口可以包含任何帧(frame)而不只是一个对话或另一个帧(frame)。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython入门(Hello World)
wxPython GUI构建工具wxFormBuilder - WxPython教程™
如果要创建一个漂亮的图形用户界面通过手工编码可能是很乏味的。一个可视化的界面设计工具是得心应手的了。有许多可针对wxPython的GUI开发的IDE。以下是其中的一些 −
- wxFormBuilder
- wxDesigner
- wxGlade
- BoaConstructor
- gui2py
wxFormBuilder是一个开源,跨平台的所见即所得的图形用户界面生成器,可以翻译wxWidget GUI设计成C++,Python和PHP或XML格式。 简要介绍 wxFormBuilder 的用法是在这里给出。
首先 wxFormBuilder 的所有最新版本需要从http://sourceforge.net/projects/wxformbuilder/.下载和从安装。在打开应用程序时,出现空白的灰色区域为新项目的中心。
给该项目一个合适的名字,并选择Python作为代码生成语言。 在对象属性窗口,如图下图 −
然后从组件面板“表单”选项卡中,选择画面。
从“Layouts”选项卡中添加一个垂直wxBoxSizer。
在框中添加必要的控制并使用合适的标题。这里,一个静态文本(标签),两个TextCtrl对象(文本框)和一个wxButton对象相加。该框架看起来像下面的图片 -
启用扩展和拉伸在这三个控件。 在对象的属性为wxButton对象指定一个函数 findsquare()来处理 OnButtonClick事件。
保存该项目,然后按F8键生成 Python代码开发的GUI。让生成的文件命名为Demo.py
在可执行Python脚本,导入demo.py并定义FindSquare()函数。声明Application对象并启动主事件循环。以下是可执行代码 -
import wx
#import the newly created GUI file
import demo
class CalcFrame(demo.MyFrame1):
def __init__(self,parent):
demo.MyFrame1.__init__(self,parent)
def FindSquare(self,event):
num = int(self.m_textCtrl1.GetValue())
self.m_textCtrl2.SetValue (str(num*num))
app = wx.App(False)
frame = CalcFrame(None)
frame.Show(True)
#start the applications
app.MainLoop()
上面的代码产生下面的输出 −
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython GUI构建工具wxFormBuilder
wxPython Frame类 - WxPython教程™
wx.Frame类不带参数的默认构造函数。它也有一个重载的构造函数的参数如下 -
Wx.Frame (parent, id, title, pos, size, style, name)
S.N. | 参数 & 描述 |
1 | Parent 窗口的父类。如果“None”被选择的对象是在顶层窗口。如果“None”未被选择时,所述框显示在父窗口的顶层 |
2 | id 窗口标识。通常-1为了让标识符自动生成 |
3 | Title 标题出现在标题栏 |
4 | Pos 帧(frame)的开始位置。如果没有给出,wxDefaultPosition是由操作系统决定 |
5 | Size 窗口的尺寸。 wxDefaultSize 是由操作系统决定 |
6 | style 窗口的外观按样式风格常数控制 |
7 | name 对象的内部名称 |
窗口样式常量
wx.DEFAULT_FRAME_STYLE |
wx.CAPTION |
wx.MINIMIZE_BOX |
wx.MAXIMIZE_BOX |
wx.CLOSE_BOX |
wx.SYSTEM_MENU |
wx.RESIZE_BORDER |
wx.STAY_ON_TOP |
wx.FRAME_FLOAT_ON_PARENT |
wx.DEFAULT_FRAME_STYLE 可被定义为如下 −
- wx.MINIMIZE_BOX
- wx.MAXIMIZE_BOX
- wx.RESIZE_BORDER
- wx.SYSTEM_MENU
- wx.CAPTION
- wx.CLOSE_BOX
- wx.CLIP_CHILDREN
示例
window = wx.Frame(None, -1, “Hello”, pos = (10,10), size = (300,200),
style = wxDEFAULT_FRAME_STYLE, name = "frame")
wx.Frame类成员函数
S.N. | 函数 & 描述 |
1 | CreateStatusBar() 创建窗口底部状态栏 |
2 | CreateToolBar() 创建工具栏在窗口的顶部或左侧 |
3 | GetMenuBar() 获取引用菜单栏 |
4 | GetStatusBar() 获取引用状态栏 |
5 | SetMenuBar() 在帧(frame)显示菜单栏对象 |
6 | setStatusBar() 关联状态栏对象到框架(frame) |
7 | SetToolBar() 关联工具栏对象到框架(frame) |
8 | SetStatusText() 在状态栏上显示的文字 |
9 | Create() 创建有提供参数的框架 |
10 | Centre() 放置该帧(frame)显示在中心 |
11 | SetPosition() 放置帧(frame)在给定的屏幕坐标 |
12 | SetSize() 由给定尺寸调整框架(frame)大小 |
13 | SetTitle() 插入给定文本到标题栏 |
wx.Frame 事件绑定器
S.N. | 事件 & 描述 |
1 | EVT_CLOSE 当帧被用户关闭/或以编程方式点击关闭按钮 |
2 | EVT_MENU_OPEN 当一个菜单即将打开 |
3 | EVT_MENU_CLOSE 当一个菜单刚刚关闭 |
4 | EVT_MENU_HIGHLIGHT 当指定id菜单项突显 |
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython Frame类
wxPython Panel类 - WxPython教程™
小构件,如按钮,文本框等被放置在面板窗口。 wx.Panel类通常是被放在一个wxFrame对象中。这个类也继承自wxWindow类。
虽然控件可以手动放置在面板指定屏幕坐标的位置,建议使用合适的布局方案,称为大小测定器(sizer)在wxPython中,为更好地控制布局和解决调整大小的问题。
在wxPanel构造,父参数是wx.Frame对象,在面板中放置。id参数的默认值是wx.ID_ANY,而默认的样式参数是wxTAB_TRAVERSAL。
wxPython的API具有以下大小测定器(sizers),使用该控件被添加到面板对象 -
S.N. | Sizers & 描述 |
1 | wx.BoxSizer 窗口小部件布置成垂直或水平框 |
2 | wx.StaticBoxSizer 添加staticbox围绕测定器(sizer) |
3 | wx.GridSizer 每个单元增加一个控件在网格的大小相等的单元 |
4 | wx.FlexGridSizer 控件加入单元网格可以占据多个单元格 |
5 | wx.GridBagSizer 对照明确地定位在网格和横跨多个行和/或列 |
Sizer对象为使用wxPanel类的SetSizer ()方法在面板的布局管理器应用。
wx.Panel.SetSizer(wx.???Sizer())
面板对象按顺序添加到顶层帧(frame)。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython Panel类
wxPython StaticText类 - WxPython教程™
在GUI接口中有一个重要东西是一个标签,一行或多行的只读文本。它通常放置在框架(frame)上或者作为另一插件的标识符或作为信息串。
在wxPython中,wx.StaticText类对象提供了一个控件持有这样的只读文本。它被动控制,因为不产生任何事件。Wx.StaticText类的构造函数需要下列的参数-
Wx.StaticText(parent, id, label, position, size, style)
预定义的样式枚举器 -
wx.ALIGN_LEFT | 控制标签的大小及对齐 |
wx.ALIGN_RIGHT | |
wx.ALIGN_CENTER | |
wx.ST_NO_AUTORESIZE | 防止标签的自动调整大小 |
wx.ST_ELLIPSIZE_START | 省略号(...)显示在开始,中间或结尾,如果文本的大小大于标签尺寸 |
wx.ST_ELLIPSIZE_MIDDLE | |
wx.ST_ELLIPSIZE_END |
StaticText类的上述特征表现在以面的例子。三个StaticText对象被放置在一个垂直的盒子大小测定器(sizer)。
所述第一对象中心对准多行文本。第二个标签的文本设置为环绕超过200像素。第三标签显示省略号(...)在文本的中间。
为了设置标签的字体,首先创建一个字体对象。
Wx.Font(pointsize, fontfamily, fontstyle, fontweight)
下面给出 FontFamily 的最常用的参数。fontFamily 参数取值为-
S.N. | 参数 & 描述 |
1 | Wx.FONTSTYLE_NORMAL 字体绘制不使用倾斜 |
2 | wx.FONTSTYLE_ITALIC 字体是斜体 |
3 | wx.FONTSTYLE_SLANT 字体是倾斜的,但以罗马风格形式 |
FontWeight参数-
S.N. | 参数 & 描述 |
1 | Wx.FONTWEIGHT_NORMAL 普通字体 |
2 | wx.FONTWEIGHT_LIGHT 高亮字体 |
3 | wx.FONTWEIGHT_BOLD 粗体 |
完整的代码列表 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (600,200))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.VERTICAL)
lbl = wx.StaticText(panel,-1,style = wx.ALIGN_CENTER)
txt1 = "Python GUI development"
txt2 = "using wxPython"
txt3 = " Python port of wxWidget "
txt = txt1+"\n"+txt2+"\n"+txt3
font = wx.Font(18, wx.ROMAN, wx.ITALIC, wx.NORMAL)
lbl.SetFont(font)
lbl.SetLabel(txt)
box.Add(lbl,0,wx.ALIGN_CENTER)
lblwrap = wx.StaticText(panel,-1,style = wx.ALIGN_RIGHT)
txt = txt1+txt2+txt3
lblwrap.SetLabel(txt)
lblwrap.Wrap(200)
box.Add(lblwrap,0,wx.ALIGN_LEFT)
lbl1 = wx.StaticText(panel,-1, style = wx.ALIGN_LEFT | wx.ST_ELLIPSIZE_MIDDLE)
lbl1.SetLabel(txt)
lbl1.SetForegroundColour((255,0,0))
lbl1.SetBackgroundColour((0,0,0))
font = self.GetFont()
font.SetTutorialsSize(20)
lbl1.SetFont(font)
box.Add(lbl1,0,wx.ALIGN_LEFT)
panel.SetSizer(box)
self.Centre()
self.Show()
app = wx.App()
Mywin(None, 'StaticText demo')
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython StaticText类
wxPython TextCtrl类 - WxPython教程™
在GUI接口中,输入是最常见的是在一个文本框收集,用户可以使用键盘键入。 在wxPython中,wx.TextCtrl类的一个对象就是用于这一目的。它可以显示文本和编辑的控制。 TextCtrl小部件可以是单行,多行或密码字段。TextCtrl类的构造函数形式如下 -
wx.TextCtrl(parent, id, value, pos, size, style)
样式(style)参数接受一个或多个常量,如下列表 −
S.N. | 参数&描述 |
1 | wx.TE_MULTILINE 文本控件允许多行。如果未指定该样式(style),换行字符不应该在控件值中使用。 |
2 | wx.TE_PASSWORD 文本将回显为星号 |
3 | wx.TE_READONLY 文本将不可编辑 |
4 | wxTE_LEFT 在控件中的文本将左对齐(默认) |
5 | wxTE_CENTRE 在控件中的文本将居中对齐 |
6 | wxTE_RIGHT 在控件中的文本将居右对齐 |
wx.TextCtrl类的重要方法。
下面的事件绑定器负责处理事件相关的TextCtrl框中输入文字 -
S.N. | 事件&描述 |
1 | EVT_TEXT 响应变化的文本框的内容,或者通过手动键入,或以编程方式 |
2 | EVT_TEXT_ENTER 调用相关的处理程序当Enter键在文本框中按下 |
3 | EVT_TEXT_MAXLEN 只要文本长度进入触发相关处理程序达到SetMaxLength()函数的值 |
实例
在下面的例子中,具有不同属性的 wx.TextCtrl 类的四个对象被放置在面板上。
self.t1 = wx.TextCtrl(panel)
self.t2 = wx.TextCtrl(panel,style = wx.TE_PASSWORD)
self.t3 = wx.TextCtrl(panel,size = (200,100),style = wx.TE_MULTILINE)
self.t4 = wx.TextCtrl ( panel, value = "ReadOnly Text",
style = wx.TE_READONLY | wx.TE_CENTER )
虽然首先是一个普通的文本框,第二个是一个密码字段。第三个是多行文本框,而最后一个文本框是不可编辑的。
第一个框 EVT_TEXT 绑定器触发 OnKeyTyped()方法可以处理每个击键。第二个框它的最大长度为5。一旦用户试图输入超过500个字符,EVT_TEXT_MAXLEN 绑定器发送运行OnMaxLen()函数。多行文本框响应回车键按下,因为EVT_TEXT_ENTER绑定器。
TextCtr.py 完整的代码如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (350,250))
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
l1 = wx.StaticText(panel, -1, "文本域")
hbox1.Add(l1, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
self.t1 = wx.TextCtrl(panel)
hbox1.Add(self.t1,1,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
self.t1.Bind(wx.EVT_TEXT,self.OnKeyTyped)
vbox.Add(hbox1)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
l2 = wx.StaticText(panel, -1, "密码文本")
hbox2.Add(l2, 1, wx.ALIGN_LEFT|wx.ALL,5)
self.t2 = wx.TextCtrl(panel,style = wx.TE_PASSWORD)
self.t2.SetMaxLength(5)
hbox2.Add(self.t2,1,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox2)
self.t2.Bind(wx.EVT_TEXT_MAXLEN,self.OnMaxLen)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)
l3 = wx.StaticText(panel, -1, "多行文本")
hbox3.Add(l3,1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
self.t3 = wx.TextCtrl(panel,size = (200,100),style = wx.TE_MULTILINE)
hbox3.Add(self.t3,1,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox3)
self.t3.Bind(wx.EVT_TEXT_ENTER,self.OnEnterPressed)
hbox4 = wx.BoxSizer(wx.HORIZONTAL)
l4 = wx.StaticText(panel, -1, "只读取文本")
hbox4.Add(l4, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
self.t4 = wx.TextCtrl(panel, value = "只读文本",style = wx.TE_READONLY|wx.TE_CENTER)
hbox4.Add(self.t4,1,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox4)
panel.SetSizer(vbox)
self.Centre()
self.Show()
self.Fit()
def OnKeyTyped(self, event):
print event.GetString()
def OnEnterPressed(self,event):
print "Enter pressed"
def OnMaxLen(self,event):
print "Maximum length reached"
app = wx.App()
Mywin(None, '
TextCtrl实例-
www.yiibai.com
')
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython TextCtrl类
wxPython RadioButton & RadioBox类 - WxPython教程™
单选按钮通常表现为一组用户从多种可选按钮里选择一个选项。每个按钮,wx.RadioButton类的一个对象会在旁边带着一个圆形按钮文本标签。
为了创建一组相互可选择的按钮,首先wxRadioButton对象的样式参数设置为wx.RB_GROUP。后继按钮对象会被添加到一组。
wxPython的API还包括wx.RadioBox类。它的对象提供了一个边框和标签组。组中的按钮可以水平或垂直布置。
wx.RadioButton构造看起来像 -
Wx.RadioButton(parent, id, label, pos, size, style)
style参数仅用于该组中的第一个按钮。它的值是wx.RB_GROUP。对于组中的随后的按钮,wx.RB_SINGLE的style 参数可以任选地使用。
每任何组中的按钮被点击时 wx.RadioButton 事件绑定器 wx.EVT_RADIOBUTTON 触发相关的处理程序。
wx.RadioButton类的两种重要的方法是 SetValue() – 选择或取消选择按钮编程,和getValue() 如果选择一个按钮则返回 true,否则返回 false。
wx.RadioBox 则以相互排斥的按钮集合在一个静态框。该组中的每个按钮将其标签从列表对象作为'选择'wx.RadioBox构造函数的参数。
RadioBox按钮将在按行或列的方式逐步布局。对于构造的'style'参数的值应该是wx.RA_SPECIFY_ROWS或wx.RA_SPECIFY_COLS。行/列的数目是由'majordimensions'参数的值来决定。
wx.RadioBox构造函数的原型是 -
Wx.RadioBox(parent, id, label, pos, size, choices[], initialdimensions, style)
以下是wx.RadioBox类的重要方法 -
S.N. | 方法 & 描述 |
1 | GetSelection() 返回所选项目的索引 |
2 | SetSelection() 选择编程项目 |
3 | GetString() 返回选定项的标签 |
4 | SetString() 分配标签到所选择的项目 |
5 | Show() 显示或隐藏指定索引的项目 |
与wx.RadioBox对象关联的事件绑定是wx.EVT_RADIOBOX。关联的事件处理程序识别按钮的选择并处理它。
实例
下面的例子演示了如何使用RadioBox以及单选按钮。首先,三个单选按钮通过指定wx.RB_GROUP样式分组并放置在面板上。
self.rb1 = wx.RadioButton(pnl,11, label = 'Value A', pos = (10,10), style = wx.RB_GROUP)
self.rb2 = wx.RadioButton(pnl,22, label = 'Value B',pos = (10,40))
self.rb3 = wx.RadioButton(pnl,33, label = 'Value C',pos = (10,70))
在RadioBox,另一方面,从 lblList[]对象的读出标签按钮。
lblList = ['Value X', 'Value Y', 'Value Z']
self.rbox = wx.RadioBox(pnl,label = 'RadioBox', pos = (80,10), choices = lblList ,
majorDimension = 1, style = wx.RA_SPECIFY_ROWS)
两个事件绑定器,一个单选按钮组和其他的 RadioBox 被声明。
self.Bind(wx.EVT_RADIOBUTTON, self.OnRadiogroup)
self.rbox.Bind(wx.EVT_RADIOBOX,self.onRadioBox)
相应的事件处理程序确定所选择的按钮,并在控制台窗口中显示消息。
def OnRadiogroup(self, e):
rb = e.GetEventObject()
print rb.GetLabel(),' is clicked from Radio Group'
def onRadioBox(self,e):
print self.rbox.GetStringSelection(),' is clicked from Radio Box'
RadioBoxAndRadioButton.py 完整的代码如下:
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title = title,size = (300,200))
self.InitUI()
def InitUI(self):
pnl = wx.Panel(self)
self.rb1 = wx.RadioButton(pnl,11, label = 'Value A',
pos = (10,10), style = wx.RB_GROUP)
self.rb2 = wx.RadioButton(pnl,22, label = 'Value B',pos = (10,40))
self.rb3 = wx.RadioButton(pnl,33, label = 'Value C',pos = (10,70))
self.Bind(wx.EVT_RADIOBUTTON, self.OnRadiogroup)
lblList = ['Value X', 'Value Y', 'Value Z']
self.rbox = wx.RadioBox(pnl, label = 'RadioBox', pos = (80,10), choices = lblList,
majorDimension = 1, style = wx.RA_SPECIFY_ROWS)
self.rbox.Bind(wx.EVT_RADIOBOX,self.onRadioBox)
self.Centre()
self.Show(True)
def OnRadiogroup(self, e):
rb = e.GetEventObject()
print rb.GetLabel(),' is clicked from Radio Group'
def onRadioBox(self,e):
print self.rbox.GetStringSelection(),' is clicked from Radio Box'
ex = wx.App()
Example(None,'
RadioButton & RadioBox -
www.yiibai.com
')
ex.MainLoop()
上面的代码产生下面的输出 -
Value B is clicked from Radio Group
Value C is clicked from Radio Group
Value Y is clicked from Radio Box
Value X is clicked from Radio Box
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython RadioButton & RadioBox类
wxPython CheckBox类 - WxPython教程™
一个复选框显示一个小标记的矩形框。单击时,复选标记出现在矩形内,指示作出选择。 复选框优于单选按钮,当允许用户多选。在这种情况下,第三状态称为混合或不确定的状态,一般用在“不适用”情景。
通常情况下,一个复选框对象有两种状态(选中或未选中)。如果相应的参数将被赋予三态复选框也可以构造。
wx.CheckBox类的构造函数的参数如下 -
Wx.CheckBox(parent, id, label, pos, size, style)
以下样式参数值可以使用 -
S.N. | 参数和说明 |
1 | wx.CHK_2STATE 创建两个状态复选框。 这是默认值 |
2 | wx.CHK_3STATE 创建三态复选框 |
3 | wx.ALIGN_RIGHT 把一个盒子标签放在复选框的左侧 |
这个类有两个重要的方法 - GetState()返回true或false,取决于如果该复选框被选中或未选。SetValue()用于编程方式选择一个复选框。
wx.EVT_CHECKBOX是唯一的事件绑定可用。相关的事件处理程序将在每次框架上的任何复选框被选中或取消时调用。
实例
下面是一个简单的例子演示如何使用三个复选框。处理函数 OnChecked()识别对应的复选框,它负责事件并显示其状态。
CheckBox.py 完整源代码 −
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title = title,size = (300,200))
self.InitUI()
def InitUI(self):
pnl = wx.Panel(self)
self.cb1 = wx.CheckBox(pnl, label = 'Value A',pos = (10,10))
self.cb2 = wx.CheckBox(pnl, label = 'Value B',pos = (10,40))
self.cb3 = wx.CheckBox(pnl, label = 'Value C',pos = (10,70))
self.Bind(wx.EVT_CHECKBOX,self.onChecked)
self.Centre()
self.Show(True)
def onChecked(self, e):
cb = e.GetEventObject()
print cb.GetLabel(),' is clicked',cb.GetValue()
ex = wx.App()
Example(None,'CheckBox Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
A 被点击为 True
B 被点击为 True
C 被点击为 True
B 被点击为 False
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython CheckBox类
wxPython ComboBox & Choice类 - WxPython教程™
wx.ComboBox对象提供从项目选择列表。它可以被配置为一个下拉列表或永久性的显示。
从列表中选择的项目显示在文本字段中,默认情况下是可编辑的,但是可以在wx.CB_READONLY style 参数设置为只读。
wxPython API包含一个wx.Choice类,其目的也是一个下拉列表,是永久只读。
使用 wx.ComboBox 类构造函数的参数 −
Wx.ComboBox(parent, id, value, pos, size, choices[], style)
value参数是要显示在组合框的文本框中的文本。 它是由 choices[] 集合中的项目进行填充。
下面的样式参数定义为 wx.ComboBox -
S.N. | 参数和说明 |
1 | wx.CB_SIMPLE 组合框与永久显示的列表 |
2 | wx.CB_DROPDOWN 组合框与下拉列表 |
3 | wx.CB_READONLY 选择的项目是不可编辑 |
4 | wx.CB_SORT 列表显示按字母顺序 |
下表显示了常用wx.ComboBox类的方法 −
S.N. | 方法和说明 |
1 | GetCurrentSelection () 返回被选中的项目 |
2 | SetSelection() 将给定索引处的项设置为选中状态 |
3 | GetString() 返回给定索引处的项目关联的字符串 |
4 | SetString() 给定索引处更改项目的文本 |
5 | SetValue() 设置一个字符串作为组合框文本显示在编辑字段中 |
6 | GetValue() 返回组合框的文本字段的内容 |
7 | FindString() 搜索列表中的给定的字符串 |
8 | GetStringSelection() 获取当前所选项目的文本 |
事件绑定器生成此类的事件如下 -
S.N. | 事件和说明 |
1 | wx. COMBOBOX 当列表项目被选择 |
2 | wx. EVT_TEXT 当组合框的文本发生变化 |
3 | wx. EVT_COMBOBOX_DROPDOWN 当下拉列表 |
4 | wx. EVT_COMBOBOX_CLOSEUP 当列表折叠起来 |
wx.Choice类的构造函数原型如下 −
wx.Choice(parent, id, pos, size, n, choices[], style)
参数“n”代表字符串的数目使于选择列表的初始化。像组合框,项目被填充到 choices[]集合列表。
对于选择类,wx.CB_SORT为只有一个类型的参数定义。wx.EVT_CHOICE为只有一个事件绑定处理由该类发出的事件。
实例
下面的示例显示 wx.ComboBox 和 wx.Choice 的特点。这两个对象被放在一个垂直的盒子大小测定器(sizer)。这些项目用于填充languages[]列表的对象。
languages = ['C', 'C++', 'Python', 'Java', 'Perl']
self.combo = wx.ComboBox(panel,choices = languages)
self.choice = wx.Choice(panel,choices = languages)
事件绑定器EVT_COMBOBOX和EVT_CHOICE相应的对它们的事件处理。
self.combo.Bind(wx.EVT_COMBOBOX, self.OnCombo)
self.choice.Bind(wx.EVT_CHOICE, self.OnChoice)
下面的处理函数从标签的列表中显示所选项目。
def OnCombo(self, event):
self.label.SetLabel("selected "+ self.combo.GetValue() +" from Combobox")
def OnChoice(self,event):
self.label.SetLabel("selected "+ self.choice.
GetString( self.choice.GetSelection() ) +" from Choice")
完整的代码列表如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (300,200))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.VERTICAL)
self.label = wx.StaticText(panel,label = "Your choice:" ,style = wx.ALIGN_CENTRE)
box.Add(self.label, 0 , wx.EXPAND |wx.ALIGN_CENTER_HORIZONTAL |wx.ALL, 20)
cblbl = wx.StaticText(panel,label = "Combo box",style = wx.ALIGN_CENTRE)
box.Add(cblbl,0,wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALL,5)
languages = ['C', 'C++', 'Python', 'Java', 'Perl']
self.combo = wx.ComboBox(panel,choices = languages)
box.Add(self.combo,1,wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALL,5)
chlbl = wx.StaticText(panel,label = "Choice control",style = wx.ALIGN_CENTRE)
box.Add(chlbl,0,wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALL,5)
self.choice = wx.Choice(panel,choices = languages)
box.Add(self.choice,1,wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALL,5)
box.AddStretchSpacer()
self.combo.Bind(wx.EVT_COMBOBOX, self.OnCombo)
self.choice.Bind(wx.EVT_CHOICE, self.OnChoice)
panel.SetSizer(box)
self.Centre()
self.Show()
def OnCombo(self, event):
self.label.SetLabel("You selected"+self.combo.GetValue()+" from Combobox")
def OnChoice(self,event):
self.label.SetLabel("You selected "+ self.choice.GetString
(self.choice.GetSelection())+" from Choice")
app = wx.App()
Mywin(None, 'ComboBox & Choice Demo - www.yiibai.com')
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython ComboBox & Choice类
wxPython Guage类 - WxPython教程™
进度条控件在wxPython中被称为测量仪(Gauge)。Wx.Gauge类对象表示垂直或水平条,其中以图形方式显示递增量。它通常用于展示像复制文件或安装软件的处理进程。
Wx.Gauge控件可以在确定的以及不确定模式中使用。当完成任何操作所需的时间可以被相当精确地确定,测量仪进度条显示已完成任务的百分比。然而如果在不确定模式,它只是表示该过程正在进行中。
在确定模式,进度位置会定期更新。在不确定模式,调用 Pulse() 函数将更新进度条。
Wx.Gauge类的构造函数的参数是必需的 -
wx.Gauge(parent, id, range, pos, size, style)
range 参数设置为表上的最大值。在不确定模式,则忽略此参数。
Gauge类可能的style参数 -
S.N. | 参数和说明 |
1 | wx.GA_HORIZONTAL 进度条的横向布局 |
2 | wx.GA_VERTICAL 进度条的垂直布局 |
3 | wx.GA_SMOOTH 平滑的进度条使用一个像素宽度的更新步骤 |
4 | wx.GA_TEXT 显示当前值在百分比形式 |
此类一些的重要的方法列于下表中 −
S.N. | 方法和说明 |
1 | GetRange() 返回gauge的最大值 |
2 | SetRange() 设置gauge的最大值 |
3 | GetValue() 返回当gauge的值 |
4 | SetValue() 以编程方式设置当前值 |
5 | Pulse() 切换gauge到不确定模式 |
实例
在下面的例子中,水平Gauge对象是添加在垂直的盒子大小测定器(sizer)的面板中。
self.gauge = wx.Gauge(pnl, range = 20, size = (250, 25), style = wx.GA_HORIZONTAL)
也有它的点击事件与处理程序功能相关的按钮。
self.btn1 = wx.Button(pnl, label = "Start")
self.Bind(wx.EVT_BUTTON, self.OnStart, self.btn1)
处理函数 OnStart()每一秒后计算更新的进展情况。
def OnStart(self, e):
while True:
time.sleep(1);
self.count = self.count + 1
self.gauge.SetValue(self.count)
if self.count >= 20:
print "end"
return
例子的完整代码如下 -
import wx
import time
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (300,200))
self.InitUI()
def InitUI(self):
self.count = 0
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.gauge = wx.Gauge(pnl, range = 20, size = (250, 25), style = wx.GA_HORIZONTAL)
self.btn1 = wx.Button(pnl, label = "Start")
self.Bind(wx.EVT_BUTTON, self.OnStart, self.btn1)
hbox1.Add(self.gauge, proportion = 1, flag = wx.ALIGN_CENTRE)
hbox2.Add(self.btn1, proportion = 1, flag = wx.RIGHT, border = 10)
vbox.Add((0, 30))
vbox.Add(hbox1, flag = wx.ALIGN_CENTRE)
vbox.Add((0, 20))
vbox.Add(hbox2, proportion = 1, flag = wx.ALIGN_CENTRE)
pnl.SetSizer(vbox)
self.SetSize((300, 200))
self.Centre()
self.Show(True)
def OnStart(self, e):
while True:
time.sleep(1);
self.count = self.count + 1
self.gauge.SetValue(self.count)
if self.count >= 20:
print "end"
return
ex = wx.App()
Mywin(None,'wx.Gauge - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython Guage类
wxPython Slider类 - WxPython教程™
滑块呈现一个槽在一个句柄用户可以移动。这是一个典型的小工具用来控制有界值。 在沟槽的句柄位置相当于控件的上限和下限之间的整数。
wxPython的API包含wx.Slider类。它提供了相同的功能的滚动条。滑块提供了一个方便的方式来处理由滑块指定 wx.EVT_SLIDER 事件绑定拖动句柄。
wx.Slider构造函数的定义采用以下八个参数 -
wx.Slider(parent, id, value, minValue, maxValue, pos, size, style)
滑块的下部和上部的值由minValue(最小值)和包括maxValue参数设置。起始值由 value 参数定义。
许多样式的参数值被定义。以下是其中的一些 −
S.N. | 参数和说明 |
1 | wxSL_HORIZONTAL 水平滑块 |
2 | wxSL_VERTICAL 水直滑块 |
3 | wxSL_AUTOTICKS 在滑块显示tickmarks |
4 | wxSL_LABELS 显示最小值,最大值,和当前值 |
5 | wxSL_MIN_MAX_LABELS 显示最小和最大值 |
6 | wxSL_VALUE_LABEL 只显示当前值 |
wx.Slider类的有用的方法是 −
S.N. | 方法和说明 |
1 | GetMin() 返回滑块的最小值 |
2 | GetMax() 返回滑块的最大值 |
3 | GetValue() 返回滑块的当前值 |
4 | SetMin() 设置滑块的最小值 |
5 | SetMax() 设置滑块的最大值 |
6 | SetRange() 设置滑块的最小和最大值 |
7 | SetValue() 设置当前值 |
8 | SetTick() 在给定的位置显示刻度线 |
9 | SetTickFreq() 设置最小值和最大值之间的刻度间隔 |
当滑块行为类似于滚动条,滚动条事件的绑定器也可以与它一起使用。
S.N. | 事件和说明 |
1 | wx.EVT_SCROLL 处理滚动事件 |
2 | wx.EVT_SLIDER 当滑块位置的变化,或者通过移动句柄或编程 |
实例
在以下的例子中,滑块是用来控制一个标签的大小。首先,滑块对象被放置在一个垂直框大小测定器(sizer)下面,这是一个静态文本。
self.sld = wx.Slider(pnl, value = 10, minValue = 1, maxValue = 100,
style = wx.SL_HORIZONTAL|wx.SL_LABELS)
self.txt = wx.StaticText(pnl, label = 'yiibai.com',style = wx.ALIGN_CENTER)
Wx.EVT_SLIDER绑定器与OnSliderScroll()句柄处理程序相关联。
self.sld.Bind(wx.EVT_SLIDER, self.OnSliderScroll)
该处理程序本身获取滑块的当前值,并用它作为标签的文本字体大小。
def OnSliderScroll(self, e):
obj = e.GetEventObject()
val = obj.GetValue()
font = self.GetFont()
font.SetTutorialsSize(self.sld.GetValue())
self.txt.SetFont(font)
Slider.py 完整的代码如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (400,300))
self.InitUI()
def InitUI(self):
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
self.sld = wx.Slider(pnl, value = 10, minValue = 1, maxValue = 100,
style = wx.SL_HORIZONTAL|wx.SL_LABELS)
vbox.Add(self.sld,1,flag = wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, border = 20)
self.sld.Bind(wx.EVT_SLIDER, self.OnSliderScroll)
self.txt = wx.StaticText(pnl, label = 'Yiibai.com',style = wx.ALIGN_CENTER)
vbox.Add(self.txt,1,wx.ALIGN_CENTRE_HORIZONTAL)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnSliderScroll(self, e):
obj = e.GetEventObject()
val = obj.GetValue()
font = self.GetFont()
font.SetTutorialsSize(self.sld.GetValue())
self.txt.SetFont(font)
ex = wx.App()
Mywin(None,'Slider Demo - www.yiibai.com')
ex.MainLoop()
运行代码,并尝试拖动滑块句柄,看看标签的字体大小变化。上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython Slider类
Menu Item, Menu & MenuBar类 - WxPython教程™
正下方顶层窗口的标题栏中保留了一个水平条,以显示一系列菜单。 这就是 wx.MenuBar 类在 wxPython 中 API 的对象。
wx.Menu类的一个对象被添加到菜单栏。它也用于创建上下文菜单和弹出菜单。每个菜单可以包含一个或多个wx.MenuItem对象或级联Menu对象。
wx.MenuBar类有一个参数的构造函数,此外还有一个默认的。
wx.MenuBar()
wx.MenuBar(n, menus, titles, style)
参数“n”表示的菜单的数目。Menu是菜单和标题的数组和字符串数组。如果style参数设置为wx.MB_DOCKABLE,菜单栏可以停靠。
以下是wx.MenuBar类的方法列表 -
S.N. | 方法和说明 |
1 | Append() 添加菜单对象到工具栏 |
2 | Check() 选中或取消选中菜单 |
3 | Enable() 启用或禁用菜单 |
4 | Remove() 去除工具栏中的菜单 |
wx.Menu类对象是一个或多个菜单项,其中一个可被用户选择的下拉列表。
下表显示了wx.Menu类经常需要的方法-
S.N. | 方法和说明 |
1 | Append() 在菜单增加了一个菜单项 |
2 | AppendMenu() 追加一个子菜单 |
3 | AppendRadioItem() 追加可选当选项 |
4 | AppendCheckItem() 追加一个可检查的菜单项 |
5 | AppendSeparator() 添加一个分隔线 |
6 | Insert() 在给定的位置插入一个新的菜单 |
7 | InsertRadioItem() 在给定位置插入单选项 |
8 | InsertCheckItem() 在给定位置插入新的检查项 |
9 | InsertSeparator() 插入分隔行 |
10 | Remove() 从菜单中删除一个项 |
11 | GetMenuItems() 返回菜单项列表 |
一个菜单项目,可直接使用 Append() 函数添加,或 wx.MenuItem 类的一个对象被追加。
wx.Menu.Append(id, text, kind)
Item = Wx.MenuItem(parentmenu, id, text, kind)
wx.Menu.Append(Item)
要定义一个菜单项,菜单要被添加必须提及。
wxPython中有大量的标准的ID被分配给标准菜单项。在某些操作系统平台上,它们与标准图标也关联。
wx.ID_SEPARATOR |
wx.ID_ANY |
wx.ID_OPEN |
wx.ID_CLOSE |
wx.ID_NEW |
wx.ID_SAVE |
wx.ID_SAVEAS |
wx.ID_EDIT |
wx.ID_CUT |
wx.ID_COPY |
wx.ID_PASTE |
然而,任何独一无二的整数可以被分配 ID。text参数是它的标题。类参数采用以下之一-
S.N. | 参数 & 描述 |
1 | wx.ITEM_NORMAL 普通菜单项 |
2 | wx.ITEM_CHECK 检查(或切换)菜单项 |
3 | wx.ITEM_RADIO 单选菜单项 |
wx.Menu类也有 AppendRadioItem()和 AppendCheckItem()不需要各种参数。
菜单项可以设置为显示图标或快捷方式。 wx.MenuItem类SetBitmap()函数需要要显示的位图对象。
wx.MenuItem.SetBitmap(wx.Bitmap(image file))
EVT_MENU事件绑定有助于处理菜单选择。
self.Bind(wx.EVT_MENU, self.menuhandler)
实例
下面的例子演示了wxPython的上述大部分的菜单系统的特征。它显示在菜单栏中显示一个文件菜单。普通菜单项,子菜单,单选项和检查项加入。菜单项也带有一个图标显示。
事件处理函数,当被调用时检索与事件关联的ID,并且可以进一步处理。例如,如果“新建”菜单项被选中,这是回显示在框架(frame)上的文本框中。
Menu.py 完整的代码如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (400,300))
self.InitUI()
def InitUI(self):
menubar = wx.MenuBar()
fileMenu = wx.Menu()
newitem = wx.MenuItem(fileMenu,wx.ID_NEW, text = "New",kind = wx.ITEM_NORMAL)
newitem.SetBitmap(wx.Bitmap("new.bmp"))
fileMenu.AppendItem(newitem)
fileMenu.AppendSeparator()
editMenu = wx.Menu()
copyItem = wx.MenuItem(editMenu, 100,text = "copy",kind = wx.ITEM_NORMAL)
copyItem.SetBitmap(wx.Bitmap("copy.bmp"))
editMenu.AppendItem(copyItem)
cutItem = wx.MenuItem(editMenu, 101,text = "cut",kind = wx.ITEM_NORMAL)
cutItem.SetBitmap(wx.Bitmap("cut.bmp"))
editMenu.AppendItem(cutItem)
pasteItem = wx.MenuItem(editMenu, 102,text = "paste",kind = wx.ITEM_NORMAL)
pasteItem.SetBitmap(wx.Bitmap("paste.bmp"))
editMenu.AppendItem(pasteItem)
fileMenu.AppendMenu(wx.ID_ANY, "Edit", editMenu)
fileMenu.AppendSeparator()
radio1 = wx.MenuItem(fileMenu, 200,text = "Radio1",kind = wx.ITEM_RADIO)
radio2 = wx.MenuItem(fileMenu, 300,text = "radio2",kind = wx.ITEM_RADIO)
fileMenu.AppendItem(radio1)
fileMenu.AppendItem(radio2)
fileMenu.AppendSeparator()
fileMenu.AppendCheckItem(103,"Checkable")
quit = wx.MenuItem(fileMenu, wx.ID_EXIT, '&Quit\tCtrl+Q')
fileMenu.AppendItem(quit)
menubar.Append(fileMenu, '&File')
self.SetMenuBar(menubar)
self.text = wx.TextCtrl(self,-1, style = wx.EXPAND|wx.TE_MULTILINE)
self.Bind(wx.EVT_MENU, self.menuhandler)
self.SetSize((350, 250))
self.Centre()
self.Show(True)
def menuhandler(self, event):
id = event.GetId()
if id == wx.ID_NEW:
self.text.AppendText("new"+"\n")
ex = wx.App()
Mywin(None,'MenuBar Demo - yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Menu Item, Menu & MenuBar类
wxPython ToolBar类 - WxPython教程™
工具栏包括文本文字说明或图标按钮的一个或多个水平条,通常被放置在MenuBar顶层帧的正下方。
如果wx.Toolbar对象的style参数设置为wx.TB_DOCKABLE,它成为可停靠。浮动工具栏还可以用wxPython中的AUIToolBar类来构造。
构造函数不带任何参数则使用工具栏默认参数。附加参数可以传递给wx.ToolBar类构造如下 -
Wx.ToolBar(parent, id, pos, size, style)
对于wx.ToolBar定义的样式参数包括常数 -
S.N. | 参数和说明 |
1 | wx.TB_FLAT 提供该工具栏平面效果 |
2 | wx.TB_HORIZONTAL 指定水平布局(默认) |
3 | wxTB_VERTICAL 指定垂直布局 |
4 | wx.TB_DEFAULT_STYLE 结合wxTB_FLAT和wxTB_HORIZONTAL |
5 | wx.TB_DOCKABLE 使工具栏浮动和可停靠 |
6 | wx.TB_NO_TOOLTIPS 当鼠标悬停在工具栏不显示简短帮助工具提示, |
7 | wx.TB_NOICONS 指定工具栏按钮没有图标;默认它们是显示的 |
8 | wx.TB_TEXT 显示在工具栏按钮上的文本;默认情况下,只有图标显示 |
不同特征的工具按钮可以添加到工具栏。 Wx.ToolBar类具有以下有用的方法 -
S.N. | 方法和说明 |
1 | AddTool() 添加工具按钮到工具栏。工具的类型是由各种参数指定的 |
2 | AddRadioTool() 添加属于按钮的互斥组按钮 |
3 | AddCheckTool() 添加一个切换按钮到工具栏 |
4 | AddLabelTool() 使用图标和标签来添加工具栏 |
5 | AddSeparator() 添加一个分隔符来表示工具按钮组 |
6 | AddControl() 添加任何控制工具栏。 例如,wx.Button,wx.Combobox等。 |
7 | ClearTools() 删除所有在工具栏的按钮 |
8 | RemoveTool() 从给出工具按钮移除工具栏 |
9 | Realize() 工具按钮增加调用 |
AddTool()方法至少需要三个参数 -
AddTool(parent, id, bitmap)
父参数是在按钮被添加到工具栏。通过位图bitmap参数所指定图像图标。
工具按钮发出EVT_TOOL事件。如果添加到工具栏其他控制必须由各自CommandEvent绑定器到事件处理程序约束。
实例
在下面的例子中,工具栏上显示两个正常的工具按钮,三个单选工具按钮和一个组合框。
首先,工具栏对象被激活。
tb = wx.ToolBar( self, -1 )
self.ToolBar = tb
使用AddTool()方法,两个工具的图标为“新建”,“保存”被添加。
tb.AddTool( 101, wx.Bitmap("new.png") )
tb.AddTool(102,wx.Bitmap("save.png"))
一组RadioTools,然后添加到工具栏,其中只有一个是可选择在同一时间。
right = tb.AddRadioTool(222,wx.Bitmap("right.png"))
center = tb.AddRadioTool(333,wx.Bitmap("center.png"))
justify = tb.AddRadioTool(444,wx.Bitmap("justify.png"))
使用wx.ComboBox控件的AddControl()方法添加到工具栏。组合框列表中包含的字体的名称。
self.combo = wx.ComboBox(tb, 555, value = "Times", choices = ["Arial","Times","Courier"])
Realize() 方法需要被调用,以最终确定工具栏创建。
tb.Realize()
最后,事件绑定器工具栏和组合框被注册。
tb.Bind(wx.EVT_TOOL, self.Onright)
tb.Bind(wx.EVT_COMBOBOX,self.OnCombo)
相应的事件处理程序以追加方式处理该事件源。虽然EVT_TOOL事件的ID会显示在工具栏下方的文本框中,选中的字体名称添加到它的时候,EVT_COMBOBOX事件触发。
def Onright(self, event):
self.text.AppendText(str(event.GetId())+"\n")
def OnCombo(self,event):
self.text.AppendText( self.combo.GetValue()+"\n")
整个代码如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title)
self.InitUI()
def InitUI(self):
menubar = wx.MenuBar()
menu = wx.Menu()
menubar.Append(menu,"File")
self.SetMenuBar(menubar)
tb = wx.ToolBar( self, -1 )
self.ToolBar = tb
tb.AddTool( 101, wx.Bitmap("new.png") )
tb.AddTool(102,wx.Bitmap("save.png"))
right = tb.AddRadioTool(222,wx.Bitmap("right.png"))
center = tb.AddRadioTool(333,wx.Bitmap("center.png"))
justify = tb.AddRadioTool(444,wx.Bitmap("justify.png"))
tb.Bind(wx.EVT_TOOL, self.Onright)
tb.Bind(wx.EVT_COMBOBOX,self.OnCombo)
self.combo = wx.ComboBox( tb, 555, value = "Times", choices = ["Arial","Times","Courier"])
tb.AddControl(self.combo )
tb.Realize()
self.SetSize((350, 250))
self.text = wx.TextCtrl(self,-1, style = wx.EXPAND|wx.TE_MULTILINE)
self.Centre()
self.Show(True)
def Onright(self, event):
self.text.AppendText(str(event.GetId())+"\n")
def OnCombo(self,event):
self.text.AppendText( self.combo.GetValue()+"\n")
ex = wx.App()
Mywin(None,'ToolBar Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython ToolBar类
wxPython Dialog类 - WxPython教程™
虽然Dialog类对象将显示像Frame,它通常被用作上的父框架的顶部上的弹出窗口。Dialog的目的是从用户收集一些数据并将其发送到父frame。对话框 Dialog 可以模态(它阻止父帧)或无模式(对话框架可被绕过)。 ShowModal()方法显示模态方式对话框frame,Show() 使得它无模式。
wxPython中有一些预配置对话框控件,如:MessageDialog,FileDialog,FontDialog类等。
wx.Dialog支持使用Sizers 仅仅作为一个wx.Frame对象。因此,定制的Dialog可设计。
wx.Dialog类的构造函数如下常用的参数 -
wx.Dialog(parent, id, title, pos, size, style)
Dialog控件的默认外观显示在标题栏中只关闭对话框。但是,它可以用下面的风格参数的组合进行定制−
S.N. | 参数 & 描述 |
1 | wx.CAPTION 对话框的文字说明 |
2 | wx.DEFAULT_DIALOG_STYLE 相当于wxCAPTION,wxCLOSE_BOX和wxSYSTEM_MENU的组合 |
3 | wx.RESIZE_BORDER 显示可调框架窗口的大小 |
4 | wxSYSTEM_MENU 显示系统菜单 |
5 | wx.CLOSE_BOX 框架(frame)上显示一个关闭 |
6 | wx.MAXIMIZE_BOX 在对话框中显示一个最大化框 |
7 | wx.MINIMIZE_BOX 在对话框中显示一个最小化框(frame) |
8 | wx.STAY_ON_TOP 确保对话框停留在所有其他窗口的顶部 |
9 | wx.DIALOG_NO_PARENT 为防止产生无看管对话框。不推荐用于模态对话框 |
两个事件由绑定器定义该类-
S.N. | 事件和说明 |
1 | EVT_CLOSE 当用户或编程对话框的关闭 |
2 | EVT_INIT_DIALOG When the dialog is being initialized |
如上所述,对话的目的是收集数据并返回到父窗口。然而,一些有用的方法可用于 Dialog类。
S.N. | 方法和说明 |
1 | DoOK() 当对话框中的OK按钮被按下时调用 |
2 | ShowModal() 显示了在应用程序模态方式的对话框 |
3 | ShowWindowModal() 对话框只顶层父窗口的模式 |
4 | EndModal() ShowModal调用传递值结束一个对话框模式 |
一个预配置的对话框是MessageDialog。它用于显示的一条或多条线用具有标准ID的按钮的消息。 下面是对MessageDialog标准按钮选择列表。
S.N. | 按钮和说明 |
1 | wx.OK 显示OK按钮 |
2 | wx.CANCEL 显示取消(Cancel)按钮 |
3 | wx.YES_NO 显示“是”,“否”按钮 |
4 | wx.YES_DEFAULT 使Yes按钮为默认 |
5 | wx.NO_DEFAULT 使No按钮为默认 |
6 | wx.ICON_EXCLAMATION 显示警告图标 |
7 | wx.ICON_ERROR 显示错误图标 |
8 | wx.ICON_HAND 同wx.ICON_ERROR |
9 | wx.ICON_INFORMATION 显示一个信息图标 |
10 | wx.ICON_QUESTION 显示一个问题图标 |
MessageDialog
此声明使用下面的构造 -
wx.MessageDialog(parent, message, caption, style, pos)
一个或多个消息参数要显示文本的行,文字说明显示在标题栏。默认style参数是wx.OK| wx.ECNRE。 其他样式style参数允许消息框进行定制。
wx.MessageBox是一个方便的功能,使用MessageDialog构建代替消息框。
实例
下面给出的是对话的模式和无模式的行为简单的演示。父窗口是wx.Frame对象带有两个按钮。Click事件的第一个按钮将显示在模态的方式的对话框。因此,防止父窗口上的任何操作,直到对话框关闭。第二个按钮,将显示一个无模式对话框,这并不妨碍访问父窗口。第三个按钮会显示一个消息框。
整个代码如下 -
import wx
class MyDialog(wx.Dialog):
def __init__(self, parent, title):
super(MyDialog, self).__init__(parent, title = title, size = (250,150))
panel = wx.Panel(self)
self.btn = wx.Button(panel, wx.ID_OK, label = "ok", size = (50,20), pos = (75,50))
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (250,150))
self.InitUI()
def InitUI(self):
panel = wx.Panel(self)
btn = wx.Button(panel, label = "Modal Dialog", pos = (75,10))
btn1 = wx.Button(panel, label = "Modeless Dialog", pos = (75,40))
btn2 = wx.Button(panel, label = "MessageBox", pos = (75,70))
btn.Bind(wx.EVT_BUTTON, self.OnModal)
a = btn1.Bind(wx.EVT_BUTTON, self.OnModeless)
print a
btn2.Bind(wx.EVT_BUTTON, self.Onmsgbox)
self.Centre()
self.Show(True)
def OnModal(self, event):
a = MyDialog(self, "Dialog").ShowModal()
print a
def OnModeless(self, event):
a = MyDialog(self, "Dialog").Show()
def Onmsgbox(self, event):
wx.MessageBox("This is a Message Box", "Message" ,wx.OK | wx.ICON_INFORMATION)
ex = wx.App()
Mywin(None,'Dialog Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
wx.TextEntryDialog
这个类的对象显示一个文本字段,可定制的标签,提示用户输入以及两个按钮使用预定义样式的对话框。
虽然这个对话框要求一行输入,文本框可以通过使用TextCtrl风格,如密码和多进行定制。
文本字段收集内容,当用户点击OK按钮返回相应值。TextEntryDialog构造如下 -
wx.TextEntryDialog(parent, id, message, caption, value, style, pos)
在对话窗口传递的消息参数要显示的文字。caption 参数是要显示在标题栏的字符串。在文本框中默认字符串值value参数。TextCtrl在对话框可以设置显示密码字符(wx.TE_PASSWORD)和/或多行(wx.TE_MULTILINE)。
TextEntry 类的其他方法如下列表中 -
S.N. | 方法和说明 |
1 | SetMaxLength() 设置用户可以输入到文本框最大字符数 |
2 | SetValue() 设置文本框的值编程 |
3 | GetValue() 返回该文本框的内容 |
4 | ShowModal() 显示对话框模态。返回 wx.ID_OK 如果用户确认输入,以及 wx.ID_CANCEL 如果对话框被拒绝 |
实例
在下面的例子中顶层帧示出了按钮和一个只读 TextCtrl 插件。
self.text = wx.TextCtrl(pnl, size = (250, 25),style = wx.TE_READONLY)
self.btn1 = wx.Button(pnl, label = "Enter Text")
响应按钮点击并调用 OnClick()函数。
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
OnClick()函数显示一个 TextEntryDialog。
dlg = wx.TextEntryDialog(self, 'Enter Your Name','Text Entry Dialog')
对话框的返回值是 getValue()函数的值,并在顶层框架的TextCtrl对象中显示。
if dlg.ShowModal() == wx.ID_OK:
self.text.SetValue("Name entered:"+dlg.GetValue())
完整的代码如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (300,200))
self.InitUI()
def InitUI(self):
self.count = 0
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(pnl, size = (250, 25),style = wx.TE_READONLY)
self.btn1 = wx.Button(pnl, label = "Enter Text")
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE)
hbox2.Add(self.btn1, proportion = 1, flag = wx.RIGHT, border = 10)
vbox.Add((0, 30))
vbox.Add(hbox1, flag = wx.ALIGN_CENTRE)
vbox.Add((0, 20))
vbox.Add(hbox2, proportion = 1, flag = wx.ALIGN_CENTRE)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnClick(self, e):
dlg = wx.TextEntryDialog(self, 'Enter Your Name','Text Entry Dialog')
if dlg.ShowModal() == wx.ID_OK:
self.text.SetValue("Name entered:"+dlg.GetValue())
dlg.Destroy()
ex = wx.App()
Mywin(None,'TextEntry Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
wx.FileDialog类
此类表示一个文件选择对话框。它使用户可以浏览文件系统并选择要打开文件或保存。对话框的外观是由操作系统特定的。
文件滤波器也可以应用到只显示指定扩展名的文件。启动目录和默认的文件名也可以设置。
FileDialog的构造函数的原型是这样的 -
wx.FileDialog(parent, message, DefaultDir, DefaultFile, wildcard, style, pos, size)
该消息表示将要显示的文本。 DefaultDir是初始目录。一个或多个类型的文件可以被设置为通过通配符参数所表示的文件的过滤器。
FileDialog定义风格参数 -
S.N. | 参数和说明 |
1 | wx.FD_DEFAULT_STYLE 相当于wxFD_OPEN |
2 | wx.FD_OPEN 这是一个打开的对话框;该对话框的默认按钮的标签是“打开” |
3 | wx.FD_SAVE 这是一个保存对话框;该对话框的默认按钮的标签是“保存” |
4 | wx.FD_OVERWRITE_PROMPT 对于只保存对话框:提示进行确认,如果一个文件将被覆盖 |
5 | wx.FD_MULTIPLE 仅适用于打开的对话框:允许选择多个文件 |
6 | wx.FD_CHANGE_DIR 更改当前工作目录到用户选择的文件是目录 |
wx.FileDialog类的成员函数 -
S.N. | 函数与说明 |
1 | GetDirectory() 返回默认目录 |
2 | GetFileName() 返回默认文件名 |
3 | GetPath() 返回选定文件的完整路径 |
4 | SetDirectory() 设置默认目录 |
5 | SetFilename() 设置默认文件 |
6 | SetPath() 设置文件路径 |
7 | ShowModal() 显示对话框,如果用户单击OK按钮返回wx.ID_OK,否则 wx.ID_CANCEL |
实例
在下面的例子中,顶层帧显示按钮和一个多行TextCtrl。
self.text = wx.TextCtrl(pnl, size = (-1,200), style = wx.TE_MULTILINE)
self.btn1 = wx.Button(pnl, label = "Open a File")
EVT_BUTTON事件绑定注册 OnClick()函数到按钮。
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
OnClick()函数显示一个FileDialog的打开模式。其选择返回为dlg。通过GetPath()函数获得的选定文件和它的内容显示在父窗口的TextCtrl框。
def OnClick(self, e):
wildcard = "Text Files (*.txt)|*.txt"
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", wildcard, wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
f = open(dlg.GetPath(), 'r')
with f:
data = f.read()
self.text.SetValue(data)
完整的代码如下 -
import wx
import os
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title)
self.InitUI()
def InitUI(self):
self.count = 0
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(pnl, size = (-1,200),style = wx.TE_MULTILINE)
self.btn1 = wx.Button(pnl, label = "Open a File")
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE)
hbox2.Add(self.btn1, proportion = 1, flag = wx.RIGHT, border = 10)
vbox.Add(hbox2, proportion = 1, flag = wx.ALIGN_CENTRE)
vbox.Add(hbox1, proportion = 1, flag = wx.EXPAND|wx.ALIGN_CENTRE)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnClick(self, e):
wildcard = "Text Files (*.txt)|*.txt"
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", wildcard, wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
f = open(dlg.GetPath(), 'r')
with f:
data = f.read()
self.text.SetValue(data)
dlg.Destroy()
ex = wx.App()
Mywin(None, 'FileDialog Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
wx.FontDialog 类
这个类的对象是一个字体选择对话框。这个对话框的外观也为操作系统特有的。属性,例如名称,大小,权重等。所选字体的形式返回作为此对话框的返回值。
需要这种类构造Fontdata参数用于初始化这些属性。
wx.FontDialog(parent, data)
此类的GetFontData()方法包含所选字体的参数。
下面的代码展示了如何使用FontDialog类的有一个按钮和一个标签(静态文本对象)。
self.text = wx.StaticText(pnl, label = "hello")
self.btn1 = wx.Button(pnl, label = "Choose Font")
单击时按钮触发 OnClick()函数处理事件。
def OnClick(self, e):
dlg = wx.FontDialog(self,wx.FontData())
if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetFontData()
font = data.GetChosenFont()
self.text.SetFont(font)
dlg.Destroy()
选择字体,然后应用到标签的文本。
FileDialog-2.py 完整的代码如下 -
import wx
import os
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (400, 300))
self.InitUI()
def InitUI(self):
self.count = 0
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.StaticText(pnl, label = "hello")
self.btn1 = wx.Button(pnl, label = "Choose Font")
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE)
hbox2.Add(self.btn1, proportion = 1, flag = wx.ALIGN_CENTRE, border = 10)
vbox.Add(hbox2, flag = wx.ALIGN_CENTRE)
vbox.Add(hbox1, proportion = 1, flag = wx.ALIGN_CENTRE)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnClick(self, e):
dlg = wx.FontDialog(self,wx.FontData())
if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetFontData()
font = data.GetChosenFont()
self.text.SetFont(font)
dlg.Destroy()
ex = wx.App()
Mywin(None,'FileDialog Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython Dialog类
wxPython SplitterWindow类 - WxPython教程™
这个类的对象是一个布局管理器,它拥有两个子窗口的大小可以通过拖动它们之间的界限来动态变化。Splitter控件给出了句柄来拖动调整控件。
wx.SplitterWindow类有一个非常基本的构造-所有参数使用缺省值。
wx.SplitterWindow(self, id, pos, size, style)
预定义值的样式参数列表如下 -
S.N. | 参数和说明 |
1 | wxSP_3D 绘制3D效果边框和窗扇(sash) |
2 | wxSP_THIN_SASH 绘制一个薄sash |
3 | wxSP_3DSASH 绘制3D效果sash (默认样式的一部分) |
4 | wxSP_BORDER 绘制标准边框 |
5 | wxSP_NOBORDER 无边框(默认) |
6 | wxSP_PERMIT_UNSPLIT 总是允许取消分割,即使采用最小的窗格大小不为零 |
SplitterWindow类的事件绑定器 -
S.N. | 事件和说明 |
1 | EVT_SPLITTER_SASH_POS_CHANGING() sash 的位置在被改变的过程 |
2 | EVT_SPLITTER_SASH_POS_CHANGED() 窗框位置被改变 |
3 | EVT_SPLITTER_UNSPLIT() 分割器一直只是取消分割 |
4 | EVT_SPLITTER_DCLICK() 窗框被双点击。默认行为是在取消分割窗口出现这种情况时 |
下面的代码演示 SplitterWindow 功能。分离器对象添加到顶层帧。
splitter = wx.SplitterWindow(self, -1)
面板被设计来持有多行TextCtrl对象。
b = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(panel1,style = wx.TE_MULTILINE)
b.Add(self.text, 1, wx.EXPAND)
panel1.SetSizerAndFit(b)
一个列表框对象放在另一个面板。
panel2 = wx.Panel(splitter, -1)
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET', 'C#']
lst = wx.ListBox(panel2, size = (100,300), choices = languages, style = wx.LB_SINGLE)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox1.Add(lst,1)
panel2.SetSizer(hbox1)
分割器(Splitter)对象被垂直分割和两个面板并添加到2子窗口。子窗口的宽度可以使用窗扇调整。
splitter.SplitVertically(panel2, panel1)
Splitter.py 完整代码如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (350,300))
splitter = wx.SplitterWindow(self, -1)
panel1 = wx.Panel(splitter, -1)
b = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(panel1,style = wx.TE_MULTILINE)
b.Add(self.text, 1, wx.EXPAND)
panel1.SetSizerAndFit(b)
panel2 = wx.Panel(splitter, -1)
languages = ['C', 'C++', 'Java', 'Python', 'Perl',
'JavaScript', 'PHP' ,'VB.NET' ,'C#']
lst = wx.ListBox(panel2, size = (100,300), choices = languages, style = wx.LB_SINGLE)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox1.Add(lst,1)
panel2.SetSizer(hbox1)
splitter.SplitVertically(panel2, panel1)
self.Centre()
self.Bind(wx.EVT_LISTBOX, self.onListBox, lst)
self.Show(True)
def onListBox(self, event):
self.text.AppendText( "Current selection: " +
event.GetEventObject().GetStringSelection() +"\n")
ex = wx.App()
Mywin(None,'Splitter Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython SplitterWindow类
wxPython SplitterWindow类 - WxPython教程™
这个类的对象是一个布局管理器,它拥有两个子窗口的大小可以通过拖动它们之间的界限来动态变化。Splitter控件给出了句柄来拖动调整控件。
wx.SplitterWindow类有一个非常基本的构造-所有参数使用缺省值。
wx.SplitterWindow(self, id, pos, size, style)
预定义值的样式参数列表如下 -
S.N. | 参数和说明 |
1 | wxSP_3D 绘制3D效果边框和窗扇(sash) |
2 | wxSP_THIN_SASH 绘制一个薄sash |
3 | wxSP_3DSASH 绘制3D效果sash (默认样式的一部分) |
4 | wxSP_BORDER 绘制标准边框 |
5 | wxSP_NOBORDER 无边框(默认) |
6 | wxSP_PERMIT_UNSPLIT 总是允许取消分割,即使采用最小的窗格大小不为零 |
SplitterWindow类的事件绑定器 -
S.N. | 事件和说明 |
1 | EVT_SPLITTER_SASH_POS_CHANGING() sash 的位置在被改变的过程 |
2 | EVT_SPLITTER_SASH_POS_CHANGED() 窗框位置被改变 |
3 | EVT_SPLITTER_UNSPLIT() 分割器一直只是取消分割 |
4 | EVT_SPLITTER_DCLICK() 窗框被双点击。默认行为是在取消分割窗口出现这种情况时 |
下面的代码演示 SplitterWindow 功能。分离器对象添加到顶层帧。
splitter = wx.SplitterWindow(self, -1)
面板被设计来持有多行TextCtrl对象。
b = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(panel1,style = wx.TE_MULTILINE)
b.Add(self.text, 1, wx.EXPAND)
panel1.SetSizerAndFit(b)
一个列表框对象放在另一个面板。
panel2 = wx.Panel(splitter, -1)
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET', 'C#']
lst = wx.ListBox(panel2, size = (100,300), choices = languages, style = wx.LB_SINGLE)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox1.Add(lst,1)
panel2.SetSizer(hbox1)
分割器(Splitter)对象被垂直分割和两个面板并添加到2子窗口。子窗口的宽度可以使用窗扇调整。
splitter.SplitVertically(panel2, panel1)
Splitter.py 完整代码如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (350,300))
splitter = wx.SplitterWindow(self, -1)
panel1 = wx.Panel(splitter, -1)
b = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(panel1,style = wx.TE_MULTILINE)
b.Add(self.text, 1, wx.EXPAND)
panel1.SetSizerAndFit(b)
panel2 = wx.Panel(splitter, -1)
languages = ['C', 'C++', 'Java', 'Python', 'Perl',
'JavaScript', 'PHP' ,'VB.NET' ,'C#']
lst = wx.ListBox(panel2, size = (100,300), choices = languages, style = wx.LB_SINGLE)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox1.Add(lst,1)
panel2.SetSizer(hbox1)
splitter.SplitVertically(panel2, panel1)
self.Centre()
self.Bind(wx.EVT_LISTBOX, self.onListBox, lst)
self.Show(True)
def onListBox(self, event):
self.text.AppendText( "Current selection: " +
event.GetEventObject().GetStringSelection() +"\n")
ex = wx.App()
Mywin(None,'Splitter Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython SplitterWindow类
wxPython HTMLWindow类 - WxPython教程™
wxHTML库中包含用于解析和显示HTML内容。这不是一个全功能的浏览器,wx.HtmlWindow对象是一个通用的HTML浏览器。
HtmlWindow类的构造函数需要一个熟悉的外观 -
(Parent, id, pos, size, style)
此类支持以下样式 -
S.N. | 样式和说明 |
1 | wxHW_SCROLLBAR_NEVER 永远不显示滚动条,即使是页面比窗口大 |
2 | wxHW_SCROLLBAR_AUTO 只有在页面大小超过窗口大小显示滚动条 |
3 | wxHW_NO_SELECTION 不要让用户选择文本 |
以下事件绑定器可用于这一个类 -
S.N. | 事件和说明 |
1 | EVT_HTML_CELL_CLICKED 一个wxHtmlCell被点击 |
2 | EVT_HTML_CELL_HOVER 鼠标经过wxHtmlCell |
3 | EVT_HTML_LINK_CLICKED wxHtmlCell其中包含一个超链接被点击 |
这个类经常使用的成员函数如下 -
S.N. | 函数与说明 |
1 | AppendToPage() HTML追加到当前显示的文字片段,并刷新窗口 |
2 | HistoryBack() 又回到了以前访问过的网页 |
3 | HistoryForward() 转到历史的下一页 |
4 | LoadPage() 加载一个HTML文件 |
5 | OnLinkClicked() 超链接被点击时调用 |
6 | SetPage() 设置标记HTML的标签,文字作为页面内容 |
下面的代码显示一个简单的HTML浏览器。上运行的代码,一个TextEntry对话框弹出要求输入URL。wx.HtmlWindow类的LoadPage()方法显示内容在窗口中。
import wx
import wx.htmll
class MyHtmlFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, -1, title, size = (600,400))
html = wx.htmll.HtmlWindow(self)
if "gtk2" in wx.PlatformInfo:
html.SetStandardFonts()
dlg = wx.TextEntryDialog(self, 'Enter a URL', 'HTMLWindow')
if dlg.ShowModal() == wx.ID_OK:
html.LoadPage(dlg.GetValue())
app = wx.App()
frm = MyHtmlFrame(None, "Simple HTML Browser")
frm.Show()
app.MainLoop()
执行上面的代码,产生以下结果:
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython HTMLWindow类
wxPython Major类 - WxPython教程™
原始的 wxWidgets(用C++编写)是一个巨大的类库。GUI类从这个库使用wxPython模块被移植到Python,它尽可能接近反映原始wxWidgets库。所以,在wxPython中wx.Frame类作用非常类似在其C++版本wxFrame类。
wxObject是大部分类基础。wxApp(wx.App在wxPython中)对象表示应用程序本身。产生GUI后,应用程序进入由MainLoop()方法的事件循环。下图说明包括在wxPython中最常用的GUI类的类层次结构。
S.N. | 类 & 说明 |
1 | wx.Frame类是不带参数的默认构造函数。 |
2 | wx.Panel类通常是一个放入wxFrame中的对象。 这个类也继承自wxWindow类。 |
3 | wx.StaticText类对象提供了一个控制持有比如只读文本。它可以被称作被动控制,因为它不产生任何事件。 |
4 | 在wxPython中,wx.TextCtrl类对象用于于此目的。它控制在其中可以显示文本和编辑。 |
5 | 每个按钮,wx.RadioButton类的一个对象携带旁边有一个圆形按钮文本标签。wxPython的API还包括wx.RadioBox类。它的对象提供了一个边框和标签组。 |
6 | 一个复选框显示一个小标记的矩形框。单击时,复选标记出现在矩形内,指示作出选择。 |
7 | 一个wx.ComboBox对象提供选择项目列表。它可以配置为一个下拉列表或永久性的显示。wxPython的API包含一个wx.Choice类,其目的也是一个下拉列表中,这是永久只读。 |
8 | Wx.Gauge类对象表示垂直或水平条,其中以图形方式显示递增量。 |
9 | wxPython的API包含wx.Slider类。它提供了滚动条相同的功能。滑动器提供了一个方便的方式来处理由滑块具体wx.EVT_SLIDER事件绑定拖动句柄。 |
10 | 略低于顶层窗口的标题栏中的横条保留,以显示一系列菜单。这是wx.MenuBar类在wxPython API的对象。 |
11 | 如果wx.Toolbar对象的样式参数设置为wx.TB_DOCKABLE,它成为可停靠。浮动工具栏还可以用wxPython中的AUIToolBar类构造。 |
12 | 虽然一个对话框Dialog类对象出现像Frame,它通常被用作上的父框架的顶部上的弹出窗口。一个对话框(Dialog)的目的是从用户收集一些数据并将其发送到父帧(frame)。 |
13 | wx.Notebook小部件提供了一个标签式的控制。在一个帧(Frame)中的一个笔记本对象具有一个或多个切换标签(称为页),其中每一个具有一个面板显示出的控制布局。 |
14 | 这个类的对象是一个布局管理器,它拥有两个子窗口,大小可以通过拖动它们之间的边界动态变化。分离器控制给出了可拖动来调整控件的句柄。 |
15 | wxHTML库中包含用于解析和显示HTML内容。 虽然这不打算成为一个全功能的浏览器,wx.HtmlWindow对象是一个通用的HTML浏览器。 |
16 | 一个wx.ListBox控件呈现字符串的垂直滚动列表。 默认情况下,在列表中的单个产品选择。ListCtrl控件是一个高度增强列表显示和选择工具。多个列的列表可以显示在报表视图,列表视图或图标视图。 |
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython Major类
wxPython事件处理 - WxPython教程™
不像控制台模式应用程序,一个基于GUI的应用程序是事件驱动的,这是在一个顺序的方式执行的。 函数或方法响应于像点击按钮,从集合或鼠标点击等,调用事件选择项目处理函数,用户的操作被执行。
有关某个事件其中应用程序的运行时期间发生的数据被存储为来自wx.Event衍生的子类的对象。一种显示控件(例如按钮)是一种特定类型的事件的源,并且产生与其关联事件类的一个对象。例如,点击一个按钮发出 wx.CommandEvent 事件。该事件数据被分派到程序事件处理的方法。wxPython中有许多预定义的事件绑定器。一个事件绑定封装了具体的小部件(控件),其关联的事件类型和事件处理方法之间的关系。
例如,要调用一个按钮的点击事件的程序上的 OnClick()方法,下面的语句是必需的-
self.b1.Bind(EVT_BUTTON, OnClick)
bind()方法是通过从wx.EvtHandler类的所有显示对象继承。EVT_.BUTTON这里是绑定器,其中关联按钮单击事件的 OnClick()方法。
实例
在下面的例子中,MoveEvent事件是由于拖动顶层窗口 – 在这种情况下,一个wx.Frame对象使用wx.EVT_MOVE绑定器连接到OnMove()方法。代码显示一个窗口。如果使用鼠标移动,其瞬时坐标显示在控制台上。
import wx
class Example(wx.Frame):
def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_MOVE, self.OnMove)
self.SetSize((250, 180))
self.SetTitle('Move event')
self.Centre()
self.Show(True)
def OnMove(self, e):
x, y = e.GetPosition()
print "current window position x = ",x," y= ",y
ex = wx.App()
Example(None)
ex.MainLoop()
上面的代码产生下面的输出 -
current window position x = 562 y = 309
current window position x = 562 y = 309
current window position x = 326 y = 304
current window position x = 384 y = 240
current window position x = 173 y = 408
current window position x = 226 y = 30
current window position x = 481 y = 80
一些来自wx.Event继承子类列于下表中 -
S.N. | 事件和说明 |
1 | wxKeyEvent 当一个键被按下或释放时发生 |
2 | wxPaintEvent 在需要重绘窗口的内容时产生 |
3 | wxMouseEvent 包含有关事件,由于鼠标活动数据,如按下鼠标按钮或拖动 |
4 | wxScrollEvent 关联像wxScrollbar和wxSlider滚动控制 |
5 | wxCommandEvent 包含事件数据来自许多构件,如按钮,对话框,剪贴板等原 |
6 | wxMenuEvent 不同的菜单相关的事件但不包括菜单命令按钮点击 |
7 | wxColourPickerEvent wxColourPickerCtrl生成的事件 |
8 | wxDirFilePickerEvent 通过FileDialog和DirDialog生成的事件 |
在wxPython中事件是两种类型的。基本事件和命令事件。一个基本的事件停留在它起源的窗口。大多数 wxWidgets生成命令事件。命令事件可以传播到一个或多个窗口,类层次结构来源于窗口上方。
实例
以下是事件传播的一个简单的例子。完整的代码是 -
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
b = wx.Button(self, label = 'Btn', pos = (100,100))
b.Bind(wx.EVT_BUTTON, self.btnclk)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
def OnButtonClicked(self, e):
print 'Panel received click event. propagated to Frame class'
e.Skip()
def btnclk(self,e):
print "Button received click event. propagated to Panel class"
e.Skip()
class Example(wx.Frame):
def __init__(self,parent):
super(Example, self).__init__(parent)
self.InitUI()
def InitUI(self):
mpnl = MyPanel(self)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
self.SetTitle('Event propagation demo')
self.Centre()
self.Show(True)
def OnButtonClicked(self, e):
print 'click event received by frame class'
e.Skip()
ex = wx.App()
Example(None)
ex.MainLoop()
在上面的代码中有两个类。 MyPanel是一个子类wx.Panel 以及一个实例,wx.Frame子类是顶层窗口用于程序。一个按钮被放置在面板上。
此按钮对象绑定到的事件处理程序btnclk(),它传播到它的父类(MyPanel在此情况下)。按一下按钮生成可被Skip()方法来传播到其父CommandEvent。
MyPanel类对象也绑定所接收的事件到另一个处理方法OnButtonClicked()。反过来此函数传送到其父,Example类。上面的代码产生下面的输出−
Button received click event. Propagated to Panel class.
Panel received click event. Propagated to Frame class.
Click event received by frame class.
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython事件处理
wxPython BoxSizer布局 - WxPython教程™
sizer允许控件排放在按行或列的方式。BoxSizer布局是由它的定位参数(wxVERTICAL或wxHORIZONTAL)确定。
Box = wx.BoxSizer(wxHORIZONTAL)
Box = wx.BoxSizer(wxVERTICAL)
Add() 方法(从wxSizer继承)它附加到sizer的下一行/列。
Box.Add(control, proportion, flag, border)
proportion 参数控制的控件响应于所述容器的尺寸改变其大小。各种flag 参数的组合决定控件在sizer的外观。下面是一些标志-
对齐标志
wx.ALIGN_TOP |
wx.ALIGN_BOTTOM |
wx.ALIGN_LEFT |
wx.ALIGN_RIGHT |
wx.ALIGN_CENTER_VERTICAL |
wx.ALIGN_CENTER_HORIZONTAL |
边界标志
wx.TOP |
wx.BOTTOM |
wx.LEFT |
wx.RIGHT |
wx.ALL |
行为标志
S.N. | 行为标志和说明 |
1 | wx.EXPAND 项目将扩大,以填补提供给它的空间(wx.GROW是一样的) |
2 | wx.SHAPED 与EXPAND相似,但保持了项目的高宽比 |
3 | wx.FIXED_MINSIZE 不允许该项目变得比其最初的最小尺寸更小 |
4 | wx.RESERVE_SPACE_EVEN_IF_ HIDDEN 不允许测量器(sizer)回收项目空间,当它被隐藏时 |
border参数是整数,也可以在控件之间留下像素空间。 例如,
b = wx.StaticText(self, -1, “Enter a number”)
Box.Add(b,1,wx.ALL|wx.EXPAND,10)
以下是 wx.BoxSizer 类的一些方法 -
S.N. | 方法 & 描述 |
1 | SetOrientation() 设置定向wxHORIZONTAL或wxVERTICAL |
2 | AddSpacer() 添加非伸缩性空间 |
3 | AddStretchSpacer() 增加了伸缩空间,以便调整窗口的大小会影响控件的大小成比例 |
4 | Clear() 从sizer移除子控件 |
5 | Detach() 从sizer删除控件不销毁 |
6 | Insert() 在指定位置插入一个子控件 |
7 | Remove() 从sizer和销毁删除子控件 |
实例
在下面的代码,一个垂直box sizer用用于放置在 wxFrame 窗口面板对象。
p = wx.Panel(self)
vbox = wx.wx.BoxSizer(wx.VERTICAL)
在框中的第一行显示在中心,并且以20个像素作为边框的标签(wx.StaticText对象)。
l1 = wx.StaticText(p,label = "Enter a number",style = wx.ALIGN_CENTRE )
vbox.Add(l1,0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)
在第二行中,将显示一个wx.Button对象。因为wx.EXPAND标志它占据窗口的整个宽度。
b1 = wx.Button(p, label = "Btn1")
vbox.Add(b1,0, wx.EXPAND)
下一行还包含一个按钮。它没有使用EXPAND标志补充说。相反,因为ALIGN_CENTER_HORIZONTAL按钮的默认大小显示在中心水平。
b2 = wx.Button(p, label = "Btn2")
vbox.Add(b2,0,wx.ALIGN_CENTER_HORIZONTAL)
在接下来的一行,添加proportion参数到TextCtrl对象设定为1和EXPAND标志集。其结果是,大小变更大。
t = wx.TextCtrl(p)
vbox.Add(t,1,wx.EXPAND,10)
最后一排保持水平sizer 对象,这反过来又都有一个标签,并通过按钮拉伸空格分开。
hbox = wx.BoxSizer(wx.HORIZONTAL)
l2 = wx.StaticText(p,label = "Label2", style = wx.ALIGN_CENTRE)
hbox.Add(l2,0,wx.EXPAND)
b3 = wx.Button(p,label = "Btn3")
hbox.AddStretchSpacer(1)
hbox.Add(b3,0,wx.ALIGN_LEFT,20)
vbox.Add(hbox,1,wx.ALL|wx.EXPAND)
最后,垂直box sizer适用于 wx.Panel 对象。
下面是完整的代码 -
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title = title, size = (200,300))
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
p = wx.Panel(self)
vbox = wx.wx.BoxSizer(wx.VERTICAL)
l1 = wx.StaticText(p,label = "Enter a number",style = wx.ALIGN_CENTRE )
vbox.Add(l1,0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)
b1 = wx.Button(p, label = "Btn1")
vbox.Add(b1,0,wx.EXPAND)
b2 = wx.Button(p, label = "Btn2")
vbox.Add(b2,0,wx.ALIGN_CENTER_HORIZONTAL)
t = wx.TextCtrl(p)
vbox.Add(t,1,wx.EXPAND,10)
hbox = wx.BoxSizer(wx.HORIZONTAL)
l2 = wx.StaticText(p,label = "Label2", style = wx.ALIGN_CENTRE)
hbox.Add(l2,0,wx.EXPAND)
b3 = wx.Button(p,label = "Btn3")
hbox.AddStretchSpacer(1)
hbox.Add(b3,0,wx.ALIGN_LEFT,20)
vbox.Add(hbox,1,wx.ALL|wx.EXPAND)
p.SetSizer(vbox)
app = wx.App()
Example(None, title = 'BoxSizer Demo - www.yiibai.com')
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython BoxSizer布局
wxPython GridSizer布局 - WxPython教程™
顾名思义,一个GridSizer对象展示二维网格。控件被添加在网格插槽从左到右和由上到下方顺序。GridSizer对象有四个参数 -
wx.GridSizer(rows, columns, vgap, hgap)
vgap和hgap指定参数控制相邻控件之间的纵向和横向间距。
下表显示了 wxGridSizer 类的一些重要方法 -
S.N. | 方法和说明 |
1 | Add() 添加在下一可用网格插槽的控件 |
2 | AddMany() 在控制列表中添加每个项目 |
3 | SetRows() 设置在sizer中的行数 |
4 | GetRows() 检索在该sizer的行数 |
5 | SetCols() 设置在sizer列数 |
6 | GetCols() 检索列数的大小 |
7 | SetVGap() 设置单元之间的垂直间隙(像素) |
8 | GetVGap() 返回小区之间vgap的值 |
9 | SetHGap() 设置单元之间的水平间隙(像素) |
10 | GetHGap() 返回指定的小区之间hgap的值 |
下面的代码演示了一个4×4格,5个像素的垂直和水平边距差的一个简单gridsizer。
Gs = wx.GridSizer(4, 4, 5, 5)
十六按钮对象用'for'循环依次加入。
for i in range(1,17):
btn = "Btn"+str(i)
gs.Add(wx.Button(p,label = btn),0,wx.EXPAND)
Grid.py 完整的代码如下 -
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title = title,size = (300,200))
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
p = wx.Panel(self)
gs = wx.GridSizer(4, 4, 5, 5)
for i in range(1,17):
btn = "Btn"+str(i)
gs.Add(wx.Button(p,label = btn),0,wx.EXPAND)
p.SetSizer(gs)
app = wx.App()
Example(None, title = 'Grid Demo - www.yiibai.com')
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython GridSizer布局
wxPython FlexiGridSizer布局 - WxPython教程™
这种大小测定器也有一个二维网格。然而,它提供多一点灵活性布局控件在单元中。 尽管同一行中的所有控件具有相同的高度,并且在同一列中的所有控件具有相同的宽度,但每个小区的大小是不均匀的,如在GridSizer。
宽度和/或单元格在单个列中的高度/行可以通过AddGrowableRow()和AddGrowableCol()方法来扩展。
wx.FlexiGridSizer类的构造函数采用四个参数 -
Wx.FlexiGridSizer(rows, cols, vgap, hgap)
wx.FlexiGridSizer的主要方法的简短描述如下 -
S.N. | 方法和说明 |
1 | AddGrowableCol() 指定定索引的列增长,如果额外的高度可用。 |
2 | AddGrowRow() 指定的行定索引的增长,如果额外的宽度是可用的。 |
3 | SetFlexibleDirection() 指定大小测定器的灵活性是否影响的行,列或两者。 |
实例
用下面的代码设计两列表单。 第一列包含标签和第二个包含文本框。第二列被设定为可增长。类似地,第三行被设定为可增长。(请注意,行索引和列索引从0开始)。在AddGrowableCol()和AddGrowableRow()函数的第二个参数是proportion增长。
fgs.AddGrowableRow(2, 1)
fgs.AddGrowableCol(1, 1)
FlexiGrid.py 整个代码如下 -
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title = title, size = (300, 250))
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
panel = wx.Panel(self)
hbox = wx.BoxSizer(wx.HORIZONTAL)
fgs = wx.FlexGridSizer(3, 2, 10,10)
title = wx.StaticText(panel, label = "Title")
author = wx.StaticText(panel, label = "Name of the Author")
review = wx.StaticText(panel, label = "Review")
tc1 = wx.TextCtrl(panel)
tc2 = wx.TextCtrl(panel)
tc3 = wx.TextCtrl(panel, style = wx.TE_MULTILINE)
fgs.AddMany([(title), (tc1, 1, wx.EXPAND), (author),
(tc2, 1, wx.EXPAND), (review, 1, wx.EXPAND), (tc3, 1, wx.EXPAND)])
fgs.AddGrowableRow(2, 1)
fgs.AddGrowableCol(1, 1)
hbox.Add(fgs, proportion = 2, flag = wx.ALL|wx.EXPAND, border = 15)
panel.SetSizer(hbox)
app = wx.App()
Example(None, title = 'FlexiGrid Demo - www.yiibai.com')
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython FlexiGridSizer布局
wxPython GridBagSizer布局 - WxPython教程™
GridBagSizer是一种多功能大小测定器。它比FlexiGridSizer提供了更多的增强功能。子构件可被添加到网格中的特定单元。此外,一个子物件可以在水平和/或垂直地占据一个以上的单元。 因此,在同一行中的静态文本和多行文本控件可以有不同的宽度和高度。
网格包布局应通过确定位置,跨度和差距进行精心策划。 wx.GridBagSizer类只有一个构造函数接受两个参数。
Wx.GridBagSizer(vgap,hgap)
GridBagsizer类的最重要的方法是Add(),它接受位置作为强制性参数。 跨度,对齐方式,边界标志和边框尺寸参数是可选的。如果没有明确使用则使用默认值。
Wx.GridbagSizer().Add(control, pos, span, flags, border)
下表列出GridBagSizer类的方法 -
S.N. | 方法和说明 |
1 | Add() 在网格中的指定位置增加给定控件 |
2 | GetItemPosition() 返回在网格的控件的位置 |
3 | SetItemPosition() 在网格中的指定位置放置一个控件 |
4 | GetItemSpan() 返回一个项目的行/列跨越 |
5 | SetItemSpan() 跨越指定的项目超过行/列数 |
以下代码显示,其中有与文本框(TexCtrl)相关联的标签(静态文本)的表单。用指定跨度的参数添加TextCtrl对象。 因此,文本框的宽度跨越多个列。对于名称文本框中跨越了两列。
tc = wx.TextCtrl(panel)
sizer.Add(tc, pos = (0, 1), span = (1, 2), flag = wx.EXPAND|wx.ALL, border = 5)
文本框的地址是一个多行文本控件跨越了三列。
tc1 = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
sizer.Add(tc1, pos = (1,1), span = (1, 3), flag = wx.EXPAND|wx.ALL, border = 5)
如果窗体拉伸成为可增长,包含用于描述多行文本控件行被设置为使得它扩展垂直向下。
tc4 = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
sizer.Add(tc4, pos = (3,1), span = (1,3), flag = wx.EXPAND|wx.ALL, border = 5)
sizer.AddGrowableRow(3)
下面是完整的代码 -
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title = title)
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
panel = wx.Panel(self)
sizer = wx.GridBagSizer(0,0)
text = wx.StaticText(panel, label = "Name:")
sizer.Add(text, pos = (0, 0), flag = wx.ALL, border = 5)
tc = wx.TextCtrl(panel)
sizer.Add(tc, pos = (0, 1), span = (1, 2), flag = wx.EXPAND|wx.ALL, border = 5)
text1 = wx.StaticText(panel, label = "address")
sizer.Add(text1, pos = (1, 0), flag = wx.ALL, border = 5)
tc1 = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
sizer.Add(tc1, pos = (1,1), span = (1, 3), flag = wx.EXPAND|wx.ALL, border = 5)
text2 = wx.StaticText(panel,label = "age")
sizer.Add(text2, pos = (2, 0), flag = wx.ALL, border = 5)
tc2 = wx.TextCtrl(panel)
sizer.Add(tc2, pos = (2,1), flag = wx.ALL, border = 5)
text3 = wx.StaticText(panel,label = "Mob.No")
sizer.Add(text3, pos = (2, 2), flag = wx.ALIGN_CENTER|wx.ALL, border = 5)
tc3 = wx.TextCtrl(panel)
sizer.Add(tc3, pos = (2,3),flag = wx.EXPAND|wx.ALL, border = 5)
text4 = wx.StaticText(panel, label = "Description")
sizer.Add(text4, pos = (3, 0), flag = wx.ALL, border = 5)
tc4 = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
sizer.Add(tc4, pos = (3,1), span = (1,3), flag = wx.EXPAND|wx.ALL, border = 5)
sizer.AddGrowableRow(3)
buttonOk = wx.Button(panel, label = "Ok")
buttonClose = wx.Button(panel, label = "Close" )
sizer.Add(buttonOk, pos = (4, 2),flag = wx.ALL, border = 5)
sizer.Add(buttonClose, pos = (4, 3), flag = wx.ALL, border = 5)
panel.SetSizerAndFit(sizer)
app = wx.App()
Example(None, title = 'GridBag Demo - www.yiibai.com')
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython GridBagSizer布局
wxPython StaticBoxSizer布局 - WxPython教程™
StaticBoxSizer把一个盒子大小测定器到静态框。它提供了围绕框边界连同在顶部的标签。涉及准备statcboxsizer以下步骤 −
- 创建一个wx.StaticBox对象。
- 声明一个wx.StaticBoxSizer与上面的静态框作为其参数。
- 创建控件并添加到staticbox大小测定器。
- 设置为大小测定器的框架。
实例
在下面的例子中,两个staticbox大小测定器被创建并添加到顶部垂直框大小测定器,它控制一个frame内部面板的布局。
第一个staticbox大小测定器是围绕一个名为“Name”框。
nm = wx.StaticBox(panel, -1, 'Name:')
nmSizer = wx.StaticBoxSizer(nm, wx.VERTICAL)
横向box大小测定器,持有两个标签和两个文本框,加入到nmSizer静态框中大小测定器。
nmbox = wx.BoxSizer(wx.HORIZONTAL)
fn = wx.StaticText(panel, -1, "First Name")
nmbox.Add(fn, 0, wx.ALL|wx.CENTER, 5)
nm1 = wx.TextCtrl(panel, -1, style = wx.ALIGN_LEFT)
nm2 = wx.TextCtrl(panel, -1, style = wx.ALIGN_LEFT)
ln = wx.StaticText(panel, -1, "Last Name")
nmbox.Add(nm1, 0, wx.ALL|wx.CENTER, 5)
nmbox.Add(ln, 0, wx.ALL|wx.CENTER, 5)
nmbox.Add(nm2, 0, wx.ALL|wx.CENTER, 5)
nmSizer.Add(nmbox, 0, wx.ALL|wx.CENTER, 10)
同样,另一个 staticbox 大小测定器有一个名为“Buttons”静态框。
sbox = wx.StaticBox(panel, -1, 'buttons:')
sboxSizer = wx.StaticBoxSizer(sbox, wx.VERTICAL)
两个按钮的对象,命名为 ‘ok’ 和 ‘cancel’ 都放在一个水平box大小测定器,这反过来,被放置在第二个staticbox大小测定器内。
hbox = wx.BoxSizer(wx.HORIZONTAL)
okButton = wx.Button(panel, -1, 'ok')
hbox.Add(okButton, 0, wx.ALL|wx.LEFT, 10)
cancelButton = wx.Button(panel, -1, 'cancel')
hbox.Add(cancelButton, 0, wx.ALL|wx.LEFT, 10)
sboxSizer.Add(hbox, 0, wx.ALL|wx.LEFT, 10)
两个静态框的大小测定器,‘name’ 和 ‘Buttons’ 被添加到一个垂直box大小测定器充当顶层框架布局管理器。
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(nmSizer,0, wx.ALL|wx.CENTER, 5)
vbox.Add(sboxSizer,0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(vbox)
下面是完整的代码 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title)
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
nm = wx.StaticBox(panel, -1, 'Name:')
nmSizer = wx.StaticBoxSizer(nm, wx.VERTICAL)
nmbox = wx.BoxSizer(wx.HORIZONTAL)
fn = wx.StaticText(panel, -1, "First Name")
nmbox.Add(fn, 0, wx.ALL|wx.CENTER, 5)
nm1 = wx.TextCtrl(panel, -1, style = wx.ALIGN_LEFT)
nm2 = wx.TextCtrl(panel, -1, style = wx.ALIGN_LEFT)
ln = wx.StaticText(panel, -1, "Last Name")
nmbox.Add(nm1, 0, wx.ALL|wx.CENTER, 5)
nmbox.Add(ln, 0, wx.ALL|wx.CENTER, 5)
nmbox.Add(nm2, 0, wx.ALL|wx.CENTER, 5)
nmSizer.Add(nmbox, 0, wx.ALL|wx.CENTER, 10)
sbox = wx.StaticBox(panel, -1, 'buttons:')
sboxSizer = wx.StaticBoxSizer(sbox, wx.VERTICAL)
hbox = wx.BoxSizer(wx.HORIZONTAL)
okButton = wx.Button(panel, -1, 'ok')
hbox.Add(okButton, 0, wx.ALL|wx.LEFT, 10)
cancelButton = wx.Button(panel, -1, 'cancel')
hbox.Add(cancelButton, 0, wx.ALL|wx.LEFT, 10)
sboxSizer.Add(hbox, 0, wx.ALL|wx.LEFT, 10)
vbox.Add(nmSizer,0, wx.ALL|wx.CENTER, 5)
vbox.Add(sboxSizer,0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(vbox)
self.Centre()
panel.Fit()
self.Show()
app = wx.App()
Mywin(None, 'Staticboxsizer Demo - www.yiibai.com')
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython StaticBoxSizer布局
wxPython布局管理 - WxPython教程™
一个GUI部件可通过指定以像素为单位的绝对坐标放置在容器窗口中。 坐标是相对于它的构造尺寸参数定义的窗口的尺寸大小。窗口中的窗口小部件的位置由它的构造函数的pos参数定义的。
import wx
app = wx.App()
window = wx.Frame(None, title = "wxPython Frame", size = (300,200))
panel = wx.Panel(window)
label = wx.StaticText(panel, label = "Hello World", pos = (100,50))
window.Show(True)
app.MainLoop()
绝对定位不适合下列原因 −
- 小部件的位置,如果调整窗口的大小也不会改变。
- 外观可能不是均匀的,在具有不同的分辨率不同的显示设备。
- 修改中的布局是困难的,因为它可能需要重新设计整个表格。
wxPython的API提供了布局类的容器内的小部件的定位更优雅的管理。布局管理器使用绝对定位的优点是 -
- 在窗口中的窗口小部件会自动调整大小。
- 确保均匀的外观上不同分辨率的显示设备。
- 添加或去除部件动态地是可能的,而不需要重新设计。
布局管理器在wxPython中被称为Sizer。Wx.Sizer是所有sizer 的基类。让我们来讨论一些重要的sizer ,如wx.BoxSizer,wx.StaticBoxSizer,wx.GridSizer,wx.FlexGridSizer和wx.GridBagSizer。
S.N. | 大小测定器和说明 |
1 | sizer允许控件排放在按行或列的方式。BoxSizer布局是由它的定位参数(wxVERTICAL或wxHORIZONTAL)确定。 |
2 | 顾名思义,一个GridSizer对象呈现二维网格。控件被添加在网格槽以左到右和由上到下方顺序。 |
3 | 这种sizer 也有一个二维网格。它提供灵活性布局中的控制单元。 |
4 | GridBagSizer是一种多功能sizer。它比FlexiGridSizer提供了更多的增强功能。子构件可被添加到网格中的指定单元格。 |
5 | StaticBoxSizer把一个盒子sizer放到静态框。它提供了围绕框边界以及顶部标签。 |
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython布局管理
wxPython Button控件 - WxPython教程™
在任何GUI界面按钮组件的应用最为广泛。它捕获用户生成的点击事件。其最明显的用途是触发绑定到一个处理函数。
wxPython类库提供不同类型的按钮。有一个简单的、传统的按钮,wx.Button类对象带有一些文本作为其标题。 两状态的按钮也可以,它被命名为wx.ToggleButton。其按下或消沉状态可通过事件处理程序函数来识别。
另一种类型的按钮,wx.BitmapButton显示位图(图片)作为它的图标。
构造wx.Button类和wx.ToggleButton类使用以下参数 -
Wx.Button(parent, id, label, pos, size, style)
这些是wx.Button类的一些重要方法-
S.N. | 方法和说明 |
1 | SetLabel() 编程设置按钮的标题 |
2 | GetLabel() 返回按钮的标题 |
3 | SetDefault() 按钮设置为默认顶层窗口。模拟click事件按下回车键 |
wx.ToggleButton类的两种重要的方法是 -
S.N. | 方法和说明 |
1 | GetValue() Returns the state of toggle button (on/off) |
2 | SetValue() Sets the state of button programmatically |
为了创建位图按钮,首先,位图对象需要被构建图像文件出来。
wx.Bitmap类下面是最常用的构造函数 -
Wx.Bitmap(fiiename, wx.BITMAP_TYPE)
一些预定义的位图类型常量是 -
wx.BITMAP_TYPE_BMP |
wx.BITMAP_TYPE_ICO |
wx.BITMAP_TYPE_CUR |
wx.BITMAP_TYPE_TIFF |
wx.BITMAP_TYPE_TIF |
wx.BITMAP_TYPE_GIF |
wx.BITMAP_TYPE_PNG |
wx.BITMAP_TYPE_JPEG |
wx.BITMAP_TYPE_PCX |
wx.BITMAP_TYPE_ICON |
wx.BITMAP_TYPE_ANY |
位图(bitmap)对象作为参数wx.BitmapButton类的构造函数中的一个。
Wx.BitmapButton(parent, id, bitmap, pos, size, style)
在某些操作系统平台上,位图按钮可以显示位图和标签。 SetLabel()方法用于指定标题。在其他平台上,它作为一个内部的标签。正常的按钮,以及位图按钮发出wx.CommandEvent。 EVT_BUTTON绑定器关联一个函数来做处理。
另一方面切换按钮使用wx.TOGGLEBUTTON绑定器来处理事件。
在下面的例子中,所有三种类型的按钮被放置在面板的垂直框大小测定器。
使用语句创建简单的按钮对象 -
self.btn = wx.Button(panel, -1, "click Me")
切换按钮使用下面的语句构造-
self.tbtn = wx.ToggleButton(panel , -1, "click to on")
这些按钮加入到使用以下语句垂直大小测定器 -
vbox.Add(self.btn,0,wx.ALIGN_CENTER)
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)
注 - 由于wx.EXPAND标记时,切换按钮占据着帧的整个宽度。
使用EVT_BUTTON和EVT_TOGGLEBUTTON绑定器使它们各自相关联处理程序。
self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)
三个位图按钮添加到一个横向box大小测定器。这些按钮显示图标,作为它们的标题。
bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
这三个按钮的点击事件是针对OnClicked()方法。
self.bmpbtn.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn1.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn2.Bind(wx.EVT_BUTTON, self.OnClicked)
这些按钮的内部标签分别设置为新建,打开和保存。
OnClicked()事件处理函数检索源按钮的标签,从而导致click事件。这种标签打印到控制台上。
def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn
点击切换按钮时OnToggle()触发事件处理程序。其状态由GetValue()方法读取,因此按钮的标题被设置。
def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "off"
event.GetEventObject().SetLabel("click to off")
else:
print "on"
event.GetEventObject().SetLabel("click to on")
完整的代码列表如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (200,150))
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
self.btn = wx.Button(panel,-1,"click Me")
vbox.Add(self.btn,0,wx.ALIGN_CENTER)
self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn = wx.ToggleButton(panel , -1, "click to on")
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)
hbox = wx.BoxSizer(wx.HORIZONTAL)
bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn,0,wx.ALIGN_CENTER)
self.bmpbtn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn.SetLabel("NEW")
bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn1,0,wx.ALIGN_CENTER)
self.bmpbtn1.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn1.SetLabel("OPEN")
bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn2,0,wx.ALIGN_CENTER)
self.bmpbtn2.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn2.SetLabel("SAVE")
vbox.Add(hbox,1,wx.ALIGN_CENTER)
panel.SetSizer(vbox)
self.Centre()
self.Show()
self.Fit()
def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn
def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "Toggle button state off"
event.GetEventObject().SetLabel("click to off")
else:
print " Toggle button state on"
event.GetEventObject().SetLabel("click to on")
app = wx.App()
Mywin(None, 'Button Demo - www.yiibai.com')
app.MainLoop()
上面的代码产生下面的输出 -
Label of pressed button = click Me
Toggle button state off
Toggle button state on
Label of pressed button = NEW
Label of pressed button = OPEN
Label of pressed button = SAVE
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython Button控件
wxPython可停靠窗口 - WxPython教程™
wxAui是wxWidgets API引入作为的高级用户界面库。 Wx.aui.AuiManager在AUI框架的核心类。
AuiManager管理及使用wx.aui.AuiPanelInfo对象,每个面板信息的特定帧相关的窗格。让我们了解PanelInfo对象控件对接和浮动行为的各种属性。
在顶层框架投入浮动窗口包括以下步骤 -
首先,创建一个AuiManager对象。
self.mgr = wx.aui.AuiManager(self)
然后,面板及所需的控件设计。
pnl = wx.Panel(self)
pbox = wx.BoxSizer(wx.HORIZONTAL)
text1 = wx.TextCtrl(pnl, -1, "Dockable", style = wx.NO_BORDER | wx.TE_MULTILINE)
pbox.Add(text1, 1, flag = wx.EXPAND)
pnl.SetSizer(pbox)
AuiPanelInfo需要设置以下参数。
- 方向 − Top, Bottom, Left, Right, 或 Center
- 位置 − 多个窗格中可以放置一个可停靠的区域内。每个被赋予位置编号。
- 行 − 多个窗格中显示在一排。就像一个以上的工具栏出现在同一行中。
- 层 − 窗格可以放置在层中
使用这种PanelInfo,所设计的面板添加到管理器对象。
info1 = wx.aui.AuiPaneInfo().Bottom()
self.mgr.AddPane(pnl,info1)
顶层窗口的其余部分可能有其他控件。
Dock.py 完整的代码如下 -
import wx
import wx.aui
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (300,300))
self.mgr = wx.aui.AuiManager(self)
pnl = wx.Panel(self)
pbox = wx.BoxSizer(wx.HORIZONTAL)
text1 = wx.TextCtrl(pnl, -1, "Dockable", style = wx.NO_BORDER | wx.TE_MULTILINE)
pbox.Add(text1, 1, flag = wx.EXPAND)
pnl.SetSizer(pbox)
info1 = wx.aui.AuiPaneInfo().Bottom()
self.mgr.AddPane(pnl, info1)
panel = wx.Panel(self)
text2 = wx.TextCtrl(panel, size = (300,200), style = wx.NO_BORDER | wx.TE_MULTILINE)
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(text2, 1, flag = wx.EXPAND)
panel.SetSizerAndFit(box)
self.mgr.Update()
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Centre()
self.Show(True)
def OnClose(self, event):
self.mgr.UnInit()
self.Destroy()
app = wx.App()
Mywin(None,"Dock Demo - www.yiibai.com")
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython可停靠窗口
wxPython多文档界面 - WxPython教程™
一个典型的GUI应用程序可以有多个窗口。标签和堆叠部件一次允许激活一个这样的窗口。然而,很多时候这种方法可能不是有用,因为其他窗口可能是隐藏的。
同时显示多个窗口的一种方法是创建它们作为独立的窗口。这被称为SDI(单文档界面)。这需要更多的存储器资源,每个窗口可以具有其自己的菜单系统,工具栏等等
在wxPython中的MDI框架提供了wx.MDIParentFrame类。其对象充当容器为多个子窗口,每个对象是wx.MDIChildFrame类。
子窗口位于父框架的MDIClientWindow区域。当一个孩子帧添加,父框架的菜单栏将显示包含子窗口按钮排放在级联或平铺方式在菜单。
实例
下面的例子演示MDIParentFrame的用途为顶层窗口。菜单按钮被称为NewWindow增加在客户区的子窗口。多个窗口可以被添加,然后设置为层叠或平铺顺序。
完整的代码如下 -
import wx
class MDIFrame(wx.MDIParentFrame):
def __init__(self):
wx.MDIParentFrame.__init__(self, None, -1, "MDI Parent - www.yiibai.com", size = (600,400))
menu = wx.Menu()
menu.Append(5000, "&New Window")
menu.Append(5001, "&Exit")
menubar = wx.MenuBar()
menubar.Append(menu, "&File")
self.SetMenuBar(menubar)
self.Bind(wx.EVT_MENU, self.OnNewWindow, id = 5000)
self.Bind(wx.EVT_MENU, self.OnExit, id = 5001)
def OnExit(self, evt):
self.Close(True)
def OnNewWindow(self, evt):
win = wx.MDIChildFrame(self, -1, "Child Window")
win.Show(True)
app = wx.App()
frame = MDIFrame()
frame.Show()
app.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython多文档界面
wxPython绘图API - WxPython教程™
GDI+(图形绘制接口),CoreGraphics和Cairo库形成wxPython绘图API的框架。wx.GraphicsContext是主要绘制对象,使用它来创建各种设备上下文对象。
wx.DC是一个抽象类。它的派生类用于渲染的图形和文字在不同的设备。关联设备类 -
- wx.ScreenDC − 使用它描绘在屏幕上,而不是一个单独的窗口。
- wx.ClientDC − 使用它描绘在窗口(无边框等装饰的一部分)的客户区域,但不从wxPaintEvent内使用它。
- wx.PaintDC − 使用它描绘在窗口的客户区域,但只能从wxPaintEvent内。
- wx.WindowDC − 使用它描绘的窗口,包括装饰的整个区域。这可能不提供对非Windows平台。
wxPython中的绘图API提供不同的功能绘制形状,文字和图像。需要绘制用途,如颜色,画笔,刷子和字体的对象也可以使用GDI类构造。
wx.Colour类
颜色对象表示RGB(红,绿和蓝)的亮度值,每个是在0-255的比例组合。还有一些预定义的颜色对象-
- wxBLACK
- wxBLUE
- wxCYAN
- wxGREEN
- wxYELLOW
- wxLIGHT_GREY
- wxRED
- wxWHITE
颜色以RGB值自定义组合形成为wx.Colour对象。
wx.Colour(r,g,b)
wx.Pen类
Pen对象确定的图形像线,矩形,圆等的形状的颜色,宽度和样式
预定义的画笔对象是-
wxBLACK_DASHED_PEN |
wxBLACK_PEN |
wxBLUE_PEN |
wxCYAN_PEN |
wxGREEN_PEN |
wxYELLOW_PEN |
wxGREY_PEN |
wxLIGHT_GREY_PEN |
wxMEDIUM_GREY_PEN |
wxRED_PEN |
wxTRANSPARENT_PEN |
wxWHITE_PEN |
预定义的画笔样式是 -
wx.SOLID |
wx.DOT |
wx.LONG_DASH |
wx.SHORT_DASH |
wx.DOT_DASH |
wx.TRANSPARENT |
wx.Brush 类
Brush是另一个基本图形对象必须填写的形状,如矩形,椭圆形,圆形等的背景
自定义画笔对象需要wx.Colour和画笔的样式参数。以下是预定义的刷样式列表 -
wx.SOLID |
wx.STIPPLE |
wx.BDIAGONAL_HATCH |
wx.CROSSDIAG_HATCH |
wx.FDIAGONAL_HATCH |
wx.CROSS_HATCH |
wx.HORIZONTAL_HATCH |
wx.VERTICAL_HATCH |
wx.TRANSPARENT |
wxPython有许多便于绘制不同的形状,文本和图像的函数。
S.N. | 函数与说明 |
1 | DrawRectangle() 按给定尺寸绘制矩形 |
2 | DrawCircle() 用给定的点为中心以及半径绘制一个圆 |
3 | DrawEllipse() 用给定的x和y半径绘制一个椭圆 |
4 | DrawLine() 绘制两个wx.Point对象之间的线 |
5 | DrawBitmap() 在给定的位置绘制图像 |
6 | DrawText() 显示在指定的位置给定的文本 |
实例
上述函数是在下面的例子中实现的,利用画笔,画笔,颜色和字体的对象。
完整的代码如下 -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (500,300))
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Centre()
self.Show(True)
def OnPaint(self, e):
dc = wx.PaintDC(self)
brush = wx.Brush("white")
dc.SetBackground(brush)
dc.Clear()
dc.DrawBitmap(wx.Bitmap("python.jpg"),10,10,True)
color = wx.Colour(255,0,0)
b = wx.Brush(color)
dc.SetBrush(b)
dc.DrawCircle(300,125,50)
dc.SetBrush(wx.Brush(wx.Colour(255,255,255)))
dc.DrawCircle(300,125,30)
font = wx.Font(18, wx.ROMAN, wx.ITALIC, wx.NORMAL)
dc.SetFont(font)
dc.DrawText("Hello wxPython",200,10)
pen = wx.Pen(wx.Colour(0,0,255))
dc.SetPen(pen)
dc.DrawLine(200,50,350,50)
dc.SetBrush(wx.Brush(wx.Colour(0,255,0), wx.CROSS_HATCH))
dc.DrawRectangle(380, 15, 90, 60)
ex = wx.App()
Mywin(None,'Drawing Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython绘图API
wxPython拖放 - WxPython教程™
拖放对用户是非常直观。它在许多桌面应用程序,用户可以复制或只需用鼠标拖动和删除另一个窗口中移动对象从一个窗口到另一个中。
拖放操作包括以下步骤 -
- 声明拖放目标
- 创建数据对象
- 创建 wx.DropSource
- 执行拖放操作
- 取消或接受拖放
在wxPython中,有两个预定义拖放目标 -
- wx.TextDropTarget
- wx.FileDropTarget
许多wxPython的小部件支持拖放活动。源代码控制必须启用拖动,而目标控制必须在一个位置接受(或拒绝)拖放。
用户拖动源数据放置在目标对象上。目标对象的OnDropText()会消耗数据。如果需要的话,从源对象的数据可以被删除。
实例
在下面的例子中,两个ListCrl对象在Box Sizer水平放置。在左边列表填充了一个 languages[] 的数据。它被指定为拖动源。在右边是目标。
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET','C#']
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
for lang in languages:
self.lst1.InsertStringItem(0,lang)
第二个列表控件是空的,它是TextDropTarget类对象的参数。
class MyTextDropTarget(wx.TextDropTarget):
def __init__(self, object):
wx.TextDropTarget.__init__(self)
self.object = object
def OnDropText(self, x, y, data):
self.object.InsertStringItem(0, data)
OnDropText()方法添加源数据在目标列表控件。
拖拽操作是由事件绑定器初始化。
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
OnDragInit()函数将在目标上拖拽数据并从源中删除。
def OnDragInit(self, event):
text = self.lst1.GetItemText(event.GetIndex())
tobj = wx.PyTextDataObject(text)
src = wx.DropSource(self.lst1)
src.SetData(tobj)
src.DoDragDrop(True)
self.lst1.DeleteItem(event.GetIndex())
完整的代码如下 -
import wx
class MyTarget(wx.TextDropTarget):
def __init__(self, object):
wx.TextDropTarget.__init__(self)
self.object = object
def OnDropText(self, x, y, data):
self.object.InsertStringItem(0, data)
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (-1,300))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.HORIZONTAL)
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript',
'PHP', 'VB.NET','C#']
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
for lang in languages:
self.lst1.InsertStringItem(0,lang)
dt = MyTarget(self.lst2)
self.lst2.SetDropTarget(dt)
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
box.Add(self.lst1,0,wx.EXPAND)
box.Add(self.lst2, 1, wx.EXPAND)
panel.SetSizer(box)
panel.Fit()
self.Centre()
self.Show(True)
def OnDragInit(self, event):
text = self.lst1.GetItemText(event.GetIndex())
tobj = wx.PyTextDataObject(text)
src = wx.DropSource(self.lst1)
src.SetData(tobj)
src.DoDragDrop(True)
self.lst1.DeleteItem(event.GetIndex())
ex = wx.App()
Mywin(None,'Drag&Drop Demo - www.yiibai.com')
ex.MainLoop()
上面的代码产生下面的输出 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » wxPython拖放




