介绍一个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的人也不完全是在装逼。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
新闻热点
疑难解答