1-Python 圖形程序入門

Python 圖形程序入門

課程概要:
1、wxPython 介紹與安裝
2、基本控件介紹與絕對布局
3、控件相對布局
4、多線程與事件


一、wxPython 介紹與安裝
◆ wxPython 介紹
◆ wxPython VS PyQt
◆ wxPython 安裝

  1. wxPython 介紹
    ◆ wxPython 是wxWidgets在Python語言下的封裝.
    ◆ wxWidgets是一個跨平臺的GUI應用編程接口,使用C++編寫。
    ◆ 所想即所得,缺乏成熟的IDE.
    ◆ 圖形界面風格與系統的風格相似。

  2. wxPython VS PyQt
    為什么選擇wxPython而不是pyQt?
    ◆ 協議
    ◆ 編碼風格
    ◆ 復雜性
    ◆ 個人習慣

  3. 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


二、基本控件介紹與絕對布局
◆ 基本控件介紹
◆ 絕對布局

  1. 基本控件介紹
    靜態文本:wx.StaticText
    文本域:wx.TextCtrl
    按鈕:wx.Button
    單選與復選按鈕:wx.CheckBox/wx.RadioButton
    列表框:wx.ListBox
    圖片:wx.StaticBitmap

  2. 絕對布局
    ◆ 基于控件的坐標擺放空間
    ◆ 簡單直觀
    ◆ 方法單一
    ◆ 不能隨窗口的改變而調整位置

相關代碼:絕對布局(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()
Paste_Image.png

三、控件相對布局
◆ BoxSizer 管理布局
◆ GridSizer 管理布局
◆ FlexGridSizer 管理布局
◆ GridBagSizer 管理布局

  1. 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()

Paste_Image.png

  1. 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()

Paste_Image.png

  1. 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()
Paste_Image.png

  1. 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()
Paste_Image.png

四、多線程與事件
◆ 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()
Paste_Image.png

一些其他資料:

#  RadioBox 參數
#  style默認是 wx.RA_SPECIFY_COLS列
rb = wx.RadioBox(parent, id, label, pos, size, choices, majorDimension, style, validator, name)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容