這篇是使用wxPython 模組去記錄視窗程式設計
目前使用的環境:windows 7、Portable Python 2.7.6.1、wxPython 3.0請參考下面的範例說明
Graphical User Interface(GUI) 圖形使用者介面
通常來講,一個視窗的組成類似積木的堆疊,主要包括「Frame」(框架)、「Panel」(面板)、「Controls」(控制項)
三個主要部分。以下以 Windows 內建的「超級終端機」為例,來說明視窗的各主要零件。
視窗 的底層畫板-Frame(框架)
Frame 是一個視窗的最底層,所有的視窗元件都是建構在 Frame 裡面,而一般常見的 Frame 中,會有「MenuBar」(選單列)、「ToolBar」(工具列)、「StatusBar」(狀態列)和「Panel」(面版)。以下簡單說明各個部分。
-
MenuBar(選單列):為下拉式選單,通常所有應用程式的功能,都可在選單列中找到。
-
ToolBar(工具列):將各種常用的功能,以圖示的方式展現出來,方便取用。
-
StatusBar(狀態列):用來顯示應用程式的狀態訊息。
-
Panel(面板):用來配置視窗操作時,需要使用的各種 Controls(控制項)。
組合 各種元素的畫布-Panel(面板)
前面提到,Panel 是用來放置各種 Controls(控制項)的地方。
而 Controls(控制項)指的就是各種視窗控制項,像這裡看到的有「Button(按鈕)」、「TextCtrl(文字方塊)」。
原料 -Controls(控制項)
Controls(控制項)除了前面提到的 Button(按鈕)、TextCtrl(文字方塊)以外,還包括許多大家常見的元件。
Button (按鈕)
TextCtrl (文字方塊控制項)
CheckBox (核取方塊控制項)
StaticText (靜態文字控制項)
ListBox (清單控制項)
RadioBox (選取按鈕控制項)
#---------------------------------------------------
第一個Hello World 的視窗程式設計-1
# -*- coding: big5 -*-
import wx
class MyApp(wx.App):
def OnInit(self):
frame=wx.Frame(parent=None,title="早安Hello,wxPython!",size=(320,240))
frame.Show()
return True
app=MyApp()
app.MainLoop()
(1)#建立 MyApp類別並繼承wx.App類別
(2)#overload OnInit函數,OnInit是視窗初始化的一部份
(3)#並且建立一個wx.Frame,parent預設為None;如果不為None則Frame會一直在最上層視窗
#另外設定frame的t視窗標題title,視窗的長寬size
(4)#顯示視窗
(5)#通常在OnInit函數的回傳值是True
(6) #執行主程式
#----------------------------------------
第一個Hello World 的視窗程式設計-2
#<path_to_python>
# -*- coding: big5 -*-
import wx
app = wx.App(False) # Create a new app, don't redirect stdout/stderr to a window.
frame = wx.Frame(None, wx.ID_ANY, "Hello World") # A Frame is a top-level window.
frame.Show(True) # Show the frame.
app.MainLoop()
#-------------------------
第二個程式在表單(frame)裡面加入文字檔
注意: 每個視窗都有一個確認ID,而這個ID有三種方式給與
(1) 系統自動給與 (設定為-1)
(2) 使用wx標準的ID,例如: wx.ID_ANY, wx.ID_CANCEL
, wx.ID_DELETE
, wx.ID_SAVE
, wx.ID_EXIT
, wx.ID_STOP
, and wx.ID_NEW
(3)利用wx.NewId()得到自己的ID
# -*- coding: big5 -*-
import wx
class HelloFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "HelloFrame", size=(200, 100))
panel = wx.Panel(self, -1) #初始化frame
wx.StaticText(panel, -1, "Hello World", pos=(60, 25)) #設定文字
if __name__ == '__main__':
app = wx.PySimpleApp() #建立simple app
frame = HelloFrame() #產生自訂frame
frame.Show(True) #顯示frame
app.MainLoop() #執行app
class:定義一個Hello Frame class,它繼承wx.Frame
def:定義函數
__init__:建構函數/初始化
wx.Frame:__init__是wx.Frame初始化/建構的動作,需要傳入parent、id、title、pos、size、style、name等參數。
parent:當前視窗的父視窗。如果當前視窗是top-level window的話,則parent=None,如果不是,則值為所屬frame的名字。
id:視窗編號。預設為-1,則係統自動給他分配一個編號1。
title:視窗標題,即Caption。預設為空字串。
pos:視窗位置坐標。預設為(-1,-1),位置由系統決定。
size:視窗大小。預設為(-1,-1),大小由系統決定。
style:視窗樣式。預設為DEFAULT_FRAME_STYLE。
name:視窗名稱。
wx.Panel:面板是最基本的界面工具集合,用來在視窗中用來配置其他Widgets,相同於wx.Frame都需要給個id,在此使用-1,讓系統分配編號。
wx,StaticText:靜態文字
app = wx.PySimpleApp是建立起動應用程式。
frame = HelloFrame()是建立我們所自訂的視窗框架。
frame.Show:顯示視窗
app.MainLoop:執行應用程式。
#----------------------------
第三個程式在表單(frame)裡面加入按鈕與設定事件處理
# -*- coding: big5 -*-
#-------------------------------------------------------------------------------
# Author: Stanley
#-------------------------------------------------------------------------------
import wx
class MyApp(wx.App):
def OnInit(self):
frame=wx.Frame(parent=None,title="按鈕視窗",pos=(100,150),size=(320,240))
frame.Show()
self.SetTopWindow(frame)
return True
class MyFrame(wx.Frame):
def __init__(self,title,pos,size):
wx.Frame.__init__(self,None,-1,title,pos,size)
panel=wx.Panel(self)
button=wx.Button(panel,label="按鈕1",pos=(25,25),size=(60,25))
self.Bind(wx.EVT_CLOSE,self.OnCloseWin)
self.Bind(wx.EVT_BUTTON,self.OnClick,button)
def OnClick(self,event):
wx.MessageBox("你按了按鈕","提示訊息")
def OnCloseWin(self,event):
dlg=wx.MessageDialog(None,"確定要關閉程式?","提示訊息",wx.YES_NO)
if dlg.ShowModal()==wx.ID_YES:
self.Destroy()
def main():
app=MyApp()
app.MainLoop()
if __name__=="__main__":
main()
#新增一個panel
#新增一個按鈕並把它加到panel裡面
#建立事件監聽
#按鈕關閉
#按鈕按下
#定義按鈕按下的函數
def OnClick(self,event):
wx.MessageBox("你按了按鈕","提示訊息")
#定義按下關閉視窗(右上X)的函數
def OnCloseWin(self,event):
dlg=wx.MessageDialog(None,"確定要關閉程式?","提示訊息",wx.YES_NO)
#按下YES才會關閉視窗
第四個程式在表單(frame)裡面加入配置視窗元件
# -*- coding: big5 -*-
#-------------------------------------------------------------------------------
# Author: Stanley
#-------------------------------------------------------------------------------
import wx,string
class MySalgar(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, title=u"薪資試算程式", size=(250,200))
panel = wx.Panel(self)
#配置視窗元件 -- 開始 --
wx.StaticText(parent=panel,label=u"工作幾年?",pos=(10,10))
self.a = wx.TextCtrl(parent=panel,pos=(100,10))
wx.StaticText(parent=panel,label=u"一個月多少錢?",pos=(10,50))
self.b = wx.TextCtrl(parent=panel,pos=(100,50))
self.btn = wx.Button(parent=panel,label=u"結算薪資",pos=(10,100))
self.message1 = wx.StaticText(parent=panel,pos=(10,130))
self.message2 = wx.StaticText(parent=panel,pos=(10,150))
#配置視窗元件 -- 結束 --
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = MySalgar()
frame.Show()
app.MainLoop()
第五個程式在表單(frame)裡面加入配置視窗元件與設定事件處理
# -*- coding: big5 -*-
#-------------------------------------------------------------------------------
# Author: Stanley
#-------------------------------------------------------------------------------
import wx,string
class MySalgar(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,parent=None,title=u"薪資試算程式",size=(250,200))
panel = wx.Panel(self)
wx.StaticText(parent=panel,label=u"工作幾年?",pos=(10,10))
self.a = wx.TextCtrl(parent=panel,pos=(100,10))
wx.StaticText(parent=panel,label=u"一個月多少錢?",pos=(10,50))
self.b = wx.TextCtrl(parent=panel,pos=(100,50))
self.btn = wx.Button(parent=panel,label=u"結算薪資",pos=(10,100))
#新增 BtnClick 事件 -- 開始 --
self.Bind(wx.EVT_BUTTON,self.BtnClick,self.btn)
#新增 BtnClick 事件 -- 結束 --
self.message1 = wx.StaticText(parent=panel,pos=(10,130))
self.message2 = wx.StaticText(parent=panel,pos=(10,150))
#撰寫 BtnClick 事件函式 -- 開始 --
def BtnClick(self,event):
a = self.a.GetValue()
a = string.atoi(a)
b = self.b.GetValue()
b = string.atoi(b)
c = b * 12 * a
d = c /(365 * a)
message1Str = u'您工作 '+str(a)+u' 年可以獲得 '+str(c)+u' 元'
message2Str = u'平均每日獲得 '+str(d)+u' 元'
self.message1.SetLabel(message1Str)
self.message2.SetLabel(message2Str)
#撰寫 BtnClick 事件函式 -- 結束 --
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = MySalgar()
frame.Show()
app.MainLoop()
有這5個根本程式架構,讀者就可以依文件上的元件說明開發自己的專案程式。