Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在我的python框架和任务栏图标之间通信 处境_Python_Wxpython - Fatal编程技术网

如何在我的python框架和任务栏图标之间通信 处境

如何在我的python框架和任务栏图标之间通信 处境,python,wxpython,Python,Wxpython,我不熟悉python和wxPython,目前正在开发一个小型(仅针对linux)脚本,它具有一个托盘图标(任务栏图标)和一个主窗口(框架) 我现在意识到一个我不知道如何处理的问题 左键单击我的任务栏图标可以切换主UI的可见性(.Show()&.Hide()),但我不知道如何处理框架对象 左键单击当前正在触发左键向下的方法,该方法充当虚拟对象 我尽可能地精简了这篇文章的代码,希望能有所帮助 代码 首先,请检查您正在尝试完成的工作示例 这里有一些问题 您需要注册wx.EVT\u CLOSE,并

我不熟悉python和wxPython,目前正在开发一个小型(仅针对linux)脚本,它具有一个托盘图标(任务栏图标)和一个主窗口(框架)

我现在意识到一个我不知道如何处理的问题

  • 左键单击我的任务栏图标可以切换主UI的可见性(.Show()&.Hide()),但我不知道如何处理框架对象
  • 左键单击当前正在触发左键向下的方法,该方法充当虚拟对象
我尽可能地精简了这篇文章的代码,希望能有所帮助

代码 首先,请检查您正在尝试完成的工作示例

这里有一些问题

  • 您需要注册
    wx.EVT\u CLOSE
    ,并正确处理关闭事件
  • 要设置主框架的样式,应在默认样式的顶部应用wx.NO_BORDER。否则,您的窗口将不会最小化
  • 在托盘图标退出时的
    内,您应该通过
    wx.CallAfter(self.frame.Close)
有关上述提示的应用程序,请参见以下代码:

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(windowWidth,windowHeight), style=wx.DEFAULT_FRAME_STYLE | wx.NO_BORDER) # Frame without borders
        self.tbicon = TaskBarIcon(self)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

    def OnCloseWindow(self, evt):
        self.tbicon.RemoveIcon()
        self.tbicon.Destroy()

        self.Destroy()
        wx.GetApp().ExitMainLoop()

        evt.Skip()
TaskBarIcon
的修改:

class TaskBarIcon(wx.TaskBarIcon):
    def on_left_down(self, event):
        print('on_left_down of tray icon')
        if self.frame.IsIconized():
            self.frame.Iconize(False)
        if not self.frame.IsShown():
            self.frame.Show(True)
        self.frame.Raise()

    def openPrefsFromMenu(self, event):
        print('open prefs from menu')

    def on_exit(self, event):
        wx.CallAfter(self.frame.Close)
首先,请检查您正在尝试完成的工作示例

这里有一些问题

  • 您需要注册
    wx.EVT\u CLOSE
    ,并正确处理关闭事件
  • 要设置主框架的样式,应在默认样式的顶部应用wx.NO_BORDER。否则,您的窗口将不会最小化
  • 在托盘图标退出时的
    内,您应该通过
    wx.CallAfter(self.frame.Close)
有关上述提示的应用程序,请参见以下代码:

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(windowWidth,windowHeight), style=wx.DEFAULT_FRAME_STYLE | wx.NO_BORDER) # Frame without borders
        self.tbicon = TaskBarIcon(self)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

    def OnCloseWindow(self, evt):
        self.tbicon.RemoveIcon()
        self.tbicon.Destroy()

        self.Destroy()
        wx.GetApp().ExitMainLoop()

        evt.Skip()
TaskBarIcon
的修改:

class TaskBarIcon(wx.TaskBarIcon):
    def on_left_down(self, event):
        print('on_left_down of tray icon')
        if self.frame.IsIconized():
            self.frame.Iconize(False)
        if not self.frame.IsShown():
            self.frame.Show(True)
        self.frame.Raise()

    def openPrefsFromMenu(self, event):
        print('open prefs from menu')

    def on_exit(self, event):
        wx.CallAfter(self.frame.Close)

谢谢@Selçuk Cihan,这对我帮助很大。我唯一不明白的是在默认样式的顶部应用“wx.NO_边框”。我想我得找一下。到目前为止,我返回到一个带有窗口按钮的普通窗口。我需要使用默认样式,否则框架根本不会最小化到托盘(这里是windows 10+wxPython 3.0.2.0)<代码>wx.DEFAULT_FRAME_样式:定义为wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_菜单| wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_子项。
。如果一切都很好,只要
wx.无边框
没问题。但是通常你也会加入一些其他的样式标志,以使窗口可用。使用
wx.MINIMIZE\u BOX
似乎很重要。我现在使用的是
wx.MINIMIZE_-BOX | wx.CLIP_-CHILDREN | wx.STAY_-ON_-TOP | wx.NO|u-BORDER | wx.FRAME_-shape
,功能和外观都很好。再次感谢您的帮助谢谢@Selçuk Cihan对我的帮助。我唯一不明白的是在默认样式的顶部应用“wx.NO_边框”。我想我得找一下。到目前为止,我返回到一个带有窗口按钮的普通窗口。我需要使用默认样式,否则框架根本不会最小化到托盘(这里是windows 10+wxPython 3.0.2.0)<代码>wx.DEFAULT_FRAME_样式:定义为wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_菜单| wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_子项。
。如果一切都很好,只要
wx.无边框
没问题。但是通常你也会加入一些其他的样式标志,以使窗口可用。使用
wx.MINIMIZE\u BOX
似乎很重要。我现在使用的是
wx.MINIMIZE_-BOX | wx.CLIP_-CHILDREN | wx.STAY_-ON_-TOP | wx.NO|u-BORDER | wx.FRAME_-shape
,功能和外观都很好。再次感谢您的大力帮助