【问题标题】:Why doesn't this pyside window disappear?为什么这个pyside窗口没有消失?
【发布时间】:2015-01-08 17:05:05
【问题描述】:

我正在寻找一种跨平台通知的方法,这里有一些来自 Cross-platform desktop notifier in Python 的代码,经过一些修改使其可以运行:

# uiToast.py
from PySide import QtCore, QtGui
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.resize(547, 96)
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 170, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        MainWindow.setPalette(palette)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.display = QtGui.QTextBrowser(self.centralwidget)
        self.display.setGeometry(QtCore.QRect(0, 0, 551, 101))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(255, 170, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        self.display.setPalette(palette)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.display.setFont(font)
        MainWindow.setCentralWidget(self.centralwidget)


#!/usr/bin/env python3
import sys, time
from PySide import QtCore, QtGui
import uiToast

window = None   # global

# Usage: Toast('Message')
class Toast(QtGui.QMainWindow):
    def __init__(self, msg):
        global window               # some space outside the local stack
        window = self               # save pointer till killed to avoid GC
        QtGui.QMainWindow.__init__(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.ui = uiToast.Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.display.setText(msg)

        self.toastThread = ToastThread()    # start thread to remove display
        self.connect(self.toastThread, QtCore.SIGNAL("finished()"), self.toastDone)
        self.toastThread.start()
        self.show()

    def toastDone(self):
        global window
        window = None               # kill pointer to window object to close it and GC

class ToastThread(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)

    def run(self):
        time.sleep(2.0)             # wait and die



if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    program = Toast("hi")
    program.show()
    sys.exit(app.exec_())

问题是弹出窗口,应该在 2 秒内消失,永远挂起。

【问题讨论】:

    标签: python qt notifications pyside


    【解决方案1】:

    窗口没有“挂起”——只是试图关闭窗口的代码纯属无稽之谈。

    window 设置为None 不会删除对象,因为它在创建时已分配给名称program,并且在调用toastDone 方法后该引用将继续存在。

    您应该做的只是将线程的finished 信号连接到窗口的close 插槽。试试这样的:

    class Toast(QtGui.QMainWindow):
        def __init__(self, msg):
            QtGui.QMainWindow.__init__(self)
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
            self.ui = uiToast.Ui_MainWindow()
            self.ui.setupUi(self)
            self.ui.display.setText(msg)
            self.toastThread = ToastThread()
            self.toastThread.finished.connect(self.close)
            self.toastThread.start()
    
    class ToastThread(QtCore.QThread):
        def run(self):
            time.sleep(2.0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2020-11-16
      • 2018-07-02
      • 2021-02-27
      • 1970-01-01
      相关资源
      最近更新 更多