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

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

使用wxpython開發跨平臺桌面應用,基類對話框窗體的封裝處理

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

在開發桌面界面的時候,往往都需要對一些通用的窗體進行一些抽象封裝處理,以便統一界面效果,以及繼承一些通用的處理過程,減少重復編碼。本篇隨筆介紹使用wxpython開發跨平臺桌面應用,基類對話框窗體的封裝處理,介紹基于 wx.lib.sized_controls.SizedDialog 對話框類的基類封裝,以便簡化子類代碼,以及實現一些豐富的編輯界面效果。

1、基類對話框的界面效果

我借用我之前在Winform界面開發的時候,對基類窗體的一些做法,如下是之前Winform界面的一些效果。

如對于一般的數據錄入或者查詢界面,如下效果所示。

這里可以看到,一般的數據處理界面,都有一些統一的圖標設置、校驗過程處理、以及提供一些通用的按鈕以便進行數據的保存。

該對話框基類的設計視圖,我們在其中添加了3個按鈕(常用的添加、保存、關閉按鈕),并封裝一些通用對話框的處理函數,可以簡化很多代碼。

 

2、使用wxpython開發的界面處理

在 wxPython 開發中,對基類對話框進行封裝是一個常見的做法,同樣可以提高代碼的可復用性和可維護性。

首先,你可以定義一個基類對話框,包含一些通用的功能和屬性,例如標題、尺寸和常用控件。這個類可以繼承自 wx.Dialog 或者其他對話框類,如可以調節大小的 wx.lib.sized_controls.SizedDialog 對話框類。

然后,創建一個具體的對話框類,繼承自 BaseDialog。在這個類中實現 create_ui 方法,設置特定的控件和布局。

封裝基類對話框可以幫助你創建結構化、可維護的用戶界面。通過繼承和重用代碼,你可以提高開發效率,并確保應用的一致性。

如我們常規的對話框編輯數據界面,可能如下所示。

 這個界面是參加的表單處理界面效果,而且對話框如果繼承自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 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved