close

這篇是使用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個根本程式架構,讀者就可以依文件上的元件說明開發自己的專案程式。

回主目錄

 

 

 

  •  
  •  
  •  

 

 

  •  
arrow
arrow

    stanley 發表在 痞客邦 留言(0) 人氣()