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()#启动主循环

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
wxPython 是一个基于 Python 的跨平台图形用户界面 (GUI) 工具包,它允许开发人员使用 Python 编程语言来创建功能丰富的桌面应用程序。它是 wxWidgets C++ 工具包的 Python 绑定。 使用 wxPython,你可以创建各种类型的 GUI 应用程序,包括窗口、对话框、按钮、菜单、工具栏等等。它提供了丰富的控件库和布局管理器,使得构建用户友好的界面变得相对简单。 下面是一个简单的示例,演示了如何使用 wxPython 创建一个简单的窗口: ```python import wx class MyFrame(wx.Frame): def __init__(self): super().__init__(parent=None, title='My App') panel = wx.Panel(self) self.text_ctrl = wx.TextCtrl(panel) my_btn = wx.Button(panel, label='Click Me!') sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.text_ctrl, 0, wx.ALL | wx.EXPAND, 5) sizer.Add(my_btn, 0, wx.ALL, 5) panel.SetSizer(sizer) if __name__ == '__main__': app = wx.App() frame = MyFrame() frame.Show() app.MainLoop() ``` 这个示例代码创建了一个窗口,其中包含一个文本框和一个按钮。通过创建一个自定义的 `MyFrame` 类,并在其构造函数中设置窗口的标题和布局。然后,我们将控件添加到窗口的面板上,并使用 `SetSizer` 方法将布局管理器应用到面板上。最后,我们创建一个 `wx.App` 对象,并进入主事件循环以启动应用程序。 你可以根据需要添加更多的控件和自定义窗口的样式和行为。wxPython 提供了丰富的文档和示例代码,帮助你更好地了解如何使用它来构建复杂的图形界面应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值