Проблема с выполнением "Пока" l oop, используя системный трей на Python - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь создать приложение, которое запускает блок кода каждые X секунд, у которого есть иконка в системном трее только с параметром «Выход». Но проблема в том, что когда он попадает в функцию tray, он не читает следующие строки кода, и в результате «Пока» l oop не может быть запущен. Есть ли другой способ сделать это?

import time
import os
import sys
from PySide2 import QtWidgets, QtGui

class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self, icon, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, icon, parent)
        self.setToolTip(f'Wallpy')
        menu = QtWidgets.QMenu(parent)

        exit_ = menu.addAction("Exit")
        exit_.triggered.connect(lambda: sys.exit())

        menu.addSeparator()
        self.setContextMenu(menu)


def tray():
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    tray_icon = SystemTrayIcon(QtGui.QIcon("tray.ico"), w)
    tray_icon.show()
    app.exec_()


def loop_function():
    print("Nice") # anything executable


tray() # launch tray icon


while True:
    loop_function() # executing every minute
    time.sleep(60)

1 Ответ

0 голосов
/ 18 января 2020

Это потому, что когда вы использовали tray(), ваше основное приложение запустилось, и GUI main l oop было запущено. Он работает до выхода из вашего приложения, после чего выполняется while loop.

Однако, если вы хотите, чтобы l oop запускался одновременно, вы должны интегрировать его с основным * *1004* l * 1014. *. В Gtk мы делаем это, используя GLib.add_main_thread и другие методы, о Qt я не знаю, но вы можете использовать это общее решение, используя Threading.

from threading import Thread
import time
import os
import sys
from PySide2 import QtWidgets, QtGui


def loop_function():
    print("Nice") # anything executable

def thread_loop():
    while True:
        loop_function() # executing every minute
        time.sleep(60)

class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self, icon, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, icon, parent)
        self.setToolTip(f'Wallpy')
        menu = QtWidgets.QMenu(parent)

        exit_ = menu.addAction("Exit")
        exit_.triggered.connect(lambda: sys.exit())

        menu.addSeparator()
        self.setContextMenu(menu)


def tray():
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    tray_icon = SystemTrayIcon(QtGui.QIcon("tray.ico"), w)
    tray_icon.show()
    app.exec_()

my_loop = Thread(target=thread_loop, args=()) # Start the thread with no args
my_loop.start()
tray() # launch tray icon
...