我正在寻找一种跨平台通知的方法,下面是来自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秒钟内消失,却永远挂着。在
窗口并不是“挂起的”——只是试图关闭窗口的代码纯粹是无稽之谈。在
将
window
设置为None
将不会删除该对象,因为它在创建时被分配给名称program
,并且在调用toastDone
方法后,该引用将继续存在。在您应该做的只是将线程的
finished
信号连接到窗口的close
插槽。试试这样的方法:相关问题 更多 >
编程相关推荐