在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中的map、reduce和filter浅析
Apr 26 Python
python计算文本文件行数的方法
Jul 06 Python
Python用threading实现多线程详解
Feb 03 Python
Python实现PS图像调整颜色梯度效果示例
Jan 25 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
在Django的View中使用asyncio的方法
Jul 12 Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 Python
python 二维矩阵转三维矩阵示例
Nov 30 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
python字典key不能是可以是啥类型
Aug 04 Python
Python爬虫之爬取最新更新的小说网站
May 06 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
PHP中基本符号及使用方法
2010/03/23 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
PHP7 windows支持
2021/03/09 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
学习ExtJS TextField常用方法
2009/10/07 Javascript
JS求平均值的小例子
2013/11/29 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
数控专业个人求职信范文
2014/02/05 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
集中采购方案
2014/06/10 职场文书
邓小平理论心得体会
2014/09/09 职场文书
2014年稽查工作总结
2014/12/20 职场文书
2015年安全月活动总结
2015/03/26 职场文书
水知道答案观后感
2015/06/08 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android