使用wxpython開發(fā)跨平臺桌面應(yīng)用,基類對話框窗體的封裝處理
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
在開發(fā)桌面界面的時候,往往都需要對一些通用的窗體進行一些抽象封裝處理,以便統(tǒng)一界面效果,以及繼承一些通用的處理過程,減少重復編碼。本篇隨筆介紹使用wxpython開發(fā)跨平臺桌面應(yīng)用,基類對話框窗體的封裝處理,介紹基于 wx.lib.sized_controls.SizedDialog 對話框類的基類封裝,以便簡化子類代碼,以及實現(xiàn)一些豐富的編輯界面效果。 1、基類對話框的界面效果我借用我之前在Winform界面開發(fā)的時候,對基類窗體的一些做法,如下是之前Winform界面的一些效果。 如對于一般的數(shù)據(jù)錄入或者查詢界面,如下效果所示。 這里可以看到,一般的數(shù)據(jù)處理界面,都有一些統(tǒng)一的圖標設(shè)置、校驗過程處理、以及提供一些通用的按鈕以便進行數(shù)據(jù)的保存。 該對話框基類的設(shè)計視圖,我們在其中添加了3個按鈕(常用的添加、保存、關(guān)閉按鈕),并封裝一些通用對話框的處理函數(shù),可以簡化很多代碼。
2、使用wxpython開發(fā)的界面處理在 wxPython 開發(fā)中,對基類對話框進行封裝是一個常見的做法,同樣可以提高代碼的可復用性和可維護性。 首先,你可以定義一個基類對話框,包含一些通用的功能和屬性,例如標題、尺寸和常用控件。這個類可以繼承自 然后,創(chuàng)建一個具體的對話框類,繼承自 封裝基類對話框可以幫助你創(chuàng)建結(jié)構(gòu)化、可維護的用戶界面。通過繼承和重用代碼,你可以提高開發(fā)效率,并確保應(yīng)用的一致性。
這個界面是參加的表單處理界面效果,而且對話框如果繼承自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 ) #獲得主內(nèi)容面板 cpane = self.GetContentsPane() #構(gòu)建一個可滾動的面板,并設(shè)置拉伸屬性 pane = sc.SizedScrolledPanel(cpane, wx.ID_ANY) pane.SetSizerProps(expand=True, proportion=1) pane.SetSizerType("form") # 設(shè)置為表單布局,默認2列 #添加主要內(nèi)容區(qū)域 。。。。。。。 # 添加對話框按鈕: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 對話框類提供了一個獲得主面板并設(shè)置表單布局類型的處理,我們主要基于這個主面板來創(chuàng)建控件即可,創(chuàng)建控件代碼不需要太多的布局參數(shù)設(shè)置,處理比較簡單,如下所示 # 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列)添加即可。 另外,我們看到,對話框的按鈕也是很簡單的一行代碼實現(xiàn)以前需要多行代碼處理的效果。 # 添加對話框按鈕:OK、Cancel self.SetButtonSizer(self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL)) 通過這樣創(chuàng)建的按鈕,默認還具有國際化特性,也就是跟隨我們的語言設(shè)置,系統(tǒng)自動處理對應(yīng)的標題。 如果不設(shè)置程序的locale, 那么可能默認是英文的按鈕名稱,如下所示。
如果是設(shè)置了為中文語言,那么就是中文的按鈕名稱,如下所示。 app = wx.App() # 設(shè)置語言 # 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): """可以調(diào)整大小及滾動的對話框基類""" 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函數(shù)用來把焦點放在創(chuàng)建控件上即可,這樣可以剔除不關(guān)心的內(nèi)容。 這樣我們對話框子類,就只需根據(jù)不同的業(yè)務(wù)添加不同的控件上去即可,其他就不要管了,交給基類去實現(xiàn)即可。 class MyScrolledDialog(BaseScrolledDialog): """測試可以滾動的SizedDialog對話框-繼承實現(xiàn)""" def __init__(self, parent = None, id = wx.ID_ANY, title="測試可以滾動的SizedDialog對話框-繼承實現(xiàn)"): 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) ******* 這樣同樣實現(xiàn)了相同的效果,而且簡化了代碼。 我們還可以指定對話框的默認位置,讓它頂部對齊屏幕的頂部,這樣內(nèi)容顯示比較方便。 我們只需在基類窗口的初始化函數(shù)里面,設(shè)置位置即可。 # 獲取屏幕的大小 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)) 當然,我們還可以加入對數(shù)據(jù)驗證的一下空殼函數(shù),基類只需要負責定義接口和邏輯處理,具體的檢查細節(jié)可以交給子類來實現(xiàn)代碼即可。 ?轉(zhuǎn)自https://www.cnblogs.com/wuhuacong/p/18523514 該文章在 2024/11/4 9:53:01 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |