Windows 10 Toast Notifications完成后,我的PyQt应用退出了。

问题描述 投票:0回答:1

所以我的代码打开了一个GUI定时器,进行倒计时。看起来是这样的。

根据代码,这个程序最初会从15秒开始倒计时 当它到达零点时,会重新设置为5秒,然后又是15秒。最终的目标是提醒我做某事,每隔几分钟提醒一次。这些初始时间只是为了测试。

所以当计时器为零时,我在等待几秒钟后,它才会重置到初始int。与此同时,我试图显示一个window 10 toast通知,但问题是当它出现时,时钟被卡住了,过了这段时间,应用程序就会关闭。所以基本上我可以看到几秒钟的吐司,但计时器不会重置,应用程序会关闭。

这是我的代码。

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import QtCore
import sys
import time
from win10toast import ToastNotifier
import itertools

DURATION_INT = 15
toaster = ToastNotifier()
TIME_CYCLER = itertools.cycle([15, 5])  # 10 minutes, 10 seconds

def secs_to_minsec(secs: int):
    mins = secs // 60
    secs = secs % 60
    minsec = f'{mins:02}:{secs:02}'
    return minsec

class App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.time_left_int = DURATION_INT
        self.myTimer = QtCore.QTimer(self)

        # App window
        self.app = QApplication(sys.argv)
        self.win = QMainWindow()
        self.win.setGeometry(200, 200, 200, 200)
        self.win.setWindowTitle("test")

        # Widgets
        self.titleLabel = QtWidgets.QLabel(self.win)
        self.titleLabel.setText("Welcome to my app")
        self.titleLabel.move(50,20)

        self.timerLabel = QtWidgets.QLabel(self.win)
        self.timerLabel.move(50,50)
        self.timerLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.timerLabel.setStyleSheet("font: 10pt Helvetica")

        self.startButton = QtWidgets.QPushButton(self.win)
        self.startButton.setText("Start")
        self.startButton.move(50,100)
        self.startButton.clicked.connect(self.startTimer)

        self.stopButton = QtWidgets.QPushButton(self.win)
        self.stopButton.setText("Minimize")
        self.stopButton.move(50,130)

        self.update_gui()

        # Show window
        self.win.show()
        sys.exit(app.exec_())

    def startTimer(self):
        self.time_left_int = next(TIME_CYCLER)

        self.myTimer.timeout.connect(self.timerTimeout)
        self.myTimer.start(1000)

    def timerTimeout(self):
        self.time_left_int -= 1
        if self.time_left_int == 0:
            toaster.show_toast("test", "test", duration=5)
            self.time_left_int = next(TIME_CYCLER)


        self.update_gui()

    def update_gui(self):
        minsec = secs_to_minsec(self.time_left_int)
        self.timerLabel.setText(minsec)

    # def minimize():
    #     pass

app = QtWidgets.QApplication(sys.argv)
main_window = App()
main_window.show()
sys.exit(app.exec_())

也许是我的逻辑有问题 def timerTimeout(self):功能,但根据我的理解,定时器应该达到零,显示通知,复位。self.time_left_int 到下一个值,然后调用 self.update_gui() 的功能。在我的例子中,似乎是 show_toast 是最后的事情。

感谢任何帮助:)

python pyqt
1个回答
0
投票

看来经过进一步研究,面包机有一个 threaded 参数,所以编辑这个参数后,问题就解决了。

toaster.show_toast("test", "test", duration=5, threaded=True)`
© www.soinside.com 2019 - 2024. All rights reserved.