Pages - Menu

2020年6月30日 星期二

[PYTHON]PYTHON 初學體驗 GUI :wxPython

前言

最近看了一個影片,寫到超速學習
先定好目標,從終點看向起點,鎖定所需要的知識,直接學習。
省略過程中非必要的技能,為了使用而非只是初步認識。
再來使用連貫法,當發現某個地方卡住,去修復問題時,發現更基本的問題,再去解決。

其實python的GUI還蠻多套的,
從TKinter、PyQT、wxPython…
這次打算套用剛剛講的超速學習,直接設定目標,開始做,過程中的問題在一一尋找修復。



正文


這次還是用ATOM來做,相關的設定,請看ATOM初學PYTHON 環境設定
套件部分,使用pip install wxpython 安裝。
直接上Code再來逐筆確認所學的知識庫內,是否能夠認識程式碼。

import wx
def main():
    app = wx.App()
    frame = wx.Frame(
        parent=None,
        id=wx.ID_ANY,
        title='Hello'
    )
    frame.Show()
    # 產生字型設定
    font = wx.Font(wx.FontInfo(10).FaceName('Consolas'))
    # 建立文字元件
    label = wx.StaticText(
        parent=frame,
         label='People',
        pos=wx.Point(10, 13),
        size=wx.Size(50, 20)
    )
    # 套用字型
    label.SetFont(font)
    # 產生按鈕元件
    button = wx.Button(
        parent=frame,
        id=wx.ID_ANY,
        label='Say',
        pos=wx.Point(70, 10),
        size=wx.Size(100, 22)
    )
    # 套用字型
    button.SetFont(font)

    # 綁定按鈕點擊事件
    # button.Bind(wx.EVT_BUTTON, lambda _: input.SetValue(f'Hello {random.randint(10,100)}'))
    def onClick(event):
        input.SetValue('Hello World!!')
    button.Bind(wx.EVT_BUTTON,onClick)
    # 產生輸入元件
    input = wx.TextCtrl(
        parent=frame,
        id=wx.ID_ANY,
        value='Hello',
        pos=wx.Point(180, 10),
        size=wx.Size(100, 22)
    )
    # 套用字型
    input.SetFont(font)
    # 綁定文字變動事件
    input.Bind(wx.EVT_TEXT, lambda e: textarea.AppendText(f'text changed: {input.GetValue()}\n'))
    # 產生輸入元件
    textarea = wx.TextCtrl(
        parent=frame,
        id=wx.ID_ANY,
         style=wx.TE_MULTILINE,
        pos=wx.Point(10, 40),
         size=wx.Size(270, 150)
    )
    # 套用字型
    textarea.SetFont(font)
    # 設為唯讀
    textarea.SetEditable(False)
    app.MainLoop()

if __name__ == '__main__':
    main()

這邊有99%的程式都是從連結 Day-13 視窗程式:使用 wxPython 抄來的。
從上面開始大部分是設定的東西,
但如果去看別人寫的很多都是在初始化的時候設定元件。
所以跟這個會不太一樣。

1.綁定事件

button.Bind(wx.EVT_BUTTON, lambda _: input.SetValue(f'Hello {random.randint(10,100)}'))

他這邊的程式是單純顯示hello 加上亂數,
但如果今天程式碼很多,要另外拉出一個函數怎麼做?

def onClick(event):
    input.SetValue('Hello World!!')
button.Bind(wx.EVT_BUTTON,onClick)

記得將函數定義在綁定事件的上面,不然會發生錯誤
UnboundLocalError: local variable 'onClick' referenced before assignment

ref.wxPython 按鈕

2.字串格式化
f是什麼,為什麼在setValue的後面要加上f?
python3.6後才能使用,可直接使用變數取代。
最早是用%來格式化字串,後期也有使用 { } 大括號來塞資料

print("hello %s " % "world" )
print("{0} is win {1}".format('hello','world'))
print("{name} is win {year}".format(name='hello',year='world'))
print("{0}","xyz")

現在直接在前面加f ,裡面的變數用{ } 包起來就好了。

x='hello,world!'
print(f"python 3.6 can use f-string :{x}")

ref.[Python] 字串格式化

3.lambda  是什麼?
labda可以用來做簡單的運算任務,
比較長的話還是要用function比較好。
可搭配filter及map使用

lambda arg1,arg2.. : condition

def max(m,n):
    return m if m> n else n
print(f'max is {max(2,3)}')
max = lambda m,n:m if m>n else n
print(f'max is {max(2,3)}')

ref.lambda 運算式Lambda函式

4.if __name__…
這個記得以前有看過,好像是為了有引入多個py,指定這個是主要的進入點。
__name__是python的只讀內置變量
ref.python自學筆記第三篇:if _ _name_ _ == "_ _main_ _":的理解

再來的目標是,讀取影片的清單檔案,取清單的檔案位置,將其複製到其他的位置。

ref.
Max的程式語言筆記-八款 Python GUI 開發框架
Day-13 視窗程式:使用 wxPython
wxPython: How to bind the button?
wxPython事件處理
wx.Button

沒有留言:

張貼留言