狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

使用wxpython開(kāi)發(fā)跨平臺(tái)桌面應(yīng)用,基類對(duì)話框窗體的封裝處理

freeflydom
2024年11月4日 9:53 本文熱度 1392

在開(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è)類可以繼承自 wx.Dialog 或者其他對(duì)話框類,如可以調(diào)節(jié)大小的 wx.lib.sized_controls.SizedDialog 對(duì)話框類。

然后,創(chuàng)建一個(gè)具體的對(duì)話框類,繼承自 BaseDialog。在這個(gè)類中實(shí)現(xiàn) create_ui 方法,設(shè)置特定的控件和布局。

封裝基類對(duì)話框可以幫助你創(chuàng)建結(jié)構(gòu)化、可維護(hù)的用戶界面。通過(guò)繼承和重用代碼,你可以提高開(kāi)發(fā)效率,并確保應(yīng)用的一致性。

如我們常規(guī)的對(duì)話框編輯數(shù)據(jù)界面,可能如下所示。

 這個(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ì)話框,可以重寫(xiě)的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)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved