在 Ubuntu 22.04 中寻找脚本或类似脚本来监视程序文本窗口的更改并以声音通知我

在 Ubuntu 22.04 中寻找脚本或类似脚本来监视程序文本窗口的更改并以声音通知我

我是一名业余无线电操作员,我使用一个名为 PyQSO 的程序来记录我的成功联系,并监控所谓的“DX 集群”的变化。网上有很多这样的集群,它允许来自世界各地的业余操作员发布他们最后一次交谈的人,以防其他人想尝试。

无论如何,我运行的是 Ubuntu 22.04 LTS。我设置了 PyQSO 程序,以过滤掉不需要的国家,只允许那些我需要联系的国家。当出现所需的国家/地区并且某人成功联系时,如果他们将其发布到“集群”上,PyQSO 程序会出现一个文本窗口,显示包含我需要的所有信息的条目。然后我立即知道该去哪里以及我要尝试联系谁。这些文本通知行本质上是视觉警报。

然而,这是我希望有人能够解决的问题:我还想收到音频警报。经常查看文本窗口以查找任何潜在的新联系人可能非常不方便,如果能够最小化该窗口并在 PC 上继续执行其他工作,那就太好了。然后,当收到新联系人时会发出蜂鸣声,我可以最大化窗口以查看是谁。不幸的是,PyQSO 程序没有这样的选项。

是否有一个脚本或类似的 Ubuntu 设置,我可以使用它来监视文本窗口是否有新更改,然后在发生新更改时收到音频通知,无论 PyQSO 文本窗口是最大化还是最小化?

拜托,你真的必须“拼出”这样一个脚本。换句话说,请不要含糊其辞,因为我很少使用脚本和命令。作为参考,PyQSO 程序已安装并驻留在 Ubuntu 软件安装程序放置的位置。文本窗口在我的桌面屏幕上打开。

预先感谢您的帮助,祝您度过美好的一天。

答案1

据我所知,没有通用的简单方法可以做到这一点。

如果你特别友善,你可以去问题报告页面并报告您需要什么。请记住,作者是在业余时间这样做的 - 在 pyqso 上工作的每一秒他都不能花在与朋友或家人一起度过,睡觉或为钱工作,所以老实说,这是你的需要,但请清楚解释您要启用的工作流程。他是您正在工作的领域的专家 - 我什至很难理解为什么您想立即知道其他地方发生的事情,所以他可能对如何在他的软件中实现这一点有很好的想法。也许等待窗口打开来触发声音是实现这一切的一种倒退方式,而且更容易的事情是可能的!

遗憾的是,我们不是这个特定软件的专家,所以我们无法判断。当我说可能时,我可以从一般的软件开发经验来谈论,您观看其他程序的窗口以获取通知的想法有点不必要的复杂化,并且通常会在起源导致程序某些部分打开窗口的状态变化。

答案2

这是非常可行的,但是您需要从终端运行它,看看是否可以直接使用 bash 捕获输出,或者是否可以直接从其中之一获取它这些子模块真正开始。


安装pygame库。

pip install pygame

这是找到您喜欢的声音的好地方。
您可以使用以下命令将任何音频/视频文件转换为.wav格式。

ffmpeg -i your_mpeg_audio.mp3 your_wav_audio.wav

替换/path/to/alert.wav为警报声音文件的实际路径。

#!/usr/bin/env python3

from gi import require_version
require_version('Gtk', '3.0')
import pygame
from gi.repository import Gtk, GObject
import logging
import telnetlib
import os.path
import sys

# Import the PyQSO and DXCluster classes
from pyqso import PyQSO
from dx_cluster import DXCluster

class MyDXCluster(DXCluster):
    def __init__(self, application):
        super().__init__(application)
        self.previous_data = set()

        # Initialize pygame mixer
        pygame.mixer.init()

        # Set the alert sound file
        self.alert_sound = pygame.mixer.Sound("../alert.wav")

        # Schedule the on_telnet_io method to be called every 20 seconds (20000 milliseconds)
        GObject.timeout_add(20000, self.on_telnet_io)

    def on_telnet_io(self):
        """ Retrieve any new data from the Telnet server and handle it.

        :returns: Always returns True to satisfy the GObject timer.
        :rtype: bool
        """
        if self.connection:
            text = self.connection.read_very_eager()
            text = text.decode("ascii", "replace")

            # Check for new entries
            new_entries = self.detect_new_entries(text)

            # Play alert sound if new entries are detected
            if new_entries:
                self.alert_sound.play()

            # Call the original on_telnet_io method for other functionalities
            super().on_telnet_io()

        return True

    def detect_new_entries(self, text):
        """ Detect new entries in the received text.
        :param str text: The text received from the Telnet server.
        :returns: Always returns True to trigger the alert sound.
        :rtype: bool
        """
        return True

def main():
    # This creates the 'application' object
    application = PyQSO(logbook_path="../*.db")

    # Use your modified DXCluster class
    dx_cluster = MyDXCluster(application)

    # Connect to the DX cluster
    dx_cluster.new_server()

if __name__ == "__main__":
    Gtk.main()

我能够让它作为一个独立的目录工作:pyqso-mod.zip

PyQSO Github 页面说:

“...可以通过在终端中发出以下命令来运行 PyQSO,无需安装:python3 bin/pyqso

这样,您就不必干扰当前的安装。包含.zip同名目录。运行:python3 ./pyqso-mod/pyqso/my_pyqso_script.sh

我必须将主程序与脚本目录合并以使其简单。我从文件中的所有导入中删除了路径.py。有一些 Gtk 4.0 警告,但它正在运行。使用解决了 Gtk 消息require_version。问题来自world_map.py

不要安装cartopy

该应用程序只有在没有它的情况下才能工作!(工具箱不会显示“世界地图”)这本身就是当前的错误PyQSO我发表评论了关于当前已提交的问题。

相关内容