在Ubuntu系统下安装使用Python的GUI工具wxPython


Posted in Python onFebruary 18, 2016

(一)wxpython的安装

    Ubuntu下的安装,还是比较简单的。

#使用:apt-cache search wxpython 测试一下,可以看到相关信息
dizzy@dizzy-pc:~/Python$ apt-cache search wxpython
cain - simulations of chemical reactions
cain-examples - simulations of chemical reactions
cain-solvers - simulations of chemical reactions
gnumed-client - medical practice management - Client
...
 
#这样的话,直接使用: sudo apt-get install python-wxtools 即可安装
dizzy@dizzy-pc:~/Python$ sudo apt-get install python-wxtools
[sudo] password for dizzy: 
Reading package lists... Done
Building dependency tree 
...

    测试是否安装成功。进入Python,import wx 不报错,即可

dizzy@dizzy-pc:~/Python$ python
Python 2.7.3 (default, Apr 20 2012, 22:44:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import wx
>>>

(二)显示出一个窗口

#!/usr/bin/python
#coding:utf-8
 
import wx
 
def main():
  app = wx.App()
  win = wx.Frame(None)
  win.Show()
  app.MainLoop()
 
if __name__ == '__main__':
  main()
#这便是一个最简单的可视化窗口的实现

(三)添加可视化组建及简单布局

#coding:utf-8
 
import wx
 
def main():
  app = wx.App()
  win = wx.Frame(None,title='NotePad',size=(440,320))
  #很明显,title就是标题,size就是大小
 
  bt_open = wx.Button(win,label='open',pos=(275,2),size=(80,30))
  bt_save = wx.Button(win,label='save',pos=(355,2),size=(80,30))
  #label就是按钮显示的标签,pos是控件左上角的相对位置,size就是控件的绝对大小
 
  text_title = wx.TextCtrl(win,pos=(5,2),size=(265,30))
  text_content = wx.TextCtrl(win,pos=(5,34),size=(430,276),style=wx.TE_MULTILINE|wx.HSCROLL)
  #style样式,wx.TE_MULTILINE使其能够多行输入,wx.HSCROOL使其具有水平滚动条
 
  win.Show()
  app.MainLoop()
 
if __name__ == '__main__':
  main()
 
#做过桌面软件开发的,对这个肯定很熟悉。
#由于之前学过一点VB,VC,Delphi等,学起来感觉很简单。
#将wx提供的控件添加到某个Frame上,并进行各自的属性设置即可完成
#由于文本控件的size属性,设置的为绝对值。这样就会有一些问题......

(四)界面布局管理

    由于之前的控件直接绑定在Frame上,这样会有一些问题。下面将使用Panel面板进行管理。

## 当然,之前说将各种控件的位置都写成绝对位置和大小,会有一些问题。这是不对的
## 有时需要动态布局,而有时则需要静态布局
 
import wx
 
def main():
  #创建App
  app = wx.App()
  #创建Frame
  win = wx.Frame(None,title='NotePad',size=(440,320))
  win.Show()
  #创建Panel
  panel = wx.Panel(win)
  #创建open,save按钮
  bt_open = wx.Button(panel,label='open')
  bt_save = wx.Button(panel,label='save')
  #创建文本框,文本域
  text_filename = wx.TextCtrl(panel)
  text_contents = wx.TextCtrl(panel,style=wx.TE_MULTILINE|wx.HSCROLL)
 
  #添加布局管理器
  bsizer_top = wx.BoxSizer()
  bsizer_top.Add(text_filename,proportion=1,flag=wx.EXPAND)
  bsizer_top.Add(bt_open,proportion=0,flag=wx.LEFT,border=5)
  bsizer_top.Add(bt_save,proportion=0,flag=wx.LEFT,border=5)
 
  bsizer_all = wx.BoxSizer(wx.VERTICAL)
    #wx.VERTICAL 横向分割
  bsizer_all.Add(bsizer_top,proportion=0,flag=wx.EXPAND|wx.LEFT,border=5)
  bsizer_all.Add(text_contents,proportion=1,flag=wx.EXPAND|wx.ALL,border=5)
 
  panel.SetSizer(bsizer_all)
 
  app.MainLoop()
 
if __name__ == '__main__':
  main()
 
#这个是动态布局。当然这只是一个视图而已。
#这只是个表面而已,灵魂不在此!

(五)添加控件的事件处理

    直接上代码。

#!/usr/bin/python
#coding:utf-8
 
import wx
 
def openfile(evt):
  filepath = text_filename.GetValue()
  fopen = file(filepath)
  fcontent = fopen.read()
  text_contents.SetValue(fcontent)
  fopen.close()
 
def savefile(evt):
  filepath = text_filename.GetValue()
  filecontents = text_contents.GetValue()
  fopen = file(filepath,'w')
  fopen.write(filecontents)
  fopen.close()
 
app = wx.App()
#创建Frame
win = wx.Frame(None,title='NotePad',size=(440,320))
#创建Panel
panel = wx.Panel(win)
#创建open,save按钮
bt_open = wx.Button(panel,label='open')
bt_open.Bind(wx.EVT_BUTTON,openfile) #添加open按钮事件绑定,openfile()函数处理
bt_save = wx.Button(panel,label='save')
bt_save.Bind(wx.EVT_BUTTON,savefile) #添加save按钮事件绑定,savefile()函数处理
#创建文本框,文本域
text_filename = wx.TextCtrl(panel)
text_contents = wx.TextCtrl(panel,style=wx.TE_MULTILINE|wx.HSCROLL)
#添加布局管理器
bsizer_top = wx.BoxSizer()
bsizer_top.Add(text_filename,proportion=1,flag=wx.EXPAND,border=5)
bsizer_top.Add(bt_open,proportion=0,flag=wx.LEFT,border=5)
bsizer_top.Add(bt_save,proportion=0,flag=wx.LEFT,border=5)
 
bsizer_all = wx.BoxSizer(wx.VERTICAL)
bsizer_all.Add(bsizer_top,proportion=0,flag=wx.EXPAND|wx.LEFT,border=5)
bsizer_all.Add(text_contents,proportion=1,flag=wx.EXPAND|wx.ALL,border=5)
 
panel.SetSizer(bsizer_all)
 
win.Show()
app.MainLoop()
                             47,0-1    Bot
 
#######################################################
#   打开,保存功能基本实现,但还存在很多bug。    #
#   怎么也算自己的第二个Python小程序吧!!     #  
###########################################################################

(六)ListCtrl列表控件的使用示例
ListCtrl这个控件比较强大,是我比较喜欢使用的控件之一。
下面是list_report.py中提供的简单用法:

import wx
import sys, glob, random
import data

class DemoFrame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, None, -1,
             "wx.ListCtrl in wx.LC_REPORT mode",
             size=(600,400))

    il = wx.ImageList(16,16, True)
    for name in glob.glob("smicon??.png"):
      bmp = wx.Bitmap(name, wx.BITMAP_TYPE_PNG)
      il_max = il.Add(bmp)
    self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
    self.list.AssignImageList(il, wx.IMAGE_LIST_SMALL)

    # Add some columns
    for col, text in enumerate(data.columns):
      self.list.InsertColumn(col, text)

    # add the rows
    for item in data.rows:
      index = self.list.InsertStringItem(sys.maxint, item[0])
      for col, text in enumerate(item[1:]):
        self.list.SetStringItem(index, col+1, text)

      # give each item a random image
      img = random.randint(0, il_max)
      self.list.SetItemImage(index, img, img)
        
    # set the width of the columns in various ways
    self.list.SetColumnWidth(0, 120)
    self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
    self.list.SetColumnWidth(2, wx.LIST_AUTOSIZE)
    self.list.SetColumnWidth(3, wx.LIST_AUTOSIZE_USEHEADER)


app = wx.PySimpleApp()
frame = DemoFrame()
frame.Show()
app.MainLoop()

 

如何获取选中的项目?
 最常用的方法就是获取选中的第一项:GetFirstSelected(),这个函数返回一个int,即ListCtrl中的项(Item)的ID。

 还有一个方法是:GetNextSelected(itemid),获取指定的itemid之后的第一个被选中的项,同样也是返回itemid。

 通过这两个方法,我们就可以遍历所有选中的项了。

Python 相关文章推荐
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
python实现简单多人聊天室
Dec 11 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
python统计指定目录内文件的代码行数
Sep 19 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
python字符串常规操作大全
May 02 Python
以一个投票程序的实例来讲解Python的Django框架使用
Feb 18 #Python
使用Python生成随机密码的示例分享
Feb 18 #Python
使用Python的urllib2模块处理url和图片的技巧两则
Feb 18 #Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
Feb 18 #Python
使用Python的PIL模块来进行图片对比
Feb 18 #Python
使用Python来编写HTTP服务器的超级指南
Feb 18 #Python
python装饰器与递归算法详解
Feb 18 #Python
You might like
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
Laravel 实现密码重置功能
2018/02/23 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
AngularJs每天学习之总体介绍
2017/08/07 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
python中time库的实例使用方法
2019/10/31 Python
详解python破解zip文件密码的方法
2020/01/13 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
新媒传信软件测试面试题
2013/02/24 面试题
大学校庆邀请函
2014/01/11 职场文书
求职信格式要求
2014/05/23 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
优秀班集体申报材料
2014/12/25 职场文书
致运动员赞词
2015/07/22 职场文书
《折线统计图》教学反思
2016/02/22 职场文书