首页 > 其他分享 >panel绑定主体错误导致事件无法触发问题记录(尺寸异常)

panel绑定主体错误导致事件无法触发问题记录(尺寸异常)

时间:2023-06-25 17:55:23浏览次数:49  
标签:size 触发 parent self 绑定 __ panel1 panel wx

代码实例

#coding:utf-8
#!/usr/bin/env python
#@author: 9527 

import wx

class DelayStatisticalPanel(wx.Panel):
    '''
    @function: 背景板(BOOK)
    @By: 9527
    '''
    def __init__(self,parent):
        super().__init__(parent)  
        self.parent = parent
        
        self.Mainpanel= wx.Panel(self)
        self.Bind(wx.EVT_SIZE, self.on_size) 
        self.Mainpanel.SetBackgroundColour("yellow")
        
        
        self.InfoBook = wx.Notebook(self.Mainpanel, style=wx.BK_DEFAULT|wx.NB_FIXEDWIDTH)
        self.InfoBook.SetBackgroundColour("pink")
        
        vsizer = wx.BoxSizer(wx.VERTICAL)
        vsizer.Add(self.InfoBook, 1, wx.EXPAND)
        self.Mainpanel.SetSizer(vsizer)
        
        
        
        self.page_SCB = StatisticalChartBoard(self.InfoBook)
        self.page_DDL = DetailDataList(self.InfoBook)
        
        self.InfoBook.AddPage(self.page_SCB, u"延期统计")
        self.InfoBook.AddPage(self.page_DDL, u"详细数据")
def on_size(self, event):
        #重绘窗口尺寸(跟随主panel)
        self.Mainpanel.SetSize(self.parent.GetSize())    
        
        self.Mainpanel.Layout()

class StatisticalChartBoard(wx.Panel):
    '''
    @function: 统计图面板
    @By: 9527
    '''
    def __init__(self,parent):
        super().__init__(parent)
        self.parent = parent
        self.SCB_panel1 = wx.ScrolledWindow( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
  
        self.SCB_panel1.SetBackgroundColour("red")
        self.Bind(wx.EVT_SIZE, self.on_size) 
        
        self.SCB_panel1.SetScrollbars(1, 1, 1, 1)# 必须设置滚动条大小,否则无法显示
        
        self.SCB_panel1.Layout()
    
    def on_size(self, event):
        #重绘窗口尺寸(跟随主panel)

        self.SCB_panel1.SetSize(self.parent.GetSize())
        
        self.SCB_panel1.Layout()    
        
class DetailDataList(wx.Panel):
    '''
    @function: 详细数据面板
    @By: 9527
    '''
    def __init__(self,parent):
        super().__init__(parent)  
        self.parent = parent
        self.DDL_panel1 = wx.ScrolledWindow( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
      
       
        self.DDL_panel1.SetBackgroundColour("blue")
        self.Bind(wx.EVT_SIZE, self.on_size) 
        
        self.DDL_panel1.SetScrollbars(1, 1, 1, 1)# 必须设置滚动条大小,否则无法显示
    
        self.DDL_panel1.Layout() 
    
    def on_size(self, event):
        #重绘窗口尺寸(跟随主panel)
    
        self.DDL_panel1.SetSize(self.parent.GetSize()) 
        
        self.DDL_panel1.Layout() 
            

 

注意这里 self.Bind(wx.EVT_SIZE, self.on_size)  绑定在主体self上,而不是类中的某个panel上。这一点很重要,直接决定事件wx.EVT_SIZE会不会触发。

如果像这样self.DDL_panel1.Bind(wx.EVT_SIZE, self.on_size)、self.SCB_panel1.Bind(wx.EVT_SIZE, self.on_size)直接把尺寸改变的事件绑定到类里面的实例上,就会导致事件无法触发,原因可能是实例的父级是当前实例所在的类,而本地类的父级才是变化的面板panel(这里的就是self.InfoBook)。所以无论是DelayStatisticalPanel还是StatisticalChartBoard、DetailDataList都需要用最外层的类上,self.Bind(wx.EVT_SIZE, self.on_size) ,才能使事件发生后触发,并调用on_size函数。

(在wxPython中,当一个事件被触发时,它会被发送到相应的控件。然后,事件将被传递给控件的父级,直到找到处理该事件的处理程序或顶级窗口。)

可以简单的认为,事件的变化结果是逐级传递的,DelayStatisticalPanel→StatisticalChartBoard→panel、DelayStatisticalPanel→DetailDataList→panel。如果不绑定在DelayStatisticalPanel还是StatisticalChartBoard、DetailDataList本身上,就会导致传递断层。

 

标签:size,触发,parent,self,绑定,__,panel1,panel,wx
From: https://www.cnblogs.com/babashi9527/p/17503541.html

相关文章

  • 新建交换机并绑定队列
    新建exchangeName:exchange_approve_carresource_message新建队列Name:clue.approve.carresource.message.queue该队列绑定到exchange_approve_carresource_messageRoutingkey:clue.approve.carresource.message.queue......
  • Konva 内容重叠无法触发点击事件的解决方法
    写在前面:环境:Vue3+Konva+vite在绘制界面时踩坑,主要是关于listening属性的使用在绘制界面时,不免出现有内容重叠的情况,这会影响事件的触发使用设置listening属性可以允许事件穿透,默认为true不可穿透(示例如下)<template><div><divid="mybtn"></div></d......
  • zabbix 监控机器监听的端口 + 触发器 表达式理解
    在zabbixweb页面配置item,监控监听的21端口配置trigger5.{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5                注释:其中www.solutionware.com.cn:system.cpu.load[all,avg1]代表的监控项目,其中主机位www.solutioneare.com.cn,监控的项的key为cp......
  • pybind11绑定类(一)
    一、自定义数据结构-结构体`class_`会创建C++class或struct的绑定。`init()`方法使用类构造函数的参数类型作为模板参数,并包装相应的构造函数;静态成员函数需要使用`class_::def_static`来绑定#include<pybind11/pybind11.h>namespacepy=pybind11;structPet{Pet......
  • 如何将不同类型的Property绑定_使用绑定表达式
    如何将不同类型的Property绑定_使用绑定表达式我们知道,相同的Property可以直接调用bind进行绑定。而不同类型的Property则不能。现在,我想令textProperty和booleanProperty进行绑定:当booleanProperty为true或false时,同步修改textProperty.那么,有何方案?使用......
  • Vue(三):数据绑定(v-bind和v-model)
    数据绑定分为单向数据绑定和双向数据绑定,单向数据绑定就是前面学习的v-bind指令,而双向数据绑定则是下面学习的v-model指令。<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>数据绑定</title><scripttype="text/javascript&qu......
  • 12、zabbix-触发器(trigger)-抓取网卡流量阈值
    1、创建监控项为网络上行下载的触发器   ......
  • 完整的触发顺序
    触发钩子的完整顺序:将路由导航、keep-alive、和组件生命周期钩子结合起来的,触发顺序,假设是从a组件离开,第一次进入b组件:1.beforeRouteLeave:路由组件的组件离开路由前钩子,可取消路由离开。2.beforeEach:路由全局前置守卫,可用于登录验证、全局路由loading等。3.beforeEn......
  • 事件分发三连问:事件是如何从屏幕点击最终到达 Activity 的?CANCEL 事件什么时候会触发?
    一、题面试中提到安卓的事件分发,我们一般都能说到从Activity->Window->DecorView->ViewGroup->View的dispatchTouchEvent流程,这个是最基本的需要掌握的,由此能深入引出一些什么知识点呢?事件是如何从屏幕点击最终到达Activity的?CANCEL事件什么时候会触发?如何解决滑动......
  • apache绑定于127.0.1.1
    Ubuntu下装Apache后,有时候,会绑定的地址为127.0.1.1。即提示信息:apache2:Couldnotreliablydeterminetheserver'sfullyqualifieddomainname,using127.0.1.1forServerName其实只要是127.开头的都一样,都是回环地址。你随便访问一个127.*都访问到的是本机。不过看起来......