演示效果

实现panel切换思路

1.创建所有在某个区域需要切换面板对象,设置为None

self.panel_Celan1 = None
self.panel_Celan2 = None
self.panel_Celan3 = None
self.panel_Celan1_1 =None

2.我们要实现切换,就是删除在这个位置的其他panel,然后创建显示你想要显示的panel。

我们以侧栏第二个按钮为例:

我们想要显示self.panel_Celan2,而在这个位置可能存在self.panel_Celan1,self.panel_Celan3,self.panel_Celan1_1,

对于self.panel_Celan1,self.panel_Celan3,self.panel_Celan1_1这些panel,全部需要判断,如果存在,则删除,如果不存在,我们就不需要操作

而我们需要切换显示的panel只需要在不存在的时候创建即可,因为你一直点击同一个按钮,已经创建panel,不需要再次创建panel。

        if event.GetEventObject()==self._caidan2:
# 如果需要显示的地方存在其他面板,删除
if self.panel_Celan1:
self.panel_Celan1.Destroy()
if self.panel_Celan1_1:
self.panel_Celan1_1.Destroy()
if self.panel_Celan3:
self.panel_Celan3.Destroy()
if not self.panel_Celan2 :
self.panel_Celan2 = wx.Panel(self, pos=(200, 0), size=(700, 700))

源码

#!/usr/bin/env python

'''
静态文本、可控文本、对话框、GetApp()
'''
import wx,time
ID_EXIT=200
ID_ABOUT=201 class Frame(wx.Frame): #2 wx.Frame子类
def __init__(self,parent = None,id = -1,title ='系统管理界面'):
wx.Frame.__init__(self,parent,id,title,size=(900,600))
self.panel_Celan1 = None
self.panel_Celan2 = None
self.panel_Celan3 = None
self.panel_Celan1_1 =None
self.setupStatusBar()
self.InitCelan()
self.InitButton() #初始化状态栏
def setupStatusBar(self):
# 状态栏
sb = self.CreateStatusBar(2) # 2代表将状态栏分为两个
self.SetStatusWidths([-1, -2]) # 比例为1:2
self.SetStatusText("Ready", 0) # 0代表第一个栏,Ready为内容
# timmer
self.timer = wx.PyTimer(self.Notify)
self.timer.Start(1000, wx.TIMER_CONTINUOUS)
self.Notify() # 实时显示时间
def Notify(self):
t = time.localtime(time.time())
st = time.strftime('%Y-%m-%d %H:%M:%S', t)
self.SetStatusText(st, 1) # 这里的1代表将时间放入状态栏的第二部分上 # 初始化登陆
def InitButton(self):
self.panel_Celan1 = wx.Panel(self, pos=(400, 150), size=(300, 300))
wx.StaticText(self.panel_Celan1,label="Username",pos=(20,20))
wx.StaticText(self.panel_Celan1, label="Password", pos=(20, 50))
self._username=wx.TextCtrl(self.panel_Celan1,pos=(110,15))
self._passwd = wx.TextCtrl(self.panel_Celan1, pos=(110, 45),style=wx.TE_PASSWORD) self._submit_btn=wx.Button(self.panel_Celan1,label=u'提交',pos=(100,100),size=(50,30))
self.panel_Celan1.Bind(wx.EVT_BUTTON,self.Onclick,self._submit_btn) #处理登陆事件
def Onclick(self,event):
global denglu_flag
if event.GetEventObject()==self._submit_btn:
user = self.GetUsername()
passwd = self.GetPasswd()
print(user+":"+passwd)
if(user == "wenli"and passwd == ""):
denglu_flag=True
self.panel_Celan1.Destroy()
self.panel_Celan1_1 =wx.Panel(self, pos=(400, 150), size=(300, 300))
wx.StaticText(self.panel_Celan1_1, label="欢迎登陆", pos=(130, 150))
def GetUsername(self):
return self._username.GetValue() def GetPasswd(self):
return self._passwd.GetValue() #初始化侧栏
def InitCelan(self):
self.panel_Celan = wx.Panel(self, pos=(0, 0), size=(200, 800)) # 创建侧栏画板 
self._background = wx.Image("background.jpg",type = wx.BITMAP_TYPE_ANY,)
self._background = self._background.Rescale(200,150) #改变图像大小
wx.StaticBitmap(self.panel_Celan,-1,wx.BitmapFromImage( self._background)) #显示图像
self._caidan1 = wx.Button(self.panel_Celan, label=u'用户信息', pos=(0, 150), size=(200, 30))
self.panel_Celan.Bind(wx.EVT_BUTTON, self.Onclick_Ce, self._caidan1)
self._caidan2 = wx.Button(self.panel_Celan, label=u'图书馆大厅', pos=(0, 180), size=(200, 30))
self.panel_Celan.Bind(wx.EVT_BUTTON, self.Onclick_Ce, self._caidan2)
self._caidan3 = wx.Button(self.panel_Celan, label=u'公告', pos=(0, 210), size=(200, 30))
self.panel_Celan.Bind(wx.EVT_BUTTON, self.Onclick_Ce, self._caidan3) #处理侧栏的点击事件
def Onclick_Ce(self,event):
global denglu_flag
if event.GetEventObject() == self._caidan1:
# 如果需要显示的地方存在其他面板,删除
if self.panel_Celan2:
self.panel_Celan2.Destroy()
if self.panel_Celan3:
self.panel_Celan3.Destroy()
if not self.panel_Celan1 :
if(denglu_flag == False):
self.InitButton()
else:
if not self.panel_Celan1_1:
self.panel_Celan1_1 = wx.Panel(self, pos=(400, 150), size=(300, 300))
wx.StaticText(self.panel_Celan1_1, label="欢迎登陆", pos=(130, 150)) if event.GetEventObject()==self._caidan2:
# 如果需要显示的地方存在其他面板,删除
if self.panel_Celan1:
self.panel_Celan1.Destroy()
if self.panel_Celan1_1:
self.panel_Celan1_1.Destroy()
if self.panel_Celan3:
self.panel_Celan3.Destroy()
if not self.panel_Celan2 :
self.panel_Celan2 = wx.Panel(self, pos=(200, 0), size=(700, 700)) if event.GetEventObject() == self._caidan3:
if self.panel_Celan1:
self.panel_Celan1.Destroy()
if self.panel_Celan1_1:
self.panel_Celan1_1.Destroy()
if self.panel_Celan2 :
self.panel_Celan2.Destroy()
if not self.panel_Celan3:
self.panel_Celan3 = wx.Panel(self, pos=(400, 150), size=(300, 300))
wx.StaticText(self.panel_Celan3, label="公告", pos=(130, 150)) class App(wx.App): #5 wx.App子类
def __init__(self):
#如果要重写__init__,必须调用wx.App的__init__,否则OnInit方法不会被调用
wx.App.__init__(self)
def OnInit(self):
self.frame=Frame()
self.SetTopWindow(self.frame)
self.frame.Show() return True
if __name__=="__main__":
denglu_flag = False
app = App()
app.MainLoop()

Wxpython pannel切换的更多相关文章

  1. wxpython tab切换页面

    最近没事学习下wxpython,发现很少有关于页面切换的demo,这边分享下2中切换的方法.第一种:利用wx.Notebook第二种:利用Sizer布局实现(自己写的),代码没有涉及到什么重构之类的优 ...

  2. python下wxpython程序国际化的实践(中文英文切换)

    一.什么是python的国际化(I18N) 有关I18N,百度上解释一大堆,个人比较喜欢这个说法. i18n是 Internationalization 这个英文的简写,因为International ...

  3. Python图形界面开发—wxPython库的布局管理及页面切换

    前言 wxPython是基于Python的跨平台GUI扩展库,对wxWidgets( C++ 编写)封装实现.GUI程序的开发中界面布局是很重要的一个部分,合理的页面布局能够给予用户良好使用体验.虽然 ...

  4. wxpython 基本的控件 (文本)

    wxPython 工具包提供了多种不同的窗口部件,包括了本章所提到的基本控件.我们涉及静态文本.可编辑的文本.按钮.微调.滑块.复选框.单选按钮.选择器.列表框.组合框和标尺.对于每种窗口部件,我们将 ...

  5. wxpython 基本的控件 (按钮)

    使用按钮工作 在wxPython 中有很多不同类型的按钮.这一节,我们将讨论文本按钮.位图按钮.开关按钮(toggle buttons )和通用(generic )按钮. 如何生成一个按钮? 在第一部 ...

  6. 通过python切换hosts文件

    做开发或测试时常需要切换hosts ,如果hosts比较多,那么频繁的打开hosts文件对地址加注释(#),再把去掉注释是个繁琐的事情. 当然,SwitchHosts 已经可以帮我们方便的解决了这个繁 ...

  7. 很好用的Tab标签切换功能,延迟Tab切换。

    一个网页,Tab标签的切换是常见的功能,但我发现很少有前端工程师在做该功能的时候,会为用户多想想,如果你觉得鼠标hover到标签上,然后切换到相应的内容,就那么简单的话,你将是一个不合格的前端工程师啊 ...

  8. wxpython分割窗研究(解决sashPosition=0无效的BUG)

    用wxpython开发一个简单的exe其实很简单的,但是在开发的过程中会遇到若干的坑.疑问.甚至bug,让人摸不清头脑!恰恰关于这方面的文档是少之又少,看来看去大家还是在官方的文档上加以引用说明,但是 ...

  9. [Python] wxPython 编辑框组件学习总结 (原创)

    1.总结 1.常用4种 编辑框 的构造 1.普通编辑框 单行输入的简单编辑框 (?为所在框的对象,同下) self.textBox = wx.TextCtrl(parent = ?) 2.密码编辑框 ...

随机推荐

  1. js函数节流和防抖的理解与实现

    一:函数防抖1.理解:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间2.思路:每次触发事件时都取消之前的延时调用方法 3.实现: function debounce ...

  2. HttpClient提交数据

    用代码模拟浏览器的行为 * 轻量级的开源的框架 * Android在6.0 23 以后移除了httpclient ,所以开发中用的少了 * 编写步骤: 1. 打开浏览器 2. 输入网址 3. 敲回车 ...

  3. pipreqs------查找python项目依赖并生成requirement

    一起开发项目的时候总是要搭建环境和部署环境的,这个时候必须得有个python第三方包的list,一般都叫做requirements.txt. 如果一个项目使用时virtualenv环境,还好办 pip ...

  4. openstack compute service list Unable to establish connection to http://controller:8774/v2.1/os-services: ('Connection aborted.', BadStatusLine("''",))

    8774是nova的端口号,所以我就逐一查看nova的日志文件. tail -f /var/log/nova/nova-conductor.log 2019-06-13 08:24:53.559 44 ...

  5. JavaScript(5)—— 变量及数据类型

    JavaScript和Java在概念和设计方面都是完全不同的语言.JavaScript由Brendan Eich于1995年发明,并于1997年成为ECMA标准.ECMA-262是官方名称.ECMAS ...

  6. docker 导出多个镜像合并成一个tar

    导出单个镜像 docker save [images] > [name.tar] 倒出多个镜像合并成一个tar包 docker save [images] [images] > [name ...

  7. dfs入门-cogs1640[黑白图像]

    题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vxSmxkeqa [题目描述] 输入一个n×n的黑白图像(1表示黑色,0表示白色),任务 ...

  8. 2019Java常见面试上

    一.开场白简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要负责的内容:(你的信息一清二白的写在简历上,能答出来的最好写在上面,模棱两可不是很清楚的最好不要写,否则会被问的很尴尬) ...

  9. 【VS开发】VSTO 学习笔记(十)Office 2010 Ribbon开发

    微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个Ribbon中,便于集中管理.操作.这种Ribbon是高度可定制的,用户可 ...

  10. 深入理解C语言-函数指针

    函数指针在C++中有着重要的应用,函数的函数名其本质就是代表一个地址,这个地址叫做函数入口,得到这个地址就可以对这个函数进行各种操作. 函数类型基础 函数三要素: 名称.参数.返回值 C语言中的函数有 ...