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