WxPython 控件隐藏与显示技巧

WxPython 的控件,除了有Disable() 和 Enable()方法,还有hide及show方法,在固定位置的布局,Hide 和 Show()工作正常 。

比如这样

import wx


class MyButton(wx.Frame):
    flag = True

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)
        panel = wx.Panel(self, -1, size=(300, 250))
        self.btn1 = wx.Button(panel, 201, u'设置', pos=(80, 70))
        self.Bind(wx.EVT_BUTTON, self.click1, self.btn1)
        self.btn2 = wx.Button(panel, 202, u'设置2', pos=(180, 70))
        self.Bind(wx.EVT_BUTTON, self.click2, self.btn2)
        self.Centre()
        self.btn2.Hide()

    def click1(self, e):
        print("btn1 click!")
        if self.flag:
            self.btn2.Hide()
            self.flag = False
        else:
            # self.btn2.Disable()
            self.btn2.Show()
            self.flag = True

    def click2(self, e):
        print("btn2 click!")


if __name__ == '__main__':
    app = wx.App()
    frame = MyButton(None, -1, u'按钮示例')
    frame.Show()
    app.MainLoop()

但如果使用wx.BoxSizer 的 EXPAND 布局 , 如果init 时就隐藏 控件,就会照成错位

比如这样

import wx

class MyButton(wx.Frame):
    flag = True
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,id,title)
        panel=wx.Panel(self,-1,size=(300,250))
        box = wx.BoxSizer(wx.HORIZONTAL)
        self.btn1 = wx.Button(panel, -1, 'Button1')
        self.btn2 = wx.Button(panel, -1, 'Button2')
        self.btn3  = wx.Button(panel, -1, 'Button3')
        box.Add(self.btn1 , 1, wx.ALL, 30)
        box.Add(self.btn2 , 0, wx.EXPAND)
        box.Add(self.btn3 , 0, wx.ALIGN_CENTER)
        self.Bind(wx.EVT_BUTTON, self.click1, self.btn1)
        self.Bind(wx.EVT_BUTTON, self.click2, self.btn2)
        panel.SetSizer(box)
        self.Center()
        self.btn2.Hide()


    def click1(self,e ):
        print("btn1 click!")
        if self.flag:
            self.btn2.Hide()
            self.flag = False
        else:
            # self.btn2.Disable()
            self.btn2.Show()
            self.flag = True
    def click2(self,e):
        print("btn2 click!")


if __name__=='__main__':
    app=wx.App()
    frame=MyButton(None,-1,u'按钮示例')
    frame.Show()
    app.MainLoop()

想要这种布局结果,

 

实际是这种布局结果:

要想控件按预设的位置显示,就不能在init里直接执行 hide 方法。 要在 Frame 显示完成后,再进行隐藏(调用afterload)。

代码优化如下:

# encoding: utf-8
"""
@author: 陈年椰子
@contact: hndm@qq.com
@version: 1.0
@project:test 
@file: wxgui3.py
@time: 2022-1-14 11:16

说明
"""

# coding: utf-8

import wx

class MyButton(wx.Frame):
    flag = True
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,id,title)
        panel=wx.Panel(self,-1,size=(300,250))
        box = wx.BoxSizer(wx.HORIZONTAL)
        self.btn1 = wx.Button(panel, -1, 'Button1')
        self.btn2 = wx.Button(panel, -1, 'Button2')
        self.btn3  = wx.Button(panel, -1, 'Button3')
        box.Add(self.btn1 , 1, wx.ALL, 5)
        box.Add(self.btn2 , 0, wx.EXPAND)
        box.Add(self.btn3 , 0, wx.ALIGN_CENTER)
        self.Bind(wx.EVT_BUTTON, self.click1, self.btn1)
        self.Bind(wx.EVT_BUTTON, self.click2, self.btn2)
        panel.SetSizer(box)
        self.Center()



    def afterload(self):
        # 根据数据情况再次调整控件
        self.flag = False
        self.btn2.Hide()

    def click1(self,e ):
        print("btn1 click!")
        if self.flag:
            self.btn2.Hide()
            self.flag = False
        else:
            self.btn2.Show()
            self.flag = True
    def click2(self,e):
        print("btn2 click!")


if __name__=='__main__':
    app=wx.App()
    frame=MyButton(None,-1,u'按钮示例')
    frame.Show()
    # frame 显示完成后,再调整控件
    frame.afterload()
    app.MainLoop()


 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年椰子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值