在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 相关文章推荐
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
Sep 21 Python
python基础教程之五种数据类型详解
Jan 12 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
python通过实例讲解反射机制
Oct 17 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
wxPython多个窗口的基本结构
Nov 19 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 Python
详解Django配置JWT认证方式
May 09 Python
浅谈python 类方法/静态方法
Sep 18 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
Django路由层如何获取正确的url
Jul 15 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
sony ICF-2010 拆解与改装
2021/03/02 无线电
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
2015/03/19 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
北京奥运官方网站幻灯切换效果flash版打包下载
2008/01/30 Javascript
ext监听事件方法[初级篇]
2008/04/27 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
Python中datetime常用时间处理方法
2015/06/15 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
python在每个字符后添加空格的实例
2018/05/07 Python
Python Series从0开始索引的方法
2018/11/06 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python实现序列化及csv文件读取
2020/01/19 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
小学中秋节活动方案
2014/02/06 职场文书
科长竞聘演讲稿
2014/05/16 职场文书
食品安全汇报材料
2014/08/18 职场文书
检讨书范文
2015/01/27 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书