首页 > 学院 > 开发设计 > 正文

wxpython,窗口,控件,事件

2019-11-14 09:47:20
字体:
来源:转载
供稿:网友

       介绍一个python的图形化界面,wxpython。

       wxpython是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。

       wxPython是跨平台的。这意味着同一个程序可以不经修改地在多种平台上运行。现今支持的平台有:32/64位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac OS X。

       不扯闲的,使用conda命令安装

       参考文献:https://wiki.wxpython.org/Getting Started,本文翻译了此篇文章的部分内容,加入了自己一些理解,英语好的童鞋直接去这个网址看就好

        没学过python的,需要起码理解python中的模块导入,类与方法声明,继承,等等一些知识。

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

        上第一个例子

        

import wxapp = wx.App(False)frame = wx.Frame(None,wx.ID_ANY,"Hello world")frame.Show(True)app.MainLoop()

         导入wx模块,实例化wx.app,每一个wxpython都是wx.App的一个实例,Fales是说,不要将标准输出和错误重定向到窗口;wx.Frame是顶级窗口。语法是x.Frame(Parent,Id,Title)。(大多数构造函数都是父对象,后跟Id)。wx.ID_ANY使wxWidgets为我们选择一个id。调用show函数,传入True使窗口可视化,最后一行的意思是启动应用程序的MainLoop,其作用是处理事件。

        注意:wx.Window是所有可视元素从中派生的基类(按钮,菜单等),我们通常认为作为一个程序窗口是一个wx.Frame。官方教程说这是一个不幸的混淆,可能使萌新们迷茫。。。可爱的官方教官

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

          ……没毛病,开始下一个例子:

import wxclass MainWindow(wx.Frame):    def __init__(self, parent, title):        wx.Frame.__init__(self, parent, title=title, size=(200,100))        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)        self.CreateStatusBar()         # 准备菜单        filemenu= wx.Menu()        # wx.ID_ABOUT 和 wx.ID_EXIT 是wxWidgets提供的标准id        filemenu.Append(wx.ID_ABOUT, "&About"," Information about this PRogram")        filemenu.AppendSeparator()        filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program")        # 创建菜单栏        menuBar = wx.MenuBar()        menuBar.Append(filemenu,"&File") # 添加filemenu到menuBar         self.SetMenuBar(menuBar)  # 添加menuBar到frame        self.Show(True)app = wx.App(False)frame = MainWindow(None, "Sample editor")app.MainLoop()

         

             使用wx.TextCtrl小部件创建一个文本框。默认情况下,文本框是单行字段,但wx.TE_MULTILINE参数允许输入多行文本。

         由于MyFrame在其__init__方法中运行self.Show(),我们不再需要调用frame.Show()显式

          这里指出一个小的好习惯,就是使用标准id,这有助于wxWidgets知道如何在每个平台中显示小部件,使其看起来更native。          没啥好说的,官方教材有些啰嗦,把代码敲到电脑上,就懂大部分用法了

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

         看一个绑定时间的例子

         提前说一句,python里绑定事件不像java,java写swing程序的时候需要给控件绑定监听器,监听器监听事件触发接下来的动作。但是wxpython与java不同,wxpython是通过调用bind方法,将事件类型,时间触发的方法,控件的引用直接绑定在一起,有点类似于javascript,actionscript里的编写方法(起码编程思想类似)。

         好,点到为止。

         上代码:

import wxclass MainWindow(wx.Frame):    def __init__(self, parent, title):        wx.Frame.__init__(self, parent, title=title, size=(200,100))        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)        self.CreateStatusBar()         # 准备菜单
        filemenu= wx.Menu() # wx.ID_ABOUT 和 wx.ID_EXIT 是wxWidgets提供的标准id menuAbout = filemenu.Append(wx.ID_ABOUT, "&About"," Information about this program") menuExit = filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program") # 创建菜单栏 menuBar = wx.MenuBar() menuBar.Append(filemenu,"&File") self.SetMenuBar(menuBar) # 绑定方法 self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout) self.Bind(wx.EVT_MENU, self.OnExit, menuExit) self.Show(True) def OnAbout(self,e): # wx.OK 是 wxWidgets 中的标准id. dlg = wx.MessageDialog( self, "A small text editor", "About Sample Editor", wx.OK) dlg.ShowModal() dlg.Destroy() # 完成后Destroy掉 def OnExit(self,e): self.Close(True) # 关闭窗口app = wx.App(False)frame = MainWindow(None, "Sample editor")app.MainLoop()

         

               bind方法的意思是,某控件发生wx.EVT_MENU事件后,调用onabout方法。

          其他的没什么好说的,但是官方教材中,给出了这样一个代码片段:

def OnButtonClick(self, event):    if (some_condition):        do_something()    else:        event.Skip()def OnEvent(self, event):    ...

         

            event.Skip()方法可以跳过事件的执行。当发生按钮单击事件时,将调用OnButtonClick方法。如果some_condition为true,我们do_something()否则我们让事件由更一般的事件处理程序处理。教材说是这种策略可以便于管理事件的层次结构。的确,else后面的内容不写也可以实现相同的效果,但是,人家提供了这样的特点,记住总不会错的。

         况且开发wxpython的人也不完全是在装逼。

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


上一篇:验证二叉查找树

下一篇:操作重载

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表