geekdoc-python-zh/docs/pythonlibrary/reading-openvpn-status-data...

3.9 KiB

使用 Python 读取 OpenVPN 状态数据(第 1 页,共 3 页)

原文:https://www.blog.pythonlibrary.org/2008/04/03/reading-openvpn-status-data-with-python/

我正在做一个关于使用 wxPython 和 PyWin32 从正在运行的 OpenVPN 会话中捕获输出的 3 部分系列文章。

我在工作中使用 OpenVPN 连接电脑。我注意到我们当前启动 OpenVPN 的方法是在控制台窗口中,这样就可以监控程序的输出。如果用户碰巧关闭了所述窗口,它将结束 VPN 会话。我认为这是愚蠢的,所以我决定尝试使用 wxPython 包装接口,这样我可以最小化它到系统托盘中,如果我有问题的话,可以根据需要将它带回来检查输出。如果你想跟着做,你需要以下东西:

都拿到了吗?好的。我们继续。首先,创建一个文件夹来存放您的脚本。我们实际上需要一对夫妇来做这件事。

首先,我们要创建一个系统托盘图标。

第一步:选择一个图标(我用的是塔玛林系列中的一个)

步骤 2:一旦有了图标,我们将使用一个名为 img2py 的 wxPython 实用程序,它将把图标或图片转换成 Python 文件。安装 wxPython:\ \ path \ to \ Python 25 \ Lib \ site-packages \ wx-2.8-MSW-unicode \ wx \ tools 后,可以在 Python 文件夹中找到它(根据您的系统需要进行调整)

步骤 3:将图标文件移动到步骤 2 中的目录,并通过单击开始、运行和键入 cmd 打开命令窗口。导航到上面的目录(使用 cd 命令)并运行以下命令:python img 2 py . py-I myicon . ico icon . py

步骤 4:完成后,将 icon.py 文件复制到您创建的保存脚本的文件夹中。这将与一些处理图标化和右键菜单的代码结合在一起。

现在我们将创建系统托盘图标响应鼠标事件所需的逻辑。我在 wxPython 演示中找到了一些代码,它们完成了我所做的大部分工作。所以我复制了一下,稍微修改了一下,适合我的需求。您可以在下面看到最终结果:


import wx
from vpnIcon import getIcon

class VPNIconCtrl(wx.TaskBarIcon):
    TBMENU_RESTORE = wx.NewId()
    TBMENU_CLOSE   = wx.NewId()
    TBMENU_CHANGE  = wx.NewId()

    def __init__(self, frame):
        wx.TaskBarIcon.__init__(self)
        self.frame = frame        

        # Set the image
        tbIcon = getIcon()

        # Give the icon a tooltip
        self.SetIcon(tbIcon, "VPN Status")
        self.imgidx = 1

        # bind some events
        self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate)
        self.Bind(wx.EVT_MENU, self.OnTaskBarActivate, id=self.TBMENU_RESTORE)
        self.Bind(wx.EVT_MENU, self.OnTaskBarClose, id=self.TBMENU_CLOSE)        

    def CreatePopupMenu(self):
        """
        This method is called by the base class when it needs to popup
        the menu for the default EVT_RIGHT_DOWN event.  Just create
        the menu how you want it and return it from this function,
        the base class takes care of the rest.
        """
        menu = wx.Menu()
        menu.Append(self.TBMENU_RESTORE, "View Status")
        menu.AppendSeparator()
        menu.Append(self.TBMENU_CLOSE, "Close Program")

        return menu

    def OnTaskBarActivate(self, evt):
        if self.frame.IsIconized():
            self.frame.Iconize(False)
        if not self.frame.IsShown():
            self.frame.Show(True)
        self.frame.Raise()

    def OnTaskBarClose(self, evt):
        self.Destroy()
        self.frame.Close()

下一次,我们将讨论您需要了解的 win32 代码,在最后一部分,我们将创建 GUI 并将其余部分放在一起。