实现托盘退出功能!
This commit is contained in:
parent
e9f3d2fc50
commit
ecbd96455f
5 changed files with 359 additions and 5 deletions
104
main/main.py
104
main/main.py
|
@ -5,7 +5,7 @@ from PyQt5.QtWidgets import *
|
||||||
from PyQt5.QtCore import Qt, pyqtSignal
|
from PyQt5.QtCore import Qt, pyqtSignal
|
||||||
import configparser
|
import configparser
|
||||||
|
|
||||||
from utils.BasicUtils import get_todo_list, remove_todo_list, change_value
|
from utils.BasicUtils import get_todo_list, remove_todo_list, change_value, read_ini, set_exit_status
|
||||||
from utils.CreateToDo import CreateToDo
|
from utils.CreateToDo import CreateToDo
|
||||||
from utils.QSSLoader import QSSLoader
|
from utils.QSSLoader import QSSLoader
|
||||||
from view.ImportantView import Important
|
from view.ImportantView import Important
|
||||||
|
@ -180,8 +180,10 @@ class MainWidget(QWidget):
|
||||||
self.stackedWidget.addWidget(todo_list)
|
self.stackedWidget.addWidget(todo_list)
|
||||||
|
|
||||||
self.system_listWidget.setItemWidget(item, item.widget)
|
self.system_listWidget.setItemWidget(item, item.widget)
|
||||||
|
|
||||||
def change(self):
|
def change(self):
|
||||||
print(1)
|
print(1)
|
||||||
|
|
||||||
# 点击创建新的分组
|
# 点击创建新的分组
|
||||||
def create_item(self, new_list='新建列表', uid=None):
|
def create_item(self, new_list='新建列表', uid=None):
|
||||||
# 创建一个没有名字的item
|
# 创建一个没有名字的item
|
||||||
|
@ -206,7 +208,7 @@ class MainWidget(QWidget):
|
||||||
self.system_listWidget.takeItem(self.system_listWidget.currentRow())
|
self.system_listWidget.takeItem(self.system_listWidget.currentRow())
|
||||||
|
|
||||||
# 重命名分组
|
# 重命名分组
|
||||||
# todo : 重命名还没做好
|
|
||||||
def rename_item(self):
|
def rename_item(self):
|
||||||
# curRow = self.todo_list.currentRow()
|
# curRow = self.todo_list.currentRow()
|
||||||
# item = self.todo_list.item(curRow)
|
# item = self.todo_list.item(curRow)
|
||||||
|
@ -251,6 +253,104 @@ class MainWindow(QWidget):
|
||||||
# self.main_widget.resize(50, 200)
|
# self.main_widget.resize(50, 200)
|
||||||
self.layout.addWidget(self.main_widget)
|
self.layout.addWidget(self.main_widget)
|
||||||
|
|
||||||
|
self.tray_icon = QSystemTrayIcon(self)
|
||||||
|
self.tray_icon.setIcon(QIcon(os.getcwd() + '/../images/todo_info.svg'))
|
||||||
|
# # self.style().standardIcon(QStyle.SP_ComputerIcon))
|
||||||
|
#
|
||||||
|
# self.checkbox = QCheckBox('最小化')
|
||||||
|
# layout.addWidget(self.checkbox)
|
||||||
|
|
||||||
|
'''
|
||||||
|
Define and add steps to work with the system tray icon
|
||||||
|
show - show window
|
||||||
|
hide - hide window
|
||||||
|
exit - exit from application
|
||||||
|
'''
|
||||||
|
show_action = QAction("显示", self)
|
||||||
|
quit_action = QAction("退出", self)
|
||||||
|
hide_action = QAction("隐藏", self)
|
||||||
|
show_action.triggered.connect(self.show)
|
||||||
|
hide_action.triggered.connect(self.hide)
|
||||||
|
quit_action.triggered.connect(QApplication.instance().quit)
|
||||||
|
tray_menu = QMenu()
|
||||||
|
tray_menu.addAction(show_action)
|
||||||
|
tray_menu.addAction(hide_action)
|
||||||
|
tray_menu.addAction(quit_action)
|
||||||
|
self.tray_icon.setContextMenu(tray_menu)
|
||||||
|
self.tray_icon.show()
|
||||||
|
|
||||||
|
# self.exit_widget = QWidget(self)
|
||||||
|
#
|
||||||
|
# self.exit_widget.setLayout(layout)
|
||||||
|
|
||||||
|
# 关闭窗口时弹出确认消息
|
||||||
|
|
||||||
|
def closeEvent(self, event):
|
||||||
|
# 创建一个消息盒子(提示框)
|
||||||
|
quitMsgBox = QMessageBox()
|
||||||
|
self.save_config = QCheckBox('记住选择')
|
||||||
|
self.save_config.isChecked()
|
||||||
|
quitMsgBox.setCheckBox(self.save_config)
|
||||||
|
# self.save_config.stateChanged.connect(self.save_exit)
|
||||||
|
quitMsgBox.resize(300, 200)
|
||||||
|
# 设置提示框的标题
|
||||||
|
quitMsgBox.setWindowTitle('确认窗口')
|
||||||
|
# 设置提示框的内容
|
||||||
|
quitMsgBox.setText('你确定退出吗?')
|
||||||
|
# 创建两个点击的按钮,修改文本显示内容
|
||||||
|
buttonY = QPushButton('退出程序')
|
||||||
|
|
||||||
|
buttonN = QPushButton('最小化到托盘')
|
||||||
|
# 将两个按钮加到这个消息盒子中去,并指定yes和no的功能
|
||||||
|
style = """
|
||||||
|
/*设置堆栈按钮样式*/
|
||||||
|
QPushButton {
|
||||||
|
/* padding: 3px 20px;*/
|
||||||
|
/* text-align:center;*/
|
||||||
|
background-color:orange;
|
||||||
|
border-radius:15px;
|
||||||
|
}
|
||||||
|
QPushButton:hover {
|
||||||
|
/* padding: 3px 20px;*/
|
||||||
|
/* text-align:center;*/
|
||||||
|
background-color:#dddddd;
|
||||||
|
border-radius:15px;
|
||||||
|
}
|
||||||
|
QPushButton:pressed {
|
||||||
|
/* padding: 3px 20px;*/
|
||||||
|
/* text-align:center;*/
|
||||||
|
background-color:#9f9f9f;
|
||||||
|
border-radius:15px;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
buttonY.setStyleSheet(style)
|
||||||
|
buttonN.setStyleSheet(style)
|
||||||
|
|
||||||
|
quitMsgBox.addButton(buttonY, QMessageBox.YesRole)
|
||||||
|
|
||||||
|
quitMsgBox.addButton(buttonN, QMessageBox.NoRole)
|
||||||
|
exit_status = read_ini('System', 'exitstatus')
|
||||||
|
if exit_status == 'None':
|
||||||
|
# self.center(quitMsgBox)
|
||||||
|
quitMsgBox.exec_()
|
||||||
|
# 判断返回值,如果点击的是Yes按钮,我们就关闭组件和应用,否则就忽略关闭事件
|
||||||
|
if quitMsgBox.clickedButton() == buttonY:
|
||||||
|
if self.save_config.isChecked():
|
||||||
|
set_exit_status('Exit')
|
||||||
|
event.accept()
|
||||||
|
else:
|
||||||
|
if self.save_config.isChecked():
|
||||||
|
set_exit_status('Min')
|
||||||
|
self.hide()
|
||||||
|
event.ignore()
|
||||||
|
elif exit_status == 'Exit':
|
||||||
|
event.accept()
|
||||||
|
elif exit_status == 'Min':
|
||||||
|
# print('Min')
|
||||||
|
self.hide()
|
||||||
|
event.ignore()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
96
test/MinimizeToTray.py
Normal file
96
test/MinimizeToTray.py
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
try:
|
||||||
|
from PyQt5.QtCore import QSize
|
||||||
|
from PyQt5.QtWidgets import (
|
||||||
|
QApplication, QMainWindow,
|
||||||
|
QLabel, QGridLayout, QWidget,
|
||||||
|
QCheckBox, QSystemTrayIcon,
|
||||||
|
QSpacerItem, QSizePolicy, QMenu, QAction, QStyle)
|
||||||
|
except ImportError:
|
||||||
|
from PySide2.QtCore import QSize
|
||||||
|
from PySide2.QtWidgets import (
|
||||||
|
QApplication, QMainWindow,
|
||||||
|
QLabel, QGridLayout, QWidget,
|
||||||
|
QCheckBox, QSystemTrayIcon,
|
||||||
|
QSpacerItem, QSizePolicy, QMenu, QAction, QStyle)
|
||||||
|
|
||||||
|
|
||||||
|
class MainWindow(QMainWindow):
|
||||||
|
"""
|
||||||
|
Сheckbox and system tray icons.
|
||||||
|
Will initialize in the constructor.
|
||||||
|
"""
|
||||||
|
check_box = None
|
||||||
|
tray_icon = None
|
||||||
|
|
||||||
|
# Override the class constructor
|
||||||
|
def __init__(self):
|
||||||
|
# Be sure to call the super class method
|
||||||
|
QMainWindow.__init__(self)
|
||||||
|
|
||||||
|
self.setMinimumSize(QSize(480, 80)) # Set sizes
|
||||||
|
self.setWindowTitle("System Tray Application") # Set a title
|
||||||
|
# Create a central widget
|
||||||
|
central_widget = QWidget(self)
|
||||||
|
# Set the central widget
|
||||||
|
self.setCentralWidget(central_widget)
|
||||||
|
|
||||||
|
grid_layout = QGridLayout(self) # Create a QGridLayout
|
||||||
|
# Set the layout into the central widget
|
||||||
|
central_widget.setLayout(grid_layout)
|
||||||
|
grid_layout.addWidget(
|
||||||
|
QLabel("Application, which can minimize to Tray", self), 0, 0)
|
||||||
|
|
||||||
|
# Add a checkbox, which will depend on the behavior of the program when the window is closed
|
||||||
|
self.check_box = QCheckBox('Minimize to Tray')
|
||||||
|
grid_layout.addWidget(self.check_box, 1, 0)
|
||||||
|
grid_layout.addItem(QSpacerItem(
|
||||||
|
0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding), 2, 0)
|
||||||
|
|
||||||
|
# Init QSystemTrayIcon
|
||||||
|
self.tray_icon = QSystemTrayIcon(self)
|
||||||
|
self.tray_icon.setIcon(
|
||||||
|
self.style().standardIcon(QStyle.SP_ComputerIcon))
|
||||||
|
|
||||||
|
'''
|
||||||
|
Define and add steps to work with the system tray icon
|
||||||
|
show - show window
|
||||||
|
hide - hide window
|
||||||
|
exit - exit from application
|
||||||
|
'''
|
||||||
|
show_action = QAction("Show", self)
|
||||||
|
quit_action = QAction("Exit", self)
|
||||||
|
hide_action = QAction("Hide", self)
|
||||||
|
show_action.triggered.connect(self.show)
|
||||||
|
hide_action.triggered.connect(self.hide)
|
||||||
|
quit_action.triggered.connect(QApplication.instance().quit)
|
||||||
|
tray_menu = QMenu()
|
||||||
|
tray_menu.addAction(show_action)
|
||||||
|
tray_menu.addAction(hide_action)
|
||||||
|
tray_menu.addAction(quit_action)
|
||||||
|
self.tray_icon.setContextMenu(tray_menu)
|
||||||
|
self.tray_icon.show()
|
||||||
|
|
||||||
|
# Override closeEvent, to intercept the window closing event
|
||||||
|
# The window will be closed only if there is no check mark in the check box
|
||||||
|
def closeEvent(self, event):
|
||||||
|
if self.check_box.isChecked():
|
||||||
|
event.ignore()
|
||||||
|
self.hide()
|
||||||
|
self.tray_icon.showMessage(
|
||||||
|
"Tray Program",
|
||||||
|
"Application was minimized to Tray",
|
||||||
|
QSystemTrayIcon.Information,
|
||||||
|
2000
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
mw = MainWindow()
|
||||||
|
mw.show()
|
||||||
|
sys.exit(app.exec_())
|
128
test/SystemTray.py
Normal file
128
test/SystemTray.py
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from PyQt5 import QtWidgets
|
||||||
|
from PyQt5.QtGui import *
|
||||||
|
from PyQt5.QtCore import *
|
||||||
|
from PyQt5.QtWidgets import (
|
||||||
|
QApplication, QMainWindow,
|
||||||
|
QLabel, QGridLayout, QWidget,
|
||||||
|
QCheckBox, QSystemTrayIcon, QFormLayout,
|
||||||
|
QSpacerItem, QSizePolicy, QMenu, QAction, QStyle, QDialog, QPushButton, QMessageBox)
|
||||||
|
|
||||||
|
|
||||||
|
class MessageBox(QMessageBox):
|
||||||
|
def __init__(self):
|
||||||
|
super(MessageBox, self).__init__()
|
||||||
|
save_config = QCheckBox('记住选择')
|
||||||
|
self.layout().addWidget(save_config)
|
||||||
|
|
||||||
|
|
||||||
|
class SystemTray(QWidget):
|
||||||
|
def __init__(self):
|
||||||
|
super(SystemTray, self).__init__()
|
||||||
|
self.resize(500, 400)
|
||||||
|
# layout = QFormLayout()
|
||||||
|
# # self.setLayout(layout)
|
||||||
|
#
|
||||||
|
# label = QLabel('最小化到系统托盘?')
|
||||||
|
# layout.addRow(label)
|
||||||
|
# Init QSystemTrayIcon
|
||||||
|
self.tray_icon = QSystemTrayIcon(self)
|
||||||
|
self.tray_icon.setIcon(QIcon(os.getcwd() + '/../images/todo_info.svg'))
|
||||||
|
# # self.style().standardIcon(QStyle.SP_ComputerIcon))
|
||||||
|
#
|
||||||
|
# self.checkbox = QCheckBox('最小化')
|
||||||
|
# layout.addWidget(self.checkbox)
|
||||||
|
|
||||||
|
'''
|
||||||
|
Define and add steps to work with the system tray icon
|
||||||
|
show - show window
|
||||||
|
hide - hide window
|
||||||
|
exit - exit from application
|
||||||
|
'''
|
||||||
|
show_action = QAction("显示", self)
|
||||||
|
quit_action = QAction("退出", self)
|
||||||
|
hide_action = QAction("隐藏", self)
|
||||||
|
show_action.triggered.connect(self.show)
|
||||||
|
hide_action.triggered.connect(self.hide)
|
||||||
|
quit_action.triggered.connect(QApplication.instance().quit)
|
||||||
|
tray_menu = QMenu()
|
||||||
|
tray_menu.addAction(show_action)
|
||||||
|
tray_menu.addAction(hide_action)
|
||||||
|
tray_menu.addAction(quit_action)
|
||||||
|
self.tray_icon.setContextMenu(tray_menu)
|
||||||
|
self.tray_icon.show()
|
||||||
|
|
||||||
|
# self.exit_widget = QWidget(self)
|
||||||
|
#
|
||||||
|
# self.exit_widget.setLayout(layout)
|
||||||
|
|
||||||
|
# 关闭窗口时弹出确认消息
|
||||||
|
def closeEvent(self, event):
|
||||||
|
# 创建一个消息盒子(提示框)
|
||||||
|
quitMsgBox = QMessageBox()
|
||||||
|
quitMsgBox.resize(300, 200)
|
||||||
|
# 设置提示框的标题
|
||||||
|
quitMsgBox.setWindowTitle('确认窗口')
|
||||||
|
# 设置提示框的内容
|
||||||
|
quitMsgBox.setText('你确定退出吗?')
|
||||||
|
# 创建两个点击的按钮,修改文本显示内容
|
||||||
|
buttonY = QPushButton('退出程序')
|
||||||
|
|
||||||
|
buttonN = QPushButton('最小化到托盘')
|
||||||
|
# 将两个按钮加到这个消息盒子中去,并指定yes和no的功能
|
||||||
|
style = """
|
||||||
|
/*设置堆栈按钮样式*/
|
||||||
|
QPushButton {
|
||||||
|
/* padding: 3px 20px;*/
|
||||||
|
/* text-align:center;*/
|
||||||
|
background-color:orange;
|
||||||
|
border-radius:15px;
|
||||||
|
}
|
||||||
|
QPushButton:hover {
|
||||||
|
/* padding: 3px 20px;*/
|
||||||
|
/* text-align:center;*/
|
||||||
|
background-color:#dddddd;
|
||||||
|
border-radius:15px;
|
||||||
|
}
|
||||||
|
QPushButton:pressed {
|
||||||
|
/* padding: 3px 20px;*/
|
||||||
|
/* text-align:center;*/
|
||||||
|
background-color:#9f9f9f;
|
||||||
|
border-radius:15px;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
buttonY.setStyleSheet(style)
|
||||||
|
buttonN.setStyleSheet(style)
|
||||||
|
|
||||||
|
quitMsgBox.addButton(buttonY, QMessageBox.YesRole)
|
||||||
|
|
||||||
|
quitMsgBox.addButton(buttonN, QMessageBox.NoRole)
|
||||||
|
quitMsgBox.exec_()
|
||||||
|
# 判断返回值,如果点击的是Yes按钮,我们就关闭组件和应用,否则就忽略关闭事件
|
||||||
|
if quitMsgBox.clickedButton() == buttonY:
|
||||||
|
event.accept()
|
||||||
|
else:
|
||||||
|
self.hide()
|
||||||
|
event.ignore()
|
||||||
|
|
||||||
|
# if self.checkbox.isChecked():
|
||||||
|
# event.ignore()
|
||||||
|
# self.hide()
|
||||||
|
# if self.check_box.isChecked():
|
||||||
|
# event.ignore()
|
||||||
|
# self.hide()
|
||||||
|
# self.tray_icon.showMessage(
|
||||||
|
# "Tray Program",
|
||||||
|
# "Application was minimized to Tray",
|
||||||
|
# QSystemTrayIcon.Information,
|
||||||
|
# 2000
|
||||||
|
# )
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
main = SystemTray()
|
||||||
|
main.show()
|
||||||
|
sys.exit(app.exec_())
|
|
@ -2,6 +2,7 @@ import json
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
import configparser
|
||||||
|
|
||||||
|
|
||||||
def return_work_dir():
|
def return_work_dir():
|
||||||
|
@ -189,6 +190,35 @@ def remove_todo_list(uid):
|
||||||
# print(os.path.join(root, name))
|
# print(os.path.join(root, name))
|
||||||
os.remove(os.path.join(root, name))
|
os.remove(os.path.join(root, name))
|
||||||
|
|
||||||
|
|
||||||
|
def read_ini(section, key):
|
||||||
|
config_path = return_work_dir()
|
||||||
|
try:
|
||||||
|
ini_path = config_path + 'PyQtToDoList.ini'
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read(ini_path)
|
||||||
|
return config[section][key]
|
||||||
|
except Exception as e:
|
||||||
|
print('<BasicUtils>', e)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def set_exit_status(status):
|
||||||
|
config_path = return_work_dir()
|
||||||
|
try:
|
||||||
|
ini_path = config_path + 'PyQtToDoList.ini'
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read(ini_path)
|
||||||
|
config['System']['exitstatus'] = status
|
||||||
|
# print(config['S'])
|
||||||
|
with open(ini_path, 'w') as f:
|
||||||
|
config.write(f)
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
print('<BasicUtils>', e)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
# print(read_init_file())
|
# print(read_init_file())
|
||||||
# webdav_hostname = read_init_file()
|
# webdav_hostname = read_init_file()
|
||||||
# print(webdav_hostname[2])
|
# print(webdav_hostname[2])
|
||||||
|
@ -197,3 +227,5 @@ def remove_todo_list(uid):
|
||||||
# print(load_myday_important('Important'))
|
# print(load_myday_important('Important'))
|
||||||
# change_myday_important_conf('Important', 'theme', 2)
|
# change_myday_important_conf('Important', 'theme', 2)
|
||||||
# print(get_myday_important_conf('Important','Theme'))
|
# print(get_myday_important_conf('Important','Theme'))
|
||||||
|
# print(read_ini('System', 'exitstatus'))
|
||||||
|
# print(set_exit_status('Min'))
|
||||||
|
|
|
@ -3,7 +3,6 @@ import platform
|
||||||
import os
|
import os
|
||||||
from utils import BasicUtils
|
from utils import BasicUtils
|
||||||
|
|
||||||
|
|
||||||
# todo : 用来创建软件的配置信息
|
# todo : 用来创建软件的配置信息
|
||||||
from utils.BasicUtils import return_work_dir
|
from utils.BasicUtils import return_work_dir
|
||||||
|
|
||||||
|
@ -49,7 +48,7 @@ class CreateConfigure:
|
||||||
|
|
||||||
}
|
}
|
||||||
config['Account'] = options
|
config['Account'] = options
|
||||||
config['ToDoList'] = {}
|
config['System'] = {'exitStatus': 'None'}
|
||||||
|
|
||||||
with open(config_file, 'w') as f:
|
with open(config_file, 'w') as f:
|
||||||
config.write(f)
|
config.write(f)
|
||||||
|
@ -64,5 +63,4 @@ class CreateConfigure:
|
||||||
# elif platform.system() == 'Windows':
|
# elif platform.system() == 'Windows':
|
||||||
# return os.getcwd() + '/PyQtToDoList.ini'
|
# return os.getcwd() + '/PyQtToDoList.ini'
|
||||||
|
|
||||||
|
|
||||||
# CreateConfigure('NextCloud', 'admin', '19990903@lyp', 'https://cloud.liyp.cc')
|
# CreateConfigure('NextCloud', 'admin', '19990903@lyp', 'https://cloud.liyp.cc')
|
||||||
|
|
Loading…
Reference in a new issue