2. GUI的基本框架
2.1 安装wxPython:Anaconda Prompt下执行 conda install wxPython
2.2 创建一个简单的wxPython程序:
import wx # 引入wx包 app = wx.App() # 创建一个应用程序对象,用来执行像消息循环这样的一些动作 frame = wx.Frame(None, title='Hello, World!') # 创建一个frame对象,frame是其他UI组件的容器 frame.Show(True) # 用来显示窗体 app.MainLoop() # 进入事件循环
import wx class MyApp(wx.App): def OnInit(self): frame = wx.Frame(None, title="Hello, World!") frame.Show() return True if __name__ == '__main__': app = MyApp() app.MainLoop()
2.3 组件:
2.3.1 组件容器(Containers)-- 用于容纳其他组件
例:wx.Panel等
2.3.2 动态组件(Dynamic Widgets)-- 可以被用户编辑
例:wx.Button、wx.TextCtrl、wx.ListBox等
2.3.3 静态组件(Static Widgets)-- 显示信息用,不能被用户编辑
例:wx.StaticBitmap、wx.StaticText、wxStaticLine等
2.3.4 其他组件
例:wx.ToolBar、wx.MenuBar、wx.StatusBar
2.3.5 Frame(Panel(Text Control))
import wx class Frame1(wx.Frame): def __init__(self, superior): wx.Frame.__init__(self,parent=superior,title="Example",pos=(100,200),size=(200,100)) panel = wx.Panel(self) text1 = wx.TextCtrl(panel,value="Hello,World!",size=(200,100)) if __name__ == '__main__': app = wx.App() frame = Frame1(None) frame.Show(True) app.MainLoop()
2.3.6 事件处理机制(Event Handling):
1) GUI程序工作的基本机制之一 -- 事件处理
2) 事件
- 移动鼠标,按下鼠标左键、单击按钮等
- 可以由用户操作触发产生,也可以在程序中创建对象产生
3) wxPython程序将特定类型的事件关联到特定的一块代码(方法),当该类型的事件产生时,相关代码将响应事件被自动执行
- 例:当产生鼠标移动事件时,OnMove() 方法将被自动调用
2.3.7 事件举例:
import wx class Frame1(wx.Frame): def __init__(self,superior): wx.Frame.__init__(self, parent=superior, title='Example', pos=(200,200), size=(200,100)) self.panel = wx.Panel(self) self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick) def OnClick(self,event): posm = event.GetPosition() wx.StaticText(parent=self.panel, label='Hello', pos=(posm.x, posm.y)) if __name__ == '__main__': app = wx.App() frame = Frame1(None) frame.Show(True) app.MainLoop()
3. GUI常用组件
3.1 按钮(Button及其家族)
3.1.1 功能:接收用户的点击事件,触发相应的操作。
3.1.2 常用按钮
- wx.Button:文本按钮
- wx.BitmapButton:位图按钮
- wx.ToggleButton:开关按钮
3.1.3 绑定处理按钮点击的事件
3.2 菜单(Menu及其组件)
3.2.1 菜单:菜单栏,菜单,菜单项命令
3.2.2 wxPython用于创建菜单的类: - wx.MenuBar - wx.Menu - wx.MenuItem
3.2.3 菜单事件: - wx.EVT_MENU
# 绑定事件处理器
self.Bind(wx.EVT_MENU, self.OnClickBigger, biggerItem)
self.Bind(wx.EVT_MENU, self.OnClickQuit, id=wx.ID_EXIT)
# 事件处理器
def OnClickBigger(self, e):
pass
def OnClickQuit(self, e):
self.Close()
3.3 静态文本(StaticText)和文本框(TextCtrl)
3.3.1 文本框用于接收用户在框内输入的信息,或显示由程序提供的信息
3.3.2 静态文本框(标签): - wx.StaticText
3.3.3 文本框: - 类:wx.TextCtrl - 常用形式:单行,多行,富文本框
3.4 列表(ListCtrl)
3.4.1 列表用于显示多个条目并且可供用户选择
3.4.2 列表能够以下面四种不同模式建造:
图标:- wx.LC_ICON
小图标:- wx.LC_SMALL_ICON
列表:- wx.LC_LIST
报告:- wx.LC_REPORT
3.5 单选(RadioBox)与复选框(CheckBox)
3.5.1 复选框用于从一组可选项中,同时选中多个选项
3.5.2 单选框用于从一组互斥的选项中,选取其一
6. 布局管理 -- 灵活布局的解决方案 sizer,屏幕布局的算法
6.1 wxPython常用的sizer
- wx.BoxSizer - wx.FlexGridSizer - wx.GridSizer - wx.GridBagSizer - wx.StaticBoxSizer
6.2 使用sizer的步骤
a. 创建自动调用尺寸的容器,例如panel
b. 创建sizer
c. 创建子窗口(窗体组件)
d. 使用sizer的Add()方法将每个子窗口添加给sizer
e. 调用容器的SetSizer(sizer)方法
6.3 示例程序
import wx class Frame1(wx.Frame): def __init__(self, superior): wx.Frame.__init__(self, parent=superior, title="Hello World in wxPython") panel = wx.Panel(self) sizer = wx.BoxSizer(wx.VERTICAL) self.text1 = wx.TextCtrl(panel, value="Hello,World!", size=(200,180), style=wx.TE_MULTILINE) sizer.Add(self.text1, 0, wx.ALIGN_TOP | wx.EXPAND) button = wx.Button(panel, label='Click') sizer.Add(button) panel.SetSizerAndFit(sizer) panel.Layout() self.Bind(wx.EVT_BUTTON, self.OnClick, button) def OnClick(self, text): self.text1.AppendText(' Hello, World!') if __name__ == '__main__': app = wx.App() frame = Frame1(None) frame.Show(True) app.MainLoop()