python漂亮交互界⾯设计_python图形化界⾯设计
(wxpython)三全⾯介绍
⽬录
主要使⽤wxPython(最成熟的跨平台python GUI⼯具包)
前戏:基础了解
WxPython的程序结构
窗⼝组成:
事件驱动:
常⽤组件(简单了解,后⾯还有):
基本组件
1.静态⽂本框
2.⽂本输⼊框
3.按钮控件
4.单选框
5.多选框
6.列表控件
7.使⽤sizer布局组件
菜单,窗⼝,对话框组件
菜单
窗⼝
对话框
窗⼝和对话框的交互
⾼级控件
表格控件
⾼级列表控件
树形控件
树表控件
定时器控件
WxPython库中的⾼级功能
主要使⽤wxPython(最成熟的跨平台python GUI⼯具包)
前戏:基础了解
importwxclass MyFrame(wx.Frame): #创建⾃定义Frame
def __init__(lf,parent):
wx.Frame.__init__(lf,parent,id=-1,title="Hello World",size=(300,300)) #设置窗体
"""panel和sizer是wxpython提供的窗⼝部件。是容器部件,可以⽤于存放其他窗⼝部件"""panel=wx.Panel(lf)
sizer=wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(sizer)
txt= wx.StaticText(panel,-1,"Hello World!") #创建静态⽂本组件
sizer.Add(txt,0,wx.TOP|wx.LEFT,100)
lf.Center()#将窗⼝放在桌⾯环境的中间
app=wx.App()"""Every wx application must have a single ``wx.App`` instance, and all
creation of UI objects should be delayed until after the ``wx.App`` object
has been created in order to ensure that the gui platform and wxWidgets
have been fully initialized."""frame= MyFrame(None) #为顶级窗⼝
frame.Show(True)
app.MainLoop()
View Code
补充:id是什么:wxpython对每个控件都会分配⼀个唯⼀的整数型ID,⽅便调⽤,类⼗余c中的Handle。ID在时间响应中必不可少。
创建控件时如果ID为-1时,会⾃动分配⼀个ID。这样就不能对ID进⾏引⽤。其实可以使⽤控件对象的GetId⽅法进⾏获取
前提: 唯⼀ID的⽣成:wx提供了NewId(),可以⽣成唯⼀的id。(若担⼼重复,可以使⽤RegisterID检测)
我们想要使⽤ID,但是程序中控件太多,如何处理
⽅法⼀:前置每个控件的ID(⾃⼰设置的名称),使⽤列表⽣成器⽣成
[Btn_1_ID,Btn_2_ID,Btn_3_ID] = [wx.NewId() for _init_cj in range(3)]有⼏个控件就设置循环⼏次
然后在⽣成控件时进⾏调⽤
⽅法⼆:使⽤类的属性来预先分配,然后控件类对他进⾏继承,每个控件类句读⼀个属于他的id属性
WxPython的程序结构
⼀个WxPython程序⼀般包含两个对象:应⽤程序对象和根窗⼝(可多个)。其中,应⽤程序对象可以使⽤wx.App(或⼦类)实现(⽤于处理窗⼝中的事件响应),根窗⼝可以使⽤wx.Frame实现。
importwxclass MyFrame(wx.Frame): #创建⾃定义Frame
def __init__(lf,parent):#def __init__(
#lf, parent=None, id=None, title=None, pos=None,
#size=None, style=None, name=None)
wx.Frame.__init__(lf,parent,id=-1,title="Hello World",size=(300,300)) #设置窗体
panel=wx.Panel(lf)
sizer=wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(sizer)
txt= wx.StaticText(panel,-1,"Hello World!") #创建静态⽂本组件
sizer.Add(txt,0,wx.TOP|wx.LEFT,100)
lf.Center()#将窗⼝放在桌⾯环境的中间
classMyApp(wx.App):defOnInit(lf):print("开始进⼊事件循环")
lf.frame=MyFrame(None)
lf.frame.Show(True)return True #需要返回⼀个布尔型,只有初始返回成功,程序才会继续执⾏
defOnExit(lf):print("事件循环结束")importtime
time.sleep(2)return 0 #返回状态码
app=MyApp()
app.MainLoop()
View Code
其中OnInit⽅法中是必须的,其将会在事件循环处理之前被系统调⽤。同样的在事件结束之后调⽤的⽅法也存在(OnExit)
两个⽅法是相对的。例如:开启数据库和断开数据库
窗⼝组成:
前⾯的代码中窗⼝和应⽤程序似乎没有关联,为什么?
在应⽤程序对象中,可以通过SetTopWindow⽅法来设置根窗⼝。若是没有设置,是因为应⽤程序会选择窗⼝列表中的第⼀个作为根窗⼝。上⾯的程序也只有⼀个窗⼝,所以没有必要去显⽰设置。同样使⽤SetTopWindow也可以改变根窗⼝
控件的部分构造参数:
参数
说明
parent
⽗窗⼝(为None代表为顶级窗⼝),注意设置⽗窗⼝后,在⽗窗⼝关闭时,⼦窗⼝也会消失
id
上⾯说过了
title
标题
pos
相对于屏幕的位置默认(-1,-1),⾃⾏选择。我们在上⾯使⽤center也可以改变窗⼝在屏幕中的位置
size
⼤⼩默认(-1,-1)窗⼝系统⾃⾏选择
style
窗⼝类型...
name
窗⼝的内在名字
style风格:
EVT_SIZE =wx.PyEventBinder( wxEVT_SIZE )
EVT_SIZING=wx.PyEventBinder( wxEVT_SIZING )
EVT_MOVE=wx.PyEventBinder( wxEVT_MOVE )
EVT_MOVING=wx.PyEventBinder( wxEVT_MOVING )
EVT_MOVE_START=wx.PyEventBinder( wxEVT_MOVE_START )
EVT_MOVE_END=wx.PyEventBinder( wxEVT_MOVE_END )
EVT_CLOSE=wx.PyEventBinder( wxEVT_CLOSE_WINDOW )
EVT_END_SESSION=wx.PyEventBinder( wxEVT_END_SESSION )
EVT_QUERY_END_SESSION=wx.PyEventBinder( wxEVT_QUERY_END_SESSION )
EVT_PAINT=wx.PyEventBinder( wxEVT_PAINT )
EVT_NC_PAINT=wx.PyEventBinder( wxEVT_NC_PAINT )
EVT_ERASE_BACKGROUND=wx.PyEventBinder( wxEVT_ERASE_BACKGROUND )
EVT_CHAR=wx.PyEventBinder( wxEVT_CHAR )
EVT_KEY_DOWN=wx.PyEventBinder( wxEVT_KEY_DOWN )
EVT_KEY_UP=wx.PyEventBinder( wxEVT_KEY_UP )
EVT_HOTKEY= wx.PyEventBinder( wxEVT_HOTKEY, 1)
EVT_CHAR_HOOK=wx.PyEventBinder( wxEVT_CHAR_HOOK )
EVT_MENU_OPEN=wx.PyEventBinder( wxEVT_MENU_OPEN )
EVT_MENU_CLOSE=wx.PyEventBinder( wxEVT_MENU_CLOSE )
EVT_MENU_HIGHLIGHT= wx.PyEventBinder( wxEVT_MENU_HIGHLIGHT, 1)
EVT_MENU_HIGHLIGHT_ALL=wx.PyEventBinder( wxEVT_MENU_HIGHLIGHT )
EVT_SET_FOCUS=wx.PyEventBinder( wxEVT_SET_FOCUS )
EVT_KILL_FOCUS=wx.PyEventBinder( wxEVT_KILL_FOCUS )
EVT_CHILD_FOCUS=wx.PyEventBinder( wxEVT_CHILD_FOCUS )
EVT_ACTIVATE=wx.PyEventBinder( wxEVT_ACTIVATE )
EVT_ACTIVATE_APP=wx.PyEventBinder( wxEVT_ACTIVATE_APP )
EVT_HIBERNATE=wx.PyEventBinder( wxEVT_HIBERNATE )
EVT_DROP_FILES=wx.PyEventBinder( wxEVT_DROP_FILES )
EVT_INIT_DIALOG=wx.PyEventBinder( wxEVT_INIT_DIALOG )
EVT_SYS_COLOUR_CHANGED=wx.PyEventBinder( wxEVT_SYS_COLOUR_CHANGED ) EVT_DISPLAY_CHANGED=wx.PyEventBinder( wxEVT_DISPLAY_CHANGED )
EVT_SHOW=wx.PyEventBinder( wxEVT_SHOW )
EVT_MAXIMIZE=wx.PyEventBinder( wxEVT_MAXIMIZE )
EVT_ICONIZE=wx.PyEventBinder( wxEVT_ICONIZE )
EVT_NAVIGATION_KEY=wx.PyEventBinder( wxEVT_NAVIGATION_KEY )
EVT_PALETTE_CHANGED=wx.PyEventBinder( wxEVT_PALETTE_CHANGED )
EVT_QUERY_NEW_PALETTE=wx.PyEventBinder( wxEVT_QUERY_NEW_PALETTE )
EVT_WINDOW_CREATE=wx.PyEventBinder( wxEVT_CREATE )
EVT_WINDOW_DESTROY=wx.PyEventBinder( wxEVT_DESTROY )
EVT_SET_CURSOR=wx.PyEventBinder( wxEVT_SET_CURSOR )
EVT_MOUSE_CAPTURE_CHANGED=wx.PyEventBinder( wxEVT_MOUSE_CAPTURE_CHANGED ) EVT_MOUSE_CAPTURE_LOST=wx.PyEventBinder( wxEVT_MOUSE_CAPTURE_LOST )
EVT_LEFT_DOWN=wx.PyEventBinder( wxEVT_LEFT_DOWN )
EVT_LEFT_UP=wx.PyEventBinder( wxEVT_LEFT_UP )
EVT_MIDDLE_DOWN=wx.PyEventBinder( wxEVT_MIDDLE_DOWN )
EVT_MIDDLE_UP=wx.PyEventBinder( wxEVT_MIDDLE_UP )
EVT_RIGHT_DOWN=wx.PyEventBinder( wxEVT_RIGHT_DOWN )
EVT_RIGHT_UP=wx.PyEventBinder( wxEVT_RIGHT_UP )
EVT_MOTION=wx.PyEventBinder( wxEVT_MOTION )
EVT_LEFT_DCLICK=wx.PyEventBinder( wxEVT_LEFT_DCLICK )
EVT_MIDDLE_DCLICK=wx.PyEventBinder( wxEVT_MIDDLE_DCLICK )
EVT_RIGHT_DCLICK=wx.PyEventBinder( wxEVT_RIGHT_DCLICK )
EVT_LEAVE_WINDOW=wx.PyEventBinder( wxEVT_LEAVE_WINDOW )
EVT_ENTER_WINDOW=wx.PyEventBinder( wxEVT_ENTER_WINDOW )
EVT_MOUSEWHEEL=wx.PyEventBinder( wxEVT_MOUSEWHEEL )
EVT_MOUSE_AUX1_DOWN=wx.PyEventBinder( wxEVT_AUX1_DOWN )
EVT_MOUSE_AUX1_UP=wx.PyEventBinder( wxEVT_AUX1_UP )
EVT_MOUSE_AUX1_DCLICK=wx.PyEventBinder( wxEVT_AUX1_DCLICK )
EVT_MOUSE_AUX2_DOWN=wx.PyEventBinder( wxEVT_AUX2_DOWN )
EVT_MOUSE_AUX2_UP=wx.PyEventBinder( wxEVT_AUX2_UP )
EVT_MOUSE_AUX2_DCLICK=wx.PyEventBinder( wxEVT_AUX2_DCLICK )
EVT_MOUSE_EVENTS=wx.PyEventBinder([ wxEVT_LEFT_DOWN,
wxEVT_LEFT_UP,
wxEVT_MIDDLE_DOWN,
wxEVT_MIDDLE_UP,
wxEVT_RIGHT_DOWN,
wxEVT_RIGHT_UP,
wxEVT_MOTION,