python入門系列19―——GUI wxpython入門

歡迎前往個人我的博客
php


使用Python也能夠編寫圖形用戶界面python

wxpython是一個第三方的庫,能夠編寫任意複雜的界面,很是好用windows

首先須要下載:app

https://wxpython.org/download.php,選擇對應的版本和32/64系統,windows直接安裝便可。
框架


安裝完成後,咱們就能夠開始第一個練習:ide

#引入wx模塊
import wx
app = wx.App()
app.MainLoop()
沒有反應,由於沒有任何用戶交互窗口,因此程序會馬上退出。

因此咱們須要一個框架,它是wx.Frame類的實例。wx框架中的部件都是由它們的父類部件做爲構造函數的第一個參數建立的。函數

若是建立一個單獨的窗口,使用None便可,而且在app.MainLoop前調用窗口的Show才能夠顯示。oop

#引入wx模塊
import wx
app = wx.App()
win=wx.Frame(None)
win.Show()
app.MainLoop()
顯示一個窗口了,可是沒有任何信息。

若是想增長一個按鈕,只須要使用win做爲參數,實例化wx.Button便可:
佈局

下面咱們就來添加標籤和標題:ui

import wx
app = wx.App()
win=wx.Frame(None,title="hello wxPython")
button1 = wx.Button(win,label="button1")
button2 = wx.Button(win,label="button2")
win.Show()
app.MainLoop()
咱們會看到,只顯示了button1這個按鈕,button2由於跟button1在同一個位置被擋住了,不信能夠更換下button1和button2的位置看下。

固然咱們不但願擋住,因此須要設置按鈕的位置:

import wx
app = wx.App()
win=wx.Frame(None,title="hello wxPython")
button1 = wx.Button(win,label="button1",pos=(0,0),size=(100,30))
button2 = wx.Button(win,label="button2",pos=(0,30),size=(100,30))
#pos表示座標,左上是0,0。 size表示寬高
win.Show()
app.MainLoop()
咱們再看看文本控件:

import wx
app = wx.App()
win=wx.Frame(None,title="hello wxPython")
button1 = wx.Button(win,label="button1",pos=(0,0),size=(100,30))
button2 = wx.Button(win,label="button2",pos=(0,30),size=(100,30))
#pos表示座標,左上是0,0。 size表示寬高
text1=wx.TextCtrl(win,pos=(0,60),size=(200,40))#建立一個文本
#建立一個多行帶滾動條的文本
text2=wx.TextCtrl(win,pos=(0,100),size=(200,200),style=wx.TE_MULTILINE|wx.HSCROLL)
win.Show()
app.MainLoop()
到如今爲止,按鈕點擊尚未任何效果,所以咱們要綁定事件:

button1.Bind(wx.EVT_BUTTON,changeText)
changeText是一個函數,須要咱們實現點擊後的效果,我這裏設置成點擊button1在text1文本輸出hello python:

def changeText(event):
    text1.SetValue("hello python")
咱們來看下完整代碼:

import wx

def changeText(event):
    text1.SetValue("hello python")

app = wx.App()
win=wx.Frame(None,title="hello wxPython")
button1 = wx.Button(win,label="button1",pos=(0,0),size=(100,30))
button2 = wx.Button(win,label="button2",pos=(0,30),size=(100,30))
button1.Bind(wx.EVT_BUTTON,changeText)
#pos表示座標,左上是0,0。 size表示寬高
text1=wx.TextCtrl(win,pos=(0,60),size=(200,40))#建立一個文本
#建立一個多行帶滾動條的文本
text2=wx.TextCtrl(win,pos=(0,100),size=(200,200),style=wx.TE_MULTILINE|wx.HSCROLL)
win.Show()
app.MainLoop()

若是咱們想實現一個複雜的功能,包括控件的佈局都須要本身設置,也是很麻煩的。
這個時候咱們可使用所見即所得的圖形用戶界面生成器wxFormBuilder。
下載地址: https://sourceforge.net/projects/wxformbuilder/
下載wxFormBuilder_v3.5.1-rc1.exe自動安裝便可

打開進行以下操做:



複製到python的IDLE中,咱們還須要作以下修改:

def changetext( self, event ):
		event.Skip()
須要改爲
def changetext( self, event ):
		self.m_textCtrl2.SetValue("hello python")
而後實現窗口顯示:

app=wx.App()
win=MyFrame2(None)
win.Show()
app.MainLoop()
就能夠看到跟以前同樣的功能,點擊按鈕,在下面的文本中顯示hello python

完成代碼以下:

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

###########################################################################
## Class MyFrame2
###########################################################################

class MyFrame2 ( wx.Frame ):
	
	def __init__( self, parent ):
		wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
		
		self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
		
		bSizer2 = wx.BoxSizer( wx.VERTICAL )
		
		self.m_button3 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
		bSizer2.Add( self.m_button3, 0, wx.ALL, 5 )
		
		self.m_textCtrl2 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
		bSizer2.Add( self.m_textCtrl2, 0, wx.ALL, 5 )
		
		
		self.SetSizer( bSizer2 )
		self.Layout()
		
		self.Centre( wx.BOTH )
		
		# Connect Events
		self.m_button3.Bind( wx.EVT_BUTTON, self.changetext )
	
	def __del__( self ):
		pass
	
	
	# Virtual event handlers, overide them in your derived class
	def changetext( self, event ):
		self.m_textCtrl2.SetValue("hello python")
	

app=wx.App()
win=MyFrame2(None)
win.Show()
app.MainLoop()