Python 圖形程序入門
課程概要:
1、wxPython 介紹與安裝
2、基本控件介紹與絕對布局
3、控件相對布局
4、多線程與事件
一、wxPython 介紹與安裝
◆ wxPython 介紹
◆ wxPython VS PyQt
◆ wxPython 安裝
wxPython 介紹
◆ wxPython 是wxWidgets在Python語言下的封裝.
◆ wxWidgets是一個跨平臺的GUI應用編程接口,使用C++編寫。
◆ 所想即所得,缺乏成熟的IDE.
◆ 圖形界面風格與系統的風格相似。wxPython VS PyQt
為什么選擇wxPython而不是pyQt?
◆ 協議
◆ 編碼風格
◆ 復雜性
◆ 個人習慣wxPython 安裝
◆ 官方網站:http://www.wxpython.org/
◆ 下載鏈接:http://www.wxpython.org/download.php#msw/
◆ 安裝程序自動尋找Python的位置,基本一路下一步
注:python(x, y)已經包含了wxPython
參考資料:http://wiki.wxpython.org/
圖下界面:http://wiki.wxpython.org/SizerTutorials
二、基本控件介紹與絕對布局
◆ 基本控件介紹
◆ 絕對布局
基本控件介紹
靜態文本:wx.StaticText
文本域:wx.TextCtrl
按鈕:wx.Button
單選與復選按鈕:wx.CheckBox/wx.RadioButton
列表框:wx.ListBox
圖片:wx.StaticBitmap絕對布局
◆ 基于控件的坐標擺放空間
◆ 簡單直觀
◆ 方法單一
◆ 不能隨窗口的改變而調整位置
相關代碼:絕對布局(cx1_2_1.py)
# -*-coding:utf8 -*-
# cx1_2_1.py
import wx
'''堆砌各個控件,基于坐標位置的控件絕對布局'''
class Example2(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, id=-1,
title="Hello world", size=(600,600))
panel=wx.Panel(self,-1) # 沒有panel,frame的框架背景是灰色的;加了panel后,變成淺白色
self.Centre() # 使窗口居中
# 左上角為(0, 0),size 默認為字符串長度和高度
button=wx.Button(panel, label=u"我是按鈕", pos=(20, 0), size=(100,100))
statictext=wx.StaticText(panel, -1, u"我是不能被編輯的文本", pos=(20,100))
text=wx.TextCtrl(panel, -1, u"輸入文本", pos=(200,210))
password=wx.TextCtrl(panel, -1, u"輸入密碼",
style=wx.TE_PASSWORD, pos=(200,250))
mutiText=wx.TextCtrl(panel, -1, u'輸入多行\n文本',
style=wx.TE_MULTILINE, pos=(100,300))
checkBox1=wx.CheckBox(panel, -1, u"我是復選框1", pos=(150,20))
checkBox2=wx.CheckBox(panel, -1, u"我是復選框2", pos=(150,40))
# 所有放到panel 上的按鈕只能選擇一個
radio1=wx.RadioButton(panel, -1, u"我是單選按鈕1", pos=(150,60),
style=wx.RB_GROUP)
radio2=wx.RadioButton(panel, -1, u"我是單選按鈕2", pos=(150,80))
radio3=wx.RadioButton(panel, -1, u"我是單選按鈕3", pos=(150,100))
# RadioBox 單選按鈕框
# wx.RA_SPECIFY_ROWS 列優先排
# wx.RA_SPECIFY_COLS 行優先排
radioList=[u'一組單選按鈕1', u'一組單選按鈕2', u'一組單選按鈕3']
wx.RadioBox(panel, -1, u"一組單選按鈕", (10, 120), wx.DefaultSize,
radioList, 2, wx.RA_SPECIFY_ROWS) # 2 表示兩行
## wx.RadioBox(panel, -1, u"一組單選按鈕", (10, 120), wx.DefaultSize, radioList, 2, wx.RA_SPECIFY_COLS) # 2 表示兩列
# 列表框
# style=wx.LB_SINGLE 選擇一個
# style=wx.LB_MULTIPLE 選擇多個
jikexueyuan=[u'極', u'客', u'學', u'院', '1', '2', '3', '4', '5', '6']
listBox=wx.ListBox(panel, -1, pos=(300,20), size=(100, 100),
choices=jikexueyuan, style=wx.LB_MULTIPLE)
## listBox=wx.ListBox(panel, -1, pos=(300,20), size=(100, 100), choices=jikexueyuan, style=wx.LB_SINGLE)
# 圖像
# wx.BITMAP_TYPE_ANY 表示任何類型的圖片,ANY 可以換成JPG或者PNG
# Scale(200,200) 設置圖片的大小
img= wx.Image(r'logo.jpg', wx.BITMAP_TYPE_ANY).Scale(200,200)
sb1=wx.StaticBitmap(panel, -1,wx.BitmapFromImage(img), pos=(300, 300))
if __name__== "__main__":
app=wx.App() # 圖形界面的通用入口
frame=Example2()
frame.Show()
app.MainLoop()
三、控件相對布局
◆ BoxSizer 管理布局
◆ GridSizer 管理布局
◆ FlexGridSizer 管理布局
◆ GridBagSizer 管理布局
- BoxSizer 管理布局(相關代碼:cx1_3_1.py)
一行一列,可以選擇行擴展或者列擴展
#-*-coding:utf8-*-
# cx1_3_1.py
import wx
'''基于Sizer的控件相對布局'''
class Example3(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, id=-1, title=u'極客學院', size=(600, 600))
self.panel = wx.Panel(self, -1)
self.Centre()
#定義我們需要的各個控件
commandStatic = wx.StaticText(self.panel, -1, u'輸命令:')
writePyStatic = wx.StaticText(self.panel, -1, u'寫代碼:')
commandText = wx.TextCtrl(self.panel, -1, u'')
writePyText = wx.TextCtrl(self.panel, -1, u'''#-*-coding:utf-8-*-\n#在這些Python代碼''',
style=wx.TE_MULTILINE, size=(300, 200))
send = wx.Button(self.panel, label=u'發送命令')
clear = wx.Button(self.panel, label=u'清空命令')
screen = wx.Button(self.panel, label=u'查看屏幕')
serverList = ['192.168.0.4', '10.19.2.1', '192.168.0.111', '172.26.123.5', '192.168.6.11', '192.99.8.8']
server = wx.ListBox(self.panel, -1, size=(120, 100), choices=serverList, style=wx.LB_SINGLE)
img = wx.Image(r'logo.jpg', wx.BITMAP_TYPE_ANY).Scale(200, 200)
screenBox = wx.StaticBitmap(self.panel, -1, wx.BitmapFromImage(img))
# 基于BoxSizer布局
# HORIZONTAL 水平 VERTICAL 垂直
hBoxAll = wx.BoxSizer(wx.HORIZONTAL)
vBoxControl = wx.BoxSizer(wx.VERTICAL)
hBoxCommand = wx.BoxSizer(wx.HORIZONTAL)
vBoxWrite = wx.BoxSizer(wx.VERTICAL)
hBoxButton = wx.BoxSizer(wx.HORIZONTAL)
# 將commandStatic和commandText添加到hBoxCommand盒子中去
# proportion表示所占比例
# flag=wx.ALL 表示控件四周都有邊框
# wx.EXPAND表示控件隨著盒子的大小而改變
# border=5 表示邊框線大小
hBoxCommand.Add(commandStatic, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
hBoxCommand.Add(commandText, proportion=2, flag=wx.ALL | wx.EXPAND, border=5)
vBoxWrite.Add(writePyStatic, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
vBoxWrite.Add(writePyText, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
vBoxControl.Add(hBoxCommand, proportion=0, flag=wx.ALL, border=5)
vBoxControl.Add(vBoxWrite, proportion=0, flag=wx.ALL, border=5)
hBoxButton.Add(send, proportion=0, flag=wx.ALL, border=5)
hBoxButton.Add(clear, proportion=0, flag=wx.ALL, border=5)
hBoxButton.Add(screen, proportion=0, flag=wx.ALL, border=5)
vBoxControl.Add(hBoxButton, proportion=0, flag=wx.ALL, border=5)
hBoxAll.Add(server, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
hBoxAll.Add(vBoxControl, proportion=2, flag=wx.ALL | wx.EXPAND, border=5)
hBoxAll.Add(screenBox, proportion=3, flag=wx.ALL | wx.EXPAND, border=5)
self.panel.SetSizer(hBoxAll)
hBoxAll.Fit(self)
if __name__ == "__main__":
app = wx.App()
frame = Example3()
frame.Show()
app.MainLoop()
- GridSizer 管理布局(相關代碼:cx1_3_2.py)
多行多列,每一格大小相同。
#-*-coding:utf8-*-
# cx1_3_2.py
import wx
'''基于Sizer的控件相對布局'''
class Example3(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, id=-1, title=u'極客學院', size=(600, 600))
self.panel = wx.Panel(self, -1)
self.Centre()
#定義我們需要的各個控件
commandStatic = wx.StaticText(self.panel, -1, u'輸命令:')
writePyStatic = wx.StaticText(self.panel, -1, u'寫代碼:')
commandText = wx.TextCtrl(self.panel, -1, u'')
writePyText = wx.TextCtrl(self.panel, -1, u'''#-*-coding:utf-8-*-\n#在這些Python代碼''',
style=wx.TE_MULTILINE, size=(300, 200))
send = wx.Button(self.panel, label=u'發送命令')
clear = wx.Button(self.panel, label=u'清空命令')
screen = wx.Button(self.panel, label=u'查看屏幕')
serverList = ['192.168.0.4', '10.19.2.1', '192.168.0.111', '172.26.123.5', '192.168.6.11', '192.99.8.8']
server = wx.ListBox(self.panel, -1, size=(120, 100), choices=serverList, style=wx.LB_SINGLE)
img = wx.Image(r'logo.jpg', wx.BITMAP_TYPE_ANY).Scale(200, 200)
screenBox = wx.StaticBitmap(self.panel, -1, wx.BitmapFromImage(img))
# 基于GridSizer布局
# rows=3, cols=3 3行3列
# hgap=5, 水平間隔為5 vgap=5,垂直間隔為我5
# AddMany接收的參數為列表,使用元組的形式一次性把控件添加進去。如(server, 0, wx.EXPAND) --> (控件名稱,比例,是否擴展)
gridSizerAll= wx.GridSizer(rows=3, cols=3, hgap=5, vgap=5)
gridSizerAll.AddMany([(server, 0, wx.EXPAND), (commandStatic, 0, wx.EXPAND), (commandText, 0, wx.EXPAND),
(writePyStatic, 0, wx.EXPAND), (send, 0, wx.EXPAND), (clear, 0, wx.EXPAND),
(writePyText, 0, wx.EXPAND), (screen, 0, wx.EXPAND), (screenBox, 0, wx.EXPAND)])
self.panel.SetSizer(gridSizerAll)
gridSizerAll.Fit(self)
if __name__ == "__main__":
app = wx.App()
frame = Example3()
frame.Show()
app.MainLoop()
- FlexGridSizer 管理布局(相關代碼:cx1_3_3.py)
多行多列,同一行高度相等,同一列寬度相等
#-*-coding:utf8-*-
# cx1_3_3.py
import wx
'''基于Sizer的控件相對布局'''
class Example3(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, id=-1, title=u'極客學院', size=(600, 600))
self.panel = wx.Panel(self, -1)
self.Centre()
#定義我們需要的各個控件
commandStatic = wx.StaticText(self.panel, -1, u'輸命令:')
writePyStatic = wx.StaticText(self.panel, -1, u'寫代碼:')
commandText = wx.TextCtrl(self.panel, -1, u'')
writePyText = wx.TextCtrl(self.panel, -1, u'''#-*-coding:utf-8-*-\n#在這些Python代碼''',
style=wx.TE_MULTILINE, size=(300, 200))
send = wx.Button(self.panel, label=u'發送命令')
clear = wx.Button(self.panel, label=u'清空命令')
screen = wx.Button(self.panel, label=u'查看屏幕')
serverList = ['192.168.0.4', '10.19.2.1', '192.168.0.111', '172.26.123.5', '192.168.6.11', '192.99.8.8']
server = wx.ListBox(self.panel, -1, size=(120, 100), choices=serverList, style=wx.LB_SINGLE)
img = wx.Image(r'logo.jpg', wx.BITMAP_TYPE_ANY).Scale(200, 200)
screenBox = wx.StaticBitmap(self.panel, -1, wx.BitmapFromImage(img))
# 基于FlexGridSizer布局
# rows=3, cols=3 3行3列
# hgap=5, 水平間隔為5 vgap=5,垂直間隔為我5
# AddMany接收的參數為列表,使用元組的形式一次性把控件添加進去。如(server, 0, wx.EXPAND) --> (控件名稱,比例,是否擴展)
flexGridSizerAll= wx.FlexGridSizer(rows=3, cols=3, hgap=5, vgap=5)
flexGridSizerAll.AddMany([(server, 0, wx.EXPAND), (commandStatic, 0, wx.EXPAND), (commandText, 0, wx.EXPAND),
(writePyStatic, 0, wx.EXPAND), (send, 0, wx.EXPAND), (clear, 0, wx.EXPAND),
(writePyText, 0, wx.EXPAND), (screen, 0, wx.EXPAND), (screenBox, 0, wx.EXPAND)])
self.panel.SetSizer(flexGridSizerAll)
# 添加下面這兩行代碼,控件才是可伸縮的;不添加也是對的,但是控件不可伸縮
# AddGrowableCol(2, 1)表示第3列是可伸縮的,1表示100%的增長
# 第一行,第一列的索引均為0
flexGridSizerAll.AddGrowableCol(2, 1)
flexGridSizerAll.AddGrowableRow(2, 1)
flexGridSizerAll.Fit(self)
if __name__ == "__main__":
app = wx.App()
frame = Example3()
frame.Show()
app.MainLoop()
- GridBagSizer 管理布局(相關代碼:cx1_3_4)
多行多列,各個單元均能長寬隨意,還可以跨行跨列。
#-*-coding:utf8-*-
# cx1_3_4.py
import wx
'''基于Sizer的控件相對布局'''
class Example3(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, id=-1, title=u'極客學院', size=(600, 600))
self.panel = wx.Panel(self, -1)
self.Centre()
#定義我們需要的各個控件
commandStatic = wx.StaticText(self.panel, -1, u'輸命令:')
writePyStatic = wx.StaticText(self.panel, -1, u'寫代碼:')
commandText = wx.TextCtrl(self.panel, -1, u'')
writePyText = wx.TextCtrl(self.panel, -1, u'''#-*-coding:utf-8-*-\n#在這些Python代碼''',
style=wx.TE_MULTILINE, size=(300, 200))
send = wx.Button(self.panel, label=u'發送命令')
clear = wx.Button(self.panel, label=u'清空命令')
screen = wx.Button(self.panel, label=u'查看屏幕')
serverList = ['192.168.0.4', '10.19.2.1', '192.168.0.111', '172.26.123.5', '192.168.6.11', '192.99.8.8']
server = wx.ListBox(self.panel, -1, size=(120, 100), choices=serverList, style=wx.LB_SINGLE)
img = wx.Image(r'logo.jpg', wx.BITMAP_TYPE_ANY).Scale(200, 200)
screenBox = wx.StaticBitmap(self.panel, -1, wx.BitmapFromImage(img))
# 基于GirdBagSizer布局
# sapn=(7,2) 跨越7行2列
gridBagSizerAll = wx.GridBagSizer(hgap=5, vgap=5)
gridBagSizerAll.Add(server, pos=(0, 0),
flag=wx.ALL | wx.EXPAND,
span=(7, 2), border=5)
# pos=(0, 2)由于之前跨卻了2列,所以這個控件從第3個(也就是2)開始
gridBagSizerAll.Add(commandStatic, pos=(0, 2),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
border=5)
gridBagSizerAll.Add(commandText, pos=(0, 3),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 2), border=5)
gridBagSizerAll.Add(writePyStatic, pos=(1, 2),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 3), border=5)
gridBagSizerAll.Add(writePyText, pos=(2, 2),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(4, 3), border=5)
gridBagSizerAll.Add(send, pos=(6, 2),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 1), border=5)
gridBagSizerAll.Add(clear, pos=(6, 3),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 1), border=5)
gridBagSizerAll.Add(screen, pos=(6, 4),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 1), border=5)
gridBagSizerAll.Add(screenBox, pos=(0, 5),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(7, 2), border=5)
self.panel.SetSizer(gridBagSizerAll)
# 設定窗口的最大和最小值
# 長*寬 最大值:700*400 最小值:250*200
# self.SetSizeHints(250, 200, 700, 400)
#設置控件可擴展,使用這些必須把self.SetSizeHints(250, 200, 700, 400) 限制窗口大小注釋掉
# AddGrowableCol(0, 1)表示第0列是可伸縮的,1表示100%的增長
# 第一行,第一列的索引均為0
gridBagSizerAll.AddGrowableCol(0, 1)
gridBagSizerAll.AddGrowableCol(1, 1)
gridBagSizerAll.AddGrowableCol(2, 1)
gridBagSizerAll.AddGrowableCol(3, 1)
gridBagSizerAll.AddGrowableCol(4, 1)
gridBagSizerAll.AddGrowableCol(5, 1)
gridBagSizerAll.AddGrowableCol(6, 1)
gridBagSizerAll.AddGrowableRow(0, 1)
gridBagSizerAll.AddGrowableRow(1, 1)
gridBagSizerAll.AddGrowableRow(2, 1)
gridBagSizerAll.AddGrowableRow(3, 1)
gridBagSizerAll.AddGrowableRow(4, 1)
gridBagSizerAll.AddGrowableRow(5, 1)
gridBagSizerAll.AddGrowableRow(6, 1)
gridBagSizerAll.Fit(self)
if __name__ == "__main__":
app = wx.App()
frame = Example3()
frame.Show()
app.MainLoop()
四、多線程與事件
◆ Python 多線程
◆ 控件的事件
1) Python 多線程
a) 不使用多線程可能會導致圖形界面卡死
b) 多線程可以使程序以更高的效率運行
c) 多線程可以讓程序做更多的事情
d) thread.start_new_thread(函數名,(參數1,參數2,…))
e) 使用Threading模塊創建線程(不講)
2) 控件的事件
a) 按鈕點擊
b) 文本域內容改變
c) 鼠標滑過
d) 鍵盤按下
相關代碼:(cx1_4_1.py)
#-*-coding:utf8-*-
# cx1_4_1.py
import wx
import time
'''基于Sizer的控件相對布局'''
class Example3(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, id=-1, title=u'極客學院', size=(600, 600))
self.panel = wx.Panel(self, -1)
self.Centre()
#定義我們需要的各個控件
commandStatic = wx.StaticText(self.panel, -1, u'輸命令:')
writePyStatic = wx.StaticText(self.panel, -1, u'寫代碼:')
self.commandText = wx.TextCtrl(self.panel, -1, u'')
self.writePyText = wx.TextCtrl(self.panel, -1, u'''#-*-coding:utf-8-*-\n#在這寫Python代碼''',
style=wx.TE_MULTILINE, size=(300, 200))
self.send = wx.Button(self.panel, label=u'發送命令')
self.clear = wx.Button(self.panel, label=u'清空命令')
self.screen = wx.Button(self.panel, label=u'查看屏幕')
self.serverList = ['192.168.0.4', '10.19.2.1', '192.168.0.111', '172.26.123.5', '192.168.6.11', '192.99.8.8']
self.server = wx.ListBox(self.panel, -1, size=(120, 100), choices=self.serverList, style=wx.LB_SINGLE)
img = wx.Image(r'logo.jpg', wx.BITMAP_TYPE_ANY).Scale(200, 200)
self.screenBox = wx.StaticBitmap(self.panel, -1, wx.BitmapFromImage(img))
self.Bind(wx.EVT_BUTTON, self.onSend, self.send)
self.Bind(wx.EVT_BUTTON, self.onClear, self.clear)
self.Bind(wx.EVT_BUTTON, self.onScreen, self.screen)
#基于GirdBagSizer布局
self.gridBagSizerAll = wx.GridBagSizer(hgap=5, vgap=5)
self.gridBagSizerAll.Add(self.server, pos=(0, 0),
flag=wx.ALL | wx.EXPAND,
span=(7, 2), border=5)
self.gridBagSizerAll.Add(commandStatic, pos=(0, 2),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
border=5)
self.gridBagSizerAll.Add(self.commandText, pos=(0, 3),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 2), border=5)
self.gridBagSizerAll.Add(writePyStatic, pos=(1, 2),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 3), border=5)
self.gridBagSizerAll.Add(self.writePyText, pos=(2, 2),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(4, 3), border=5)
self.gridBagSizerAll.Add(self.send, pos=(6, 2),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 1), border=5)
self.gridBagSizerAll.Add(self.clear, pos=(6, 3),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 1), border=5)
self.gridBagSizerAll.Add(self.screen, pos=(6, 4),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(1, 1), border=5)
self.gridBagSizerAll.Add(self.screenBox, pos=(0, 5),
flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
span=(7, 2), border=5)
self.panel.SetSizer(self.gridBagSizerAll)
# self.SetSizeHints(250, 200, 700, 400) #設定窗口的最大最小值
self.gridBagSizerAll.AddGrowableCol(0, 1)
self.gridBagSizerAll.AddGrowableCol(1, 1)
self.gridBagSizerAll.AddGrowableCol(2, 1)
self.gridBagSizerAll.AddGrowableCol(3, 1)
self.gridBagSizerAll.AddGrowableCol(4, 1)
self.gridBagSizerAll.AddGrowableCol(5, 1)
self.gridBagSizerAll.AddGrowableCol(6, 1)
self.gridBagSizerAll.AddGrowableRow(0, 1)
self.gridBagSizerAll.AddGrowableRow(1, 1)
self.gridBagSizerAll.AddGrowableRow(2, 1)
self.gridBagSizerAll.AddGrowableRow(3, 1)
self.gridBagSizerAll.AddGrowableRow(4, 1)
self.gridBagSizerAll.AddGrowableRow(5, 1)
self.gridBagSizerAll.AddGrowableRow(6, 1)
self.gridBagSizerAll.Fit(self)
# GetSelection()返回的是列表框的第幾項(即索引值),以0開始的
# GetValue() 獲取文本框的內容
def _onSend(self, event):
## time.sleep(10)
if self.server.GetSelection() != -1: # -1 表示列表框沒有任何內容被選中
server = self.serverList[self.server.GetSelection()]
else:
server = u'未選擇服務器'
command = self.commandText.GetValue()
writePy = self.writePyText.GetValue()
print u'選中的服務器是: %s' % server
print u'執行的內置命令是: %s' % command
print u'寫入的Python代碼是:\n%s' % writePy
# commandText.Clear()清除文本框內的內容
# AppendText 添加文本都得到文本框中
def onClear(self, event):
self.commandText.Clear()
self.writePyText.Clear()
self.writePyText.AppendText(u'''#-*-coding:utf-8-*-\n#在這些Python代碼''')
def onScreen(self, event):
img = wx.Image(r'python.jpg', wx.BITMAP_TYPE_ANY).Scale(300, 200)
self.screenBox.SetBitmap(wx.BitmapFromImage(img))
self.gridBagSizerAll.Fit(self)
# 使用多線程
# (event,) 如果沒有參數,就一定要有這個逗號,調用_onSend 函數
def onSend(self, event):
import thread # 創建多線程,這個多線程使用有很大問題,運行會卡死
thread.start_new_thread(self._onSend, (event,))
if __name__ == "__main__":
app = wx.App()
frame = Example3()
frame.Show()
app.MainLoop()
一些其他資料:
# RadioBox 參數
# style默認是 wx.RA_SPECIFY_COLS列
rb = wx.RadioBox(parent, id, label, pos, size, choices, majorDimension, style, validator, name)