使用wxpython開發跨平臺桌面應用,基類對話框窗體的封裝處理
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
在開發桌面界面的時候,往往都需要對一些通用的窗體進行一些抽象封裝處理,以便統一界面效果,以及繼承一些通用的處理過程,減少重復編碼。本篇隨筆介紹使用wxpython開發跨平臺桌面應用,基類對話框窗體的封裝處理,介紹基于 wx.lib.sized_controls.SizedDialog 對話框類的基類封裝,以便簡化子類代碼,以及實現一些豐富的編輯界面效果。 1、基類對話框的界面效果我借用我之前在Winform界面開發的時候,對基類窗體的一些做法,如下是之前Winform界面的一些效果。 如對于一般的數據錄入或者查詢界面,如下效果所示。 這里可以看到,一般的數據處理界面,都有一些統一的圖標設置、校驗過程處理、以及提供一些通用的按鈕以便進行數據的保存。 該對話框基類的設計視圖,我們在其中添加了3個按鈕(常用的添加、保存、關閉按鈕),并封裝一些通用對話框的處理函數,可以簡化很多代碼。
2、使用wxpython開發的界面處理在 wxPython 開發中,對基類對話框進行封裝是一個常見的做法,同樣可以提高代碼的可復用性和可維護性。 首先,你可以定義一個基類對話框,包含一些通用的功能和屬性,例如標題、尺寸和常用控件。這個類可以繼承自 然后,創建一個具體的對話框類,繼承自 封裝基類對話框可以幫助你創建結構化、可維護的用戶界面。通過繼承和重用代碼,你可以提高開發效率,并確保應用的一致性。
這個界面是參加的表單處理界面效果,而且對話框如果繼承自wx.lib.sized_controls.SizedDialog 對話框類,那么對話框可以自由拖動大小,配合縮放可達到比較好的效果。 如果我們對話框不考慮繼承自定義基類的情況下,那么代碼如下所示 class MyDialog(sc.SizedDialog): def __init__(self, parent = None, id = wx.ID_ANY ): sc.SizedDialog.__init__(self, parent = parent, id=id, title=u"測試可以滾動的SizedDialog對話框", style=wx.DEFAULT_DIALOG_STYLE| wx.RESIZE_BORDER ) #獲得主內容面板 cpane = self.GetContentsPane() #構建一個可滾動的面板,并設置拉伸屬性 pane = sc.SizedScrolledPanel(cpane, wx.ID_ANY) pane.SetSizerProps(expand=True, proportion=1) pane.SetSizerType("form") # 設置為表單布局,默認2列 #添加主要內容區域 。。。。。。。 # 添加對話框按鈕:OK、Cancel self.SetButtonSizer(self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL)) self.Layout() self.Centre(wx.BOTH) self.MinSize = (300, 200) self.SetSize((400, 300)) 上面代碼,可以看到,其中的SizedDialog 對話框類提供了一個獲得主面板并設置表單布局類型的處理,我們主要基于這個主面板來創建控件即可,創建控件代碼不需要太多的布局參數設置,處理比較簡單,如下所示 # row 1 wx.StaticText(pane, -1, "姓名") textCtrl = wx.TextCtrl(pane, -1, "請輸入姓名") textCtrl.SetSizerProps(expand=True) # row 2 wx.StaticText(pane, -1, "Email郵箱") emailCtrl = wx.TextCtrl(pane, -1, "") emailCtrl.SetSizerProps(expand=True) 我們這樣就可以按順序(Form類型的布局默認總共2列)添加即可。 另外,我們看到,對話框的按鈕也是很簡單的一行代碼實現以前需要多行代碼處理的效果。 # 添加對話框按鈕:OK、Cancel self.SetButtonSizer(self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL)) 通過這樣創建的按鈕,默認還具有國際化特性,也就是跟隨我們的語言設置,系統自動處理對應的標題。 如果不設置程序的locale, 那么可能默認是英文的按鈕名稱,如下所示。
如果是設置了為中文語言,那么就是中文的按鈕名稱,如下所示。 app = wx.App() # 設置語言 # local = wx.Locale(wx.LANGUAGE_ENGLISH) local = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED) dlg = MyDialog() dlg.ShowModal() dlg.Destroy() app.MainLoop() 我們有了上面對話框界面的參考,可以把它可能會重復的代碼,通過抽象的方式,提取到一個基類對話框里面,如下所示。 class BaseScrolledDialog(sc.SizedDialog): """可以調整大小及滾動的對話框基類""" def __init__(self, parent = None, id = wx.ID_ANY, title="", style=wx.DEFAULT_DIALOG_STYLE| wx.RESIZE_BORDER, can_scroll=True ): self.can_scroll = can_scroll sc.SizedDialog.__init__(self, parent = parent, id=id, title = title, style= style ) self.SetMinSize((300, 200)) main_panel : wx.Panel = None #通過can_scroll判斷是否使用滾動面板 cpane = self.GetContentsPane() if can_scroll: pane = sc.SizedScrolledPanel(cpane, wx.ID_ANY) main_panel = pane else: main_panel = cpane self.AddControls(main_panel) self.AddDialogButtons() self.Layout() def AddControls(self, pane: wx.Panel): """為主面板添加控件,不含底部對話框按鈕""" pass 也就是提供一個子類對話框,可以重寫的AddControls函數用來把焦點放在創建控件上即可,這樣可以剔除不關心的內容。 這樣我們對話框子類,就只需根據不同的業務添加不同的控件上去即可,其他就不要管了,交給基類去實現即可。 class MyScrolledDialog(BaseScrolledDialog): """測試可以滾動的SizedDialog對話框-繼承實現""" def __init__(self, parent = None, id = wx.ID_ANY, title="測試可以滾動的SizedDialog對話框-繼承實現"): super().__init__(parent, id, title, can_scroll=True) self.SetSize((600, 500)) def AddControls(self, pane): """主面板的控件添加""" # row 1 wx.StaticText(pane, -1, "姓名") textCtrl = wx.TextCtrl(pane, -1, "請輸入姓名") textCtrl.SetSizerProps(expand=True) # row 2 wx.StaticText(pane, -1, "Email郵箱") emailCtrl = wx.TextCtrl(pane, -1, "") emailCtrl.SetSizerProps(expand=True) ******* 這樣同樣實現了相同的效果,而且簡化了代碼。 我們還可以指定對話框的默認位置,讓它頂部對齊屏幕的頂部,這樣內容顯示比較方便。 我們只需在基類窗口的初始化函數里面,設置位置即可。 # 獲取屏幕的大小 screen_size = wx.GetDisplaySize() dialog_width, dialog_height = self.GetSize() # 計算頂端對齊的位置 x_position = (screen_size.x - dialog_width) // 2 # 水平居中 y_position = 0 # 頂端對齊 self.SetPosition((x_position, y_position)) 當然,我們還可以加入對數據驗證的一下空殼函數,基類只需要負責定義接口和邏輯處理,具體的檢查細節可以交給子類來實現代碼即可。 ?轉自https://www.cnblogs.com/wuhuacong/p/18523514 該文章在 2024/11/4 9:53:01 編輯過 |
關鍵字查詢
相關文章
正在查詢... |