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