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