python GUI圖形化編程-wxpython(2)-使用panel面板

在使用《python GUI圖形化編程-wxpython(1)》的圖形化編程中我發現一件很耗費時間的事情,當我在界面上新增或者修改元素時,我需要重新調整窗口的大小,還必須對之前的元素重新調整位置座標,否則就會出現排版很雜亂的現象,總之就是頁面上的元素不會隨着窗口的大小進行自適應的調整尺寸。

如下圖:當窗口按照設定的尺寸展示時,排版還算美觀

而當我拖動改變窗口的大小時,頁面元素是固定不動的

爲了解決這個問題,可以使用panel面板,我們可以將Panel看做是一個容器,可以在上面放置各種控件,排列控件時,將控件按照橫縱劃分爲小模塊,如下圖所示,該頁面的元素可分爲4行,每行分爲3列,可分別設置比例,這樣窗口大小改變時,元素也會按照比例來放大或者縮小。

改寫前代碼如下:元件的排列主要是由pos和size來控制,調試起來比較麻煩

import wx

class ChatFrame(wx.Frame):
    def __init__(self, parent, id, title, size):
        # 初始化,添加控件並綁定事件
        wx.Frame.__init__(self, parent, id, title)
        self.SetSize(size)#設置對話框的大小
        self.Center()#設置彈窗在屏幕中間               
        
        self.chatFrame1 = wx.TextCtrl(self, pos=(5, 35), size=(250, 279), style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_LEFT)#設置聊天窗口的大小
        self.chatFrame2 = wx.TextCtrl(self, pos=(260, 35), size=(250, 279), style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RIGHT)#設置聊天窗口的大小
        #  wx.TE_MULTILINE可以實現以滾動條方式多行顯示文本,若不加此功能文本文檔顯示爲一行
        self.noticeFrame = wx.TextCtrl(self, pos=(550, 35), size=(180, 279), style=wx.TE_MULTILINE | wx.TE_READONLY)#設置在線列表窗口的大小
        self.noticeLabel = wx.StaticText(self, label="Notice", pos=(600, 8), size=(90, 25))
        self.receiveLabel = wx.StaticText(self, label="Receive Msg", pos=(80, 8), size=(200, 25))
        self.sendLabel = wx.StaticText(self, label="Send Msg", pos=(345, 8), size=(200, 25))
        self.message = wx.TextCtrl(self, pos=(5, 320), size=(150, 25),value='input message')#設置發送消息的文本輸入框的位置和尺寸
        self.sendButton = wx.Button(self, label="Send", pos=(200, 320), size=(58, 25))
        self.toUser=wx.TextCtrl(self,pos=(5, 355), size=(150, 25),value='input username')#設置指定用戶的文本輸入框的位置和尺寸
        self.sendDesignButton = wx.Button(self, label="SendDesign", pos=(200, 355), size=(100, 25))       
        self.closeButton = wx.Button(self, label="Close", pos=(353, 320), size=(65, 25))
        self.usersButton = wx.Button(self, label="Online", pos=(423, 320), size=(58, 25))
                             
        self.Show()

if __name__ == '__main__':
    app = wx.App()#實例化一個主循環
    ChatFrame(None, -1, title="ShiYanLou Chat Client", size=(780,500))
    app.MainLoop()#啓動主循環

改寫後代碼:雖然看起來改寫後的代碼行數還比之前要多,但是卻容易維護,而且代碼層次也比較清晰。

import wx

class ChatFrame(wx.Frame):
    def __init__(self, parent, id, title, size):
        # 初始化,添加控件並綁定事件
        wx.Frame.__init__(self, parent, id, title)
        self.SetSize(size)#設置對話框的大小
        self.Center()#設置彈窗在屏幕中間               
        
        #使用尺寸器改寫,改寫後拉大或者縮小窗口,中間的控件會隨着窗口的大小已固定的尺寸而改變
        panel=wx.Panel(self)#self表示實例即ChatFrame,創建一個面板
        #定義panel中的元件
        self.receiveLabel = wx.StaticText(panel,label="Receive Msg")
        self.sendLabel = wx.StaticText(panel,label="Send Msg")
        self.noticeLabel = wx.StaticText(panel,label="Notice")
        self.chatFrame1 = wx.TextCtrl(panel,style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_LEFT)
        self.chatFrame2 = wx.TextCtrl(panel,style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RIGHT)
        self.noticeFrame = wx.TextCtrl(panel,style=wx.TE_MULTILINE | wx.TE_READONLY )
        self.message = wx.TextCtrl(panel,value='input message')#設置發送消息的文本輸入框的位置和尺寸
        self.toUser=wx.TextCtrl(panel,value='input username')#設置指定用戶的文本輸入框的位置和尺寸
        self.sendButton = wx.Button(panel, label="Send")
        self.sendDesignButton = wx.Button(panel, label="SendDesign")  
        self.closeButton = wx.Button(panel, label="Close")
        self.usersButton = wx.Button(panel, label="Online")
        
        self.box1=wx.BoxSizer()#定義橫向的box1
        self.box1.Add(self.receiveLabel, proportion=4, flag=wx.EXPAND | wx.ALL,border=5)#該元素佔box1的比例爲40%,方式爲伸縮,邊界爲5
        self.box1.Add(self.sendLabel, proportion=4,flag=wx.EXPAND | wx.ALL,border=5)
        self.box1.Add(self.noticeLabel, proportion=2,flag=wx.EXPAND | wx.ALL,border=5)
        
        self.box2=wx.BoxSizer()#定義橫向的box2
        self.box2.Add(self.chatFrame1, proportion=4,flag=wx.EXPAND | wx.ALL,border=5)
        self.box2.Add(self.chatFrame2, proportion=4,flag=wx.EXPAND | wx.ALL,border=5)
        self.box2.Add(self.noticeFrame, proportion=2,flag=wx.EXPAND | wx.ALL,border=5)
        
        self.box3=wx.BoxSizer()#定義橫向的box3
        self.box3.Add(self.message, proportion=6, flag=wx.EXPAND | wx.ALL,border=5)
        self.box3.Add(self.sendButton, proportion=2,flag=wx.EXPAND | wx.ALL,border=5)
        self.box3.Add(self.usersButton, proportion=2,flag=wx.EXPAND | wx.ALL,border=5)
        
        self.box4=wx.BoxSizer()#定義橫向的box3
        self.box4.Add(self.toUser, proportion=6, flag=wx.EXPAND | wx.ALL,border=5)
        self.box4.Add(self.sendDesignButton, proportion=2,flag=wx.EXPAND | wx.ALL,border=5)
        self.box4.Add(self.closeButton, proportion=2,flag=wx.EXPAND | wx.ALL,border=5)
        
        self.v_box=wx.BoxSizer(wx.VERTICAL)#定義一個縱向的v_box
        self.v_box.Add(self.box1, proportion=1,flag=wx.EXPAND | wx.ALL,border=5)#添加box1,比例爲1
        self.v_box.Add(self.box2, proportion=7,flag=wx.EXPAND | wx.ALL,border=5)#添加box2,比例爲7
        self.v_box.Add(self.box3, proportion=1,flag=wx.EXPAND | wx.ALL,border=5)#添加box3,比例爲1
        self.v_box.Add(self.box4, proportion=1,flag=wx.EXPAND | wx.ALL,border=5)#添加box4,比例爲1
        
        panel.SetSizer(self.v_box)                       
        self.Show()

if __name__ == '__main__':
    app = wx.App()#實例化一個主循環
    ChatFrame(None, -1, title="ShiYanLou Chat Client", size=(780,500))
    app.MainLoop()#啓動主循環

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章