1. 程式人生 > >python從零開始--35 wxPython 加 wxFromBuilder處理python桌面UI

python從零開始--35 wxPython 加 wxFromBuilder處理python桌面UI

python的桌面UI設計和處理貌似沒有VB, C#等語言方便。今天查詢了一些資料,發現用wxPython + wxFromBuilder是一個相對簡單的方案。

1.  用pip下載最新的wxPython (我在下載的時候,發現pip預設的源下載wxPython連線不成功,切換到國內的源就成功)

2. 下載最新的的wxFromBuilder (注意下載與自己的python版本和系統版本對應的安裝檔案  ; 目前我下載的是wxFormBuilder_v3.5.1-rc1)

3.  參考這篇文章做了一個編輯器 ,這裡不再贅述。 只補充一點, 新增事件的步驟如下,這裡wxFromBuilder會自動生成Virtual event handlers,後面在具體使用UI的類(繼承自wxFromBuilder生成的類)需過載這些event handlers。



具體的程式碼:

1:從wxFromBuilder中copy過來的程式碼  

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/7/13 14:29
# @Author  : PanCheng
# @Site    : 
# @File    : MyFrame1.py
# @Software: PyCharm
# -*- coding: utf-8 -*-

###########################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################
import wx
import wx.xrc

###########################################################################
## Class MyFrame1
###########################################################################

class MyFrame1(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"編輯器", pos=wx.DefaultPosition, size=wx.Size(494, 370),
                          style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)

        self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)

        bSizer1 = wx.BoxSizer(wx.VERTICAL)

        bSizer2 = wx.BoxSizer(wx.HORIZONTAL)

        self.filename = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(250, 30), 0)
        bSizer2.Add(self.filename, 0, wx.ALL, 5)

        self.loadbutton = wx.Button(self, wx.ID_ANY, u"開啟", wx.Point(-1, -1), wx.DefaultSize, 0)
        bSizer2.Add(self.loadbutton, 0, wx.ALL, 5)

        self.savebutton = wx.Button(self, wx.ID_ANY, u"儲存", wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer2.Add(self.savebutton, 0, wx.ALL, 5)

        bSizer1.Add(bSizer2, 1, wx.EXPAND, 5)

        self.contents = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(480, 280),
                                    0 | wx.HSCROLL | wx.VSCROLL)
        bSizer1.Add(self.contents, 0, wx.ALL, 5)

        self.SetSizer(bSizer1)
        self.Layout()

        self.Centre(wx.BOTH)

        # Connect Events
        self.loadbutton.Bind(wx.EVT_BUTTON, self.load)
        self.savebutton.Bind(wx.EVT_BUTTON, self.save)

    def __del__(self):
        pass

    # Virtual event handlers, overide them in your derived class
    def load(self, event):
        event.Skip()

    def save(self, event):
        event.Skip()


2:從具體處理UI事件和顯示UI的程式碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/7/13 14:37
# @Author  : PanCheng
# @Site    : 
# @File    : ex22.py
# @Software: PyCharm

import wx
import sys
import os
import 編輯器.MyFrame1


class MyFrame(編輯器.MyFrame1.MyFrame1):

    def load(self, event):
        file = open(self.filename.GetValue())
        self.contents.SetValue(file.read())
        file.close()

    def save(self, event):
        file = open(self.filename.GetValue(), 'w')
        file.write(self.contents.GetValue())
        file.close()

if __name__ == "__main__":
    app = wx.App()

    main_win = MyFrame(None)
    main_win.Show()

    app.MainLoop()