wxpython有哪些基本功能是_wxPython笔记:wxpython常用控件总结(转载)

本文详细介绍了wxPython的基本控件及其使用,包括Frame、Panel、Sizer的运用,以及StaticText、TextCtrl、Button等组件的创建与事件绑定。文章探讨了控件ID的管理,事件处理机制,如Bind方法和EvtHandler类,以及如何通过Sizer实现窗口部件的自动布局。此外,还介绍了对话框、菜单、位图菜单、弹出式菜单、列表控件、树形控件和定时器的使用。最后,文章提到了wxPython中HTML显示和剪切板对象的操作。
摘要由CSDN通过智能技术生成

主要使用wxPython(最成熟的跨平台python GUI工具包)

前戏:基础了解

48304ba5e6f9fe08f3fa1abda7d326ab.png

import wx

class MyFrame(wx.Frame): #创建自定义Frame

def __init__(self,parent):

wx.Frame.__init__(self,parent,id=-1,title="Hello World",size=(300,300)) #设置窗体

"""

panel和sizer是wxpython提供的窗口部件。是容器部件,可以用于存放其他窗口部件

"""

panel = wx.Panel(self)

sizer = wx.BoxSizer(wx.VERTICAL)

panel.SetSizer(sizer)

txt = wx.StaticText(panel,-1,"Hello World!") #创建静态文本组件

sizer.Add(txt,0,wx.TOP|wx.LEFT,100)

self.Center() #将窗口放在桌面环境的中间

app = wx.App()

8f900a89c6347c561fdf2122f13be562.png View Code

frame = MyFrame(None) #为顶级窗口

frame.Show(True)

app.MainLoop()

48304ba5e6f9fe08f3fa1abda7d326ab.png

补充: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实现。

8f900a89c6347c561fdf2122f13be562.png App子类的使用

其中OnInit方法中是必须的,其将会在事件循环处理之前被系统调用。同样的在事件结束之后调用的方法也存在(OnExit)

两个方法是相对的。例如:开启数据库和断开数据库

窗口组成:

前面的代码中窗口和应用程序似乎没有关联,为什么?

在应用程序对象中,可以通过SetTopWindow方法来设置根窗口。若是没有设置,是因为应用程序会选择窗口列表中的第一个作为根窗口。上面的程序也只有一个窗口,所以没有必要去显示设置。同样使用SetTopWindow也可以改变根窗口

控件的部分构造参数:

参数

说明

parent

父窗口(为None代表为顶级窗口),注意设置父窗口后,在父窗口关闭时,子窗口也会消失

id

上面说过了

title

标题

pos

相对于屏幕的位置默认(-1,-1),自行选择。我们在上面使用center也可以改变窗口在屏幕中的位置

size

大小默认(-1,-1)窗口系统自行选择

style

窗口类型...

name

窗口的内在名字

style风格:

1b64df8c007646fd7df2b9b60cfe6c7b.png

8f900a89c6347c561fdf2122f13be562.png 所有支持的事件类型(上百个)

一个事件是wx.Event类或其子类的一个实例。

事件的绑定和处理:通过使用wx.EvtHandler类中的Bind方法可以将绑定事件的类型,事件对象和事件处理函数关联起来

8f900a89c6347c561fdf2122f13be562.png def Bind(self, event, handler, source=None, id=-1, id2=-1)

8f900a89c6347c561fdf2122f13be562.png 事件绑定和处理的演示

8f900a89c6347c561fdf2122f13be562.png 为一个控件绑定多个事件

补充:

在上面我们使用两种方法为Button按钮绑定了事件。有什么区别?

1.self.Bind(wx.EVT_BUTTON,self.OnClick,self.btn)  #点击事件

2.self.btn.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow) #绑定鼠标进入事件

方式一:是是由父控件为子控件绑定的事件

方式二:是使用控件自己绑定事件

那么两者有何不同,可以混用吗

# self.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow,self.btn)

self.btn.Bind(wx.EVT_BUTTON,self.OnClick)

答案是:父类去绑定其他事件是不允许的,错误的,会导致父控件为其绑定的所有事件失效。而子类是可以绑定所有的相关事件的。

查看事件对象:

48304ba5e6f9fe08f3fa1abda7d326ab.png

EVT_控件名 = wx.pyEventBinder( wxEVT_BUTTON, exceptedIDs)  exceptedIDs默认为0,这类控件几乎都不为0,自己有定义

EVT_BUTTON = wx.PyEventBinder( wxEVT_BUTTON, 1)

EVT_CHECKBOX = wx.PyEventBinder( wxEVT_CHECKBOX, 1)

EVT_CHOICE = wx.PyEventBinder( wxEVT_CHOICE, 1)

EVT_LISTBOX = wx.PyEventBinder( wxEVT_LISTBOX, 1)

EVT_LISTBOX_DCLICK = wx.PyEventBinder( wxEVT_LISTBOX_DCLICK, 1)

EVT_MENU = wx.PyEventBinder( wxEVT_MENU, 1)

EVT_MENU_RANGE = wx.PyEventBinder( wxEVT_MENU, 2)

EVT_SLIDER = wx.PyEventBinder( wxEVT_SLIDER, 1)

EVT_RADIOBOX = wx.PyEventBinder( wxEVT_RADIOBOX, 1)

EVT_RADIOBUTTON = wx.PyEventBinder( wxEVT_RADIOBUTTON, 1)

............

48304ba5e6f9fe08f3fa1abda7d326ab.png

这一类事件都是对应控件去响应的,也就是说父类中包含这些控件的话,可以对其直接绑定这些基础事件响应。

所以说:要想使用父控件对子控件绑定事件:事件必须满足 EVT_控件名 相对应

事件中的Skip:

48304ba5e6f9fe08f3fa1abda7d326ab.png

self.btn.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow) #绑定鼠标进入事件

self.btn.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow2) #绑定鼠标进入事件2

def OnEnterWindow(self,event):

print("鼠标进入")

self.btn.SetLabel("鼠标进入")

def OnEnterWindow2(self,event):

print("鼠标进入2")

self.btn.SetLabel("鼠标进入2")

48304ba5e6f9fe08f3fa1abda7d326ab.png

为同一个控件的同一个事件,绑定两个(多个)处理函数。

其执行结果是只执行了事件处理函数2:原因是因为:一般情况下,窗口部件对象在执行完该事件的一个处理函数,就默认完结了。不会再去处理其他相关的函数。而,事件绑定是从上到下,下面的会覆盖上面的,所以,值执行了处理函数了。

我们要想去执行其他函数,那么就要在正在执行的处理函数后面加上event.Skip(),他会在当前函数返回一个值后去调用下一个处理函数,改变原来的默认行为。

48304ba5e6f9fe08f3fa1abda7d326ab.png

def OnEnterWindow(self,event):

print("鼠标进入")

self.btn.SetLabel("鼠标进入")

# event.Skip()

print(777)

def OnEnterWindow2(self,event):

print("鼠标进入2")

self.btn.SetLabel("鼠标进入2")

event.Skip()

print(6666)

---------------------------------------------------------------------

鼠标进入2

6666

鼠标进入

777

48304ba5e6f9fe08f3fa1abda7d326ab.png

常用组件(简单了解,后面还有):

对话框:

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

非模态对话框

dialog = wx.Dialog(None, title="你点不点", size=(300,200))

dialog.Show()

模态对话框

dialog = wx.Dialog(None, title="你点不点", size=(300,200))

dialog.ShowModel()

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.png

dialog = wx.MessageDialog(None, title="你点不点", size=(300,200))

dialog.ShowModel()

这里MessageDialog中show不会显示

961ddebeb323a10fe0623af514929fc1.png

dialog = wx.TextEntryDialog(None, message="请输入文件名:",caption="文件",value="dasfa")

res = dialog.ShowModal()

工具栏:

8f900a89c6347c561fdf2122f13be562.png 工具栏

Realize() 方法需要被调用,以最终确定工具栏创建

状态栏:

961ddebeb323a10fe0623af514929fc1.png

self.CreateStatusBar()

self.SetStatusText("状态栏信息")

基本组件

1.静态文本框

8f900a89c6347c561fdf2122f13be562.png StaticText和字体的设置Font

2.文本输入框

8f900a89c6347c561fdf2122f13be562.png 文本输入框TextCtrl的设置size()设置-1代表默认

相关参数:

7a6574746233e2242a2346d480de093e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值