首页 > 其他分享 >pystray被隐藏菜单项显示出来的问题

pystray被隐藏菜单项显示出来的问题

时间:2023-11-03 16:11:22浏览次数:18  
标签:text action pystray MenuItem 菜单项 隐藏 cls

背景

pystray可以用来显示托盘,菜单项,以及气泡通知信息。我的程序里面是如下界面,代码参考: https://gitee.com/pmh905001/shouyu/blob/main/shouyu/view/tray.py 。里面有一个功能是点击黄色的小黄鱼托盘图标,默认打开excel的功能。 这是默认的隐藏的菜单项。

由于有开机启动这个复选框,所以这是一个动态菜单,选中和非选中状态都会导致菜单状态发生变化。接着就发现了一个bug,点击开机启动菜单项的时候,会把隐藏的“显示Excel“ 菜单项显示出来,如下图所示:

 实际代码就是

icon.menu=(
MenuItem(text='帮助', action=cls.on_help),
MenuItem(text='设置', action=cls.on_config),
MenuItem(
text='开机启动',
action=cls.on_turn_off_auto_run if is_auto_run else cls.on_turn_on_auto_run,
checked=cls.display_checked,
),
MenuItem(text='重启', action=cls.on_restart),
MenuItem(text='显示Excel', action=cls.on_show, default=True, visible=False),
MenuItem(text='退出', action=cls.on_exit),
)

我的第一感觉是不是pystray的bug?因为我初始化菜单项也是传递一个tuple元组进去,动态菜单也只是修改了菜单的值并且进行了刷新。

pystray.Icon("name", Image.open(Package.get_resource_path('resources/icons/fish.png')), '授渔', cls._menu_items())

分析

经过查找,终于找到了错误的原因,https://github.com/moses-palmer/pystray/blob/master/lib/pystray/_base.py .托盘对象在初始化的时候,作者为了简化用户的传递,允许对menu简单传递一个tuple或者Menu对象,并且把tuple做了转换处理封装成Menu对象。

 setter函数也没有做特殊的声明必须为Menu对象。

 

Menu本身也是可迭代对象,这就是为什么会导致  icon.menu=(item1,item2,)没有出现异常的原因。https://github.com/moses-palmer/pystray/blob/master/lib/pystray/_win32.py。  但是这样会导致隐藏的菜单项会被显示出来,也就是我所遇到的问题。

要解决该问题,实际上需要对setter函数进行修改,能够接受tuple或者Menu对象,就像在构造函数里面一样。 将pull request到pystray 。

 

总结:

为了简化用户的参数传递,通常会简化传递类型,在构造函数里面进行转化。但setter函数不要忘记转化,从而导致bug出现。

 

标签:text,action,pystray,MenuItem,菜单项,隐藏,cls
From: https://www.cnblogs.com/pmh905001/p/17807819.html

相关文章

  • c#实现程序不被关闭,隐藏任务栏
    publicForm1(){InitializeComponent();this.WindowState=System.Windows.Forms.FormWindowState.Maximized;//this.WindowState=FormWindowState.Maximized;this.ShowInTaskbar=false;this.SetVisi......
  • 你以为键入网址后只是等待吗?惊!原来网页显示背后隐藏着这些奇妙步骤(终章)
    引言在前面的讨论中,我们已经详细介绍了计算机网络中的物理层、传输层和网络层以及应用层的工作原理。这些层次组成了一个完整的网络架构,确保了数据的传输和交流。在今天的讨论中,我们将进一步深入探讨数据包从计算机发出后的一系列流程,这涉及到网络设备中的交换机和路由器在其中扮......
  • 你以为键入网址后只是等待吗?惊!原来网页显示背后隐藏着这些奇妙步骤(中)
    引言在之前的讨论中,我们已经对HTTP和DNS协议进行了详细的探讨,这些协议主要用于应用层的通信。然而,今天我们将把重点转移到网络层和传输层的协议上,也就是TCP/IP协议。所以,我们将深入研究这些协议的工作原理和作用。可靠传输-TCPHTTP是一种基于TCP协议传输的协议。在TCP传输数据......
  • Qt第六十五章:自定义菜单栏的隐藏、弹出
    目录一、效果图二、qtDesigner三、ui文件如下:四、代码 一、效果图二、qtDesigner原理是利用属性动画来控制QFrame的minimumWidth属性。①先拖出相应的控件②布局一下 ③填上一些样式 相关QSSbackground-color:rgb(238,242,255);border:2pxsolidrgb(255,255,255);border......
  • 你以为键入网址后只是等待吗?惊!原来网页显示背后隐藏着这些奇妙步骤(上)
    当键入网址后,到网页显示,其间发生了什么在面试过程中,很可能会遇到一个常见的问题,即"当输入一个网址后,到网页显示之间发生了什么"。这个问题的确非常常见,我也喜欢问这个问题,因为它可以帮助我了解面试者对网络部分的应用知识的掌握情况,同时也能够基本囊括网络通信的整个过程。接下......
  • c++中重载、重写、隐藏的区别
    重载:同一个函数的不同表现形式。同一个类中;函数原型不同(函数名相同,参数列表即顺序、个数、类型不同);virtual关键字可有可无。 重写:继承关系中,派生类对基类同名函数有不同的表现形式。有继承关系的类;函数原型相同;基类成员函数必须声明为虚函数(virtual)。 隐藏:继......
  • 如何使用SHC对Shell脚本进行封装和源码隐藏
    在许多情况下,我们需要保护我们的shell脚本源码不被别人轻易查看。这时,使用shc工具将shell脚本编译成二进制文件是一个有效的方法。本文将详细介绍如何在线和离线条件下安装shc,并将其用于编译你的脚本。什么是SHC?shc是一个由C语言编写的Shell脚本加密程序,它可以将你的脚本编译成......
  • html 隐藏元素占位/不占位
    关于循环定时隐藏/显示元素,从而实现一个一闪一闪的效果如图:实现方法:设置display但是display在设为none是不占位置隐藏的display:none;设置visibility而visiblity是占位隐藏visibility:hidden;varnum=true;window.setInterval(()=>{vari=document.......
  • ACCESS ColumnHidden 隐藏字段
    ForEachTEMPInMe.FM刀具项夹表.Form.ControlsIfNotTypeOfTEMPIsLabelThenIfTEMP.Name<>"RecordID"AndTEMP.Name<>"项目"AndTEMP.Name<>"夹位"AndTEMP.Name<>"标准寿命"T......
  • 直播平台制作,对底部虚拟键的显示和隐藏
    直播平台制作,对底部虚拟键的显示和隐藏1.隐藏底部虚拟按钮:  /**  *隐藏虚拟按键  */publicvoidgoneSystemUi(){  //隐藏虚拟按键  if(Build.VERSION.SDK_INT>11&&Build.VERSION.SDK_INT<19){    Viewv=getWindow().getDecorView(); ......