commit
cefde74a2f
|
@ -6,32 +6,50 @@ import textwrap
|
||||||
import pickle
|
import pickle
|
||||||
import base64
|
import base64
|
||||||
import calendar
|
import calendar
|
||||||
try:
|
|
||||||
from PySide2.QtWidgets import QApplication, QLabel, QWidget, QLineEdit, QComboBox, QFormLayout, QVBoxLayout, \
|
FORCE_PYQT5 = False
|
||||||
QHBoxLayout, QListWidget, QDial, QTableWidget
|
|
||||||
from PySide2.QtWidgets import QSlider, QCheckBox, QRadioButton, QSpinBox, QPushButton, QTextEdit, QMainWindow, QDialog, QAbstractItemView
|
if not FORCE_PYQT5:
|
||||||
from PySide2.QtWidgets import QSpacerItem, QFrame, QGroupBox, QTextBrowser, QPlainTextEdit, QButtonGroup, QFileDialog, QTableWidget, QTabWidget, QTabBar, QTreeWidget, QTreeWidgetItem, QLayout, QTreeWidgetItemIterator, QProgressBar
|
try:
|
||||||
from PySide2.QtWidgets import QTableWidgetItem, QGraphicsView, QGraphicsScene, QGraphicsItemGroup, QMenu, QMenuBar, QAction, QSystemTrayIcon
|
from PySide2.QtWidgets import QApplication, QLabel, QWidget, QLineEdit, QComboBox, QFormLayout, QVBoxLayout, \
|
||||||
from PySide2.QtGui import QPainter, QPixmap, QPen, QColor, QBrush, QPainterPath, QFont, QImage, QIcon
|
QHBoxLayout, QListWidget, QDial, QTableWidget
|
||||||
from PySide2.QtCore import Qt,QProcess, QEvent
|
from PySide2.QtWidgets import QSlider, QCheckBox, QRadioButton, QSpinBox, QPushButton, QTextEdit, QMainWindow, QDialog, QAbstractItemView
|
||||||
import PySide2.QtGui as QtGui
|
from PySide2.QtWidgets import QSpacerItem, QFrame, QGroupBox, QTextBrowser, QPlainTextEdit, QButtonGroup, QFileDialog, QTableWidget, QTabWidget, QTabBar, QTreeWidget, QTreeWidgetItem, QLayout, QTreeWidgetItemIterator, QProgressBar
|
||||||
import PySide2.QtCore as QtCore
|
from PySide2.QtWidgets import QTableWidgetItem, QGraphicsView, QGraphicsScene, QGraphicsItemGroup, QMenu, QMenuBar, QAction, QSystemTrayIcon
|
||||||
import PySide2.QtWidgets as QtWidgets
|
from PySide2.QtGui import QPainter, QPixmap, QPen, QColor, QBrush, QPainterPath, QFont, QImage, QIcon
|
||||||
using_pyqt5 = False
|
from PySide2.QtCore import Qt,QProcess, QEvent
|
||||||
except:
|
import PySide2.QtGui as QtGui
|
||||||
|
import PySide2.QtCore as QtCore
|
||||||
|
import PySide2.QtWidgets as QtWidgets
|
||||||
|
using_pyqt5 = False
|
||||||
|
except:
|
||||||
|
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QLineEdit, QComboBox, QFormLayout, QVBoxLayout, \
|
||||||
|
QHBoxLayout, QListWidget, QDial, QTableWidget
|
||||||
|
from PyQt5.QtWidgets import QSlider, QCheckBox, QRadioButton, QSpinBox, QPushButton, QTextEdit, QMainWindow, QDialog, QAbstractItemView
|
||||||
|
from PyQt5.QtWidgets import QSpacerItem, QFrame, QGroupBox, QTextBrowser, QPlainTextEdit, QButtonGroup, QFileDialog, QTableWidget, QTabWidget, QTabBar, QTreeWidget, QTreeWidgetItem, QLayout, QTreeWidgetItemIterator, QProgressBar
|
||||||
|
from PyQt5.QtWidgets import QTableWidgetItem, QGraphicsView, QGraphicsScene, QGraphicsItemGroup, QMenu, QMenuBar, QAction, QSystemTrayIcon
|
||||||
|
from PyQt5.QtGui import QPainter, QPixmap, QPen, QColor, QBrush, QPainterPath, QFont, QImage, QIcon
|
||||||
|
from PyQt5.QtCore import Qt,QProcess, QEvent
|
||||||
|
import PyQt5.QtGui as QtGui
|
||||||
|
import PyQt5.QtCore as QtCore
|
||||||
|
import PyQt5.QtWidgets as QtWidgets
|
||||||
|
using_pyqt5 = True
|
||||||
|
else:
|
||||||
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QLineEdit, QComboBox, QFormLayout, QVBoxLayout, \
|
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QLineEdit, QComboBox, QFormLayout, QVBoxLayout, \
|
||||||
QHBoxLayout, QListWidget, QDial, QTableWidget
|
QHBoxLayout, QListWidget, QDial, QTableWidget
|
||||||
from PyQt5.QtWidgets import QSlider, QCheckBox, QRadioButton, QSpinBox, QPushButton, QTextEdit, QMainWindow, QDialog, QAbstractItemView
|
from PyQt5.QtWidgets import QSlider, QCheckBox, QRadioButton, QSpinBox, QPushButton, QTextEdit, QMainWindow, \
|
||||||
from PyQt5.QtWidgets import QSpacerItem, QFrame, QGroupBox, QTextBrowser, QPlainTextEdit, QButtonGroup, QFileDialog, QTableWidget, QTabWidget, QTabBar, QTreeWidget, QTreeWidgetItem, QLayout, QTreeWidgetItemIterator, QProgressBar
|
QDialog, QAbstractItemView
|
||||||
from PyQt5.QtWidgets import QTableWidgetItem, QGraphicsView, QGraphicsScene, QGraphicsItemGroup, QMenu, QMenuBar, QAction
|
from PyQt5.QtWidgets import QSpacerItem, QFrame, QGroupBox, QTextBrowser, QPlainTextEdit, QButtonGroup, QFileDialog, \
|
||||||
|
QTableWidget, QTabWidget, QTabBar, QTreeWidget, QTreeWidgetItem, QLayout, QTreeWidgetItemIterator, QProgressBar
|
||||||
|
from PyQt5.QtWidgets import QTableWidgetItem, QGraphicsView, QGraphicsScene, QGraphicsItemGroup, QMenu, QMenuBar, \
|
||||||
|
QAction, QSystemTrayIcon
|
||||||
from PyQt5.QtGui import QPainter, QPixmap, QPen, QColor, QBrush, QPainterPath, QFont, QImage, QIcon
|
from PyQt5.QtGui import QPainter, QPixmap, QPen, QColor, QBrush, QPainterPath, QFont, QImage, QIcon
|
||||||
from PyQt5.QtCore import Qt,QProcess, QEvent
|
from PyQt5.QtCore import Qt, QProcess, QEvent
|
||||||
import PyQt5.QtGui as QtGui
|
import PyQt5.QtGui as QtGui
|
||||||
import PyQt5.QtCore as QtCore
|
import PyQt5.QtCore as QtCore
|
||||||
import PyQt5.QtWidgets as QtWidgets
|
import PyQt5.QtWidgets as QtWidgets
|
||||||
using_pyqt5 = True
|
using_pyqt5 = True
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
The QT version if PySimpleGUI.
|
The QT version if PySimpleGUI.
|
||||||
Still being developed. Very limited features. Been in development for less than 2 days so don't expect much!!
|
Still being developed. Very limited features. Been in development for less than 2 days so don't expect much!!
|
||||||
|
@ -200,10 +218,14 @@ ThisRow = 555666777 # magic number
|
||||||
MESSAGE_BOX_LINE_WIDTH = 60
|
MESSAGE_BOX_LINE_WIDTH = 60
|
||||||
|
|
||||||
# "Special" Key Values.. reserved
|
# "Special" Key Values.. reserved
|
||||||
|
# Events that are pre-defined
|
||||||
# Key representing a Read timeout
|
# Key representing a Read timeout
|
||||||
TIMEOUT_KEY = '__TIMEOUT__'
|
TIMEOUT_KEY = '__TIMEOUT__'
|
||||||
# Key indicating should not create any return values for element
|
# Key indicating should not create any return values for element
|
||||||
WRITE_ONLY_KEY = '__WRITE ONLY__'
|
WRITE_ONLY_KEY = '__WRITE ONLY__'
|
||||||
|
EVENT_SYSTEM_TRAY_ICON_DOUBLE_CLICKED = '__DOUBLE_CLICKED__'
|
||||||
|
EVENT_SYSTEM_TRAY_ICON_ACTIVATED = '__ACTIVATED__'
|
||||||
|
EVENT_SYSTEM_TRAY_MESSAGE_CLICKED = '__MESSAGE_CLICKED__'
|
||||||
|
|
||||||
# Meny key indicator character / string
|
# Meny key indicator character / string
|
||||||
MENU_KEY_SEPARATOR = '::'
|
MENU_KEY_SEPARATOR = '::'
|
||||||
|
@ -2669,13 +2691,13 @@ class SystemTray:
|
||||||
self.Menu = menu
|
self.Menu = menu
|
||||||
self.TrayIcon = None
|
self.TrayIcon = None
|
||||||
self.Shown = False
|
self.Shown = False
|
||||||
self.MenuItemChosen = None
|
self.MenuItemChosen = TIMEOUT_KEY
|
||||||
self.Tooltip = tooltip
|
self.Tooltip = tooltip
|
||||||
|
|
||||||
global _my_windows
|
global _my_windows
|
||||||
|
|
||||||
if _my_windows.QTApplication is None:
|
if _my_windows.QTApplication is None:
|
||||||
_my_windows.QTApplication = QApplication()
|
_my_windows.QTApplication = QApplication(sys.argv)
|
||||||
self.App = _my_windows.QTApplication
|
self.App = _my_windows.QTApplication
|
||||||
self.QWidget = QWidget()
|
self.QWidget = QWidget()
|
||||||
|
|
||||||
|
@ -2705,7 +2727,7 @@ class SystemTray:
|
||||||
self.TrayIcon.setToolTip(str(self.Tooltip))
|
self.TrayIcon.setToolTip(str(self.Tooltip))
|
||||||
|
|
||||||
self.TrayIcon.messageClicked.connect(self.messageClicked)
|
self.TrayIcon.messageClicked.connect(self.messageClicked)
|
||||||
|
self.TrayIcon.activated.connect(self.doubleClicked)
|
||||||
self.TrayIcon.setContextMenu(qmenu)
|
self.TrayIcon.setContextMenu(qmenu)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2715,10 +2737,19 @@ class SystemTray:
|
||||||
|
|
||||||
# callback function when message is clicked
|
# callback function when message is clicked
|
||||||
def messageClicked(self):
|
def messageClicked(self):
|
||||||
self.MenuItemChosen = '_MESSAGE_CLICKED_'
|
self.MenuItemChosen = EVENT_SYSTEM_TRAY_MESSAGE_CLICKED
|
||||||
self.App.exit()
|
self.App.exit()
|
||||||
|
|
||||||
|
|
||||||
|
def doubleClicked(self, reason):
|
||||||
|
# print(reason)
|
||||||
|
if reason == QSystemTrayIcon.DoubleClick:
|
||||||
|
self.MenuItemChosen = EVENT_SYSTEM_TRAY_ICON_DOUBLE_CLICKED
|
||||||
|
self.App.exit()
|
||||||
|
if reason == QSystemTrayIcon.Trigger:
|
||||||
|
self.MenuItemChosen = EVENT_SYSTEM_TRAY_ICON_ACTIVATED
|
||||||
|
self.App.exit()
|
||||||
|
|
||||||
def Read(self, timeout=None):
|
def Read(self, timeout=None):
|
||||||
'''
|
'''
|
||||||
Reads the context menu
|
Reads the context menu
|
||||||
|
@ -2730,13 +2761,15 @@ class SystemTray:
|
||||||
self.TrayIcon.show()
|
self.TrayIcon.show()
|
||||||
if timeout is None:
|
if timeout is None:
|
||||||
self.App.exec_()
|
self.App.exec_()
|
||||||
|
else:
|
||||||
|
self.App.processEvents()
|
||||||
else:
|
else:
|
||||||
if timeout is None:
|
if timeout is None:
|
||||||
self.App.exec_()
|
self.App.exec_()
|
||||||
else:
|
else:
|
||||||
self.App.processEvents()
|
self.App.processEvents()
|
||||||
item = self.MenuItemChosen
|
item = self.MenuItemChosen
|
||||||
self.MenuItemChosen = None
|
self.MenuItemChosen = TIMEOUT_KEY
|
||||||
return item
|
return item
|
||||||
|
|
||||||
|
|
||||||
|
@ -3060,6 +3093,9 @@ class Window:
|
||||||
else:
|
else:
|
||||||
if not self.XFound and self.Timeout != 0 and self.Timeout is not None and self.ReturnValues[0] is None: # Special Qt case because returning for no reason so fake timeout
|
if not self.XFound and self.Timeout != 0 and self.Timeout is not None and self.ReturnValues[0] is None: # Special Qt case because returning for no reason so fake timeout
|
||||||
self.ReturnValues = self.TimeoutKey, self.ReturnValues[1] # fake a timeout
|
self.ReturnValues = self.TimeoutKey, self.ReturnValues[1] # fake a timeout
|
||||||
|
elif not self.XFound: # TODO HIGHLY EXPERIMENTAL... added due to tray icon interaction
|
||||||
|
# print("*** Faking timeout ***")
|
||||||
|
self.ReturnValues = self.TimeoutKey, self.ReturnValues[1] # fake a timeout
|
||||||
return self.ReturnValues
|
return self.ReturnValues
|
||||||
|
|
||||||
def _ReadNonBlocking(self):
|
def _ReadNonBlocking(self):
|
||||||
|
|
|
@ -154,7 +154,7 @@ These Elements are "complete" (a relative term... more are more complete than ot
|
||||||
Notable MISSING features at the moment include:
|
Notable MISSING features at the moment include:
|
||||||
* Graphs Element Methods - erasing, draw arc, etc
|
* Graphs Element Methods - erasing, draw arc, etc
|
||||||
|
|
||||||
# New PySimpleGUI Features
|
# New PySimpleGUI Features only in Qt
|
||||||
|
|
||||||
There are a number of new features that are only available in PySimpleGUIQt. These include:
|
There are a number of new features that are only available in PySimpleGUIQt. These include:
|
||||||
* ButtonMenu Element
|
* ButtonMenu Element
|
||||||
|
@ -208,7 +208,7 @@ while True:
|
||||||
```
|
```
|
||||||
## SystemTray Methods
|
## SystemTray Methods
|
||||||
|
|
||||||
### Read - Read the context menu
|
### Read - Read the context menu or check for events
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def Read(timeout=None):
|
def Read(timeout=None):
|
||||||
|
@ -219,6 +219,15 @@ def Read(timeout=None):
|
||||||
'''
|
'''
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Read special return values
|
||||||
|
|
||||||
|
In addition to Menu Items, the Read call can return several special values. They include:
|
||||||
|
|
||||||
|
EVENT_SYSTEM_TRAY_ICON_DOUBLE_CLICKED - Tray icon was double clicked
|
||||||
|
EVENT_SYSTEM_TRAY_ICON_ACTIVATED - Tray icon was single clicked
|
||||||
|
EVENT_SYSTEM_TRAY_MESSAGE_CLICKED - a message balloon was clicked
|
||||||
|
TIMEOUT_KEY is returned if no events are available if the timeout value is set in the Read call
|
||||||
|
|
||||||
### Hide
|
### Hide
|
||||||
|
|
||||||
Hides the icon
|
Hides the icon
|
||||||
|
@ -254,6 +263,17 @@ def ShowMessage(title, message, filename=None, data=None, data_base64=None, time
|
||||||
'''
|
'''
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Menus with Keys
|
||||||
|
|
||||||
|
PySimpleGUIQt offers the ability to add a key to your menu items. To do so, you add :: and the key value to the end of your menu definition.
|
||||||
|
|
||||||
|
`menu_def = ['File', ['Hide::key', '&Open::key', '&Save',['1', '2', ['a','b']], '&Properties', 'E&xit']]`
|
||||||
|
|
||||||
|
The menu definition adds a key "key" to the menu entries Hide and Open.
|
||||||
|
|
||||||
|
If you want to change the separator characters from :: top something else,change the variable `MENU_KEY_SEPARATOR`
|
||||||
|
|
||||||
|
When a menu item has a key and it is chosen, then entire string is returned. If Hide were selected, then Hide::key would be returned from the Read. Note that the shortcut character & is NOT returned from Reads.
|
||||||
|
|
||||||
|
|
||||||
# Release Notes:
|
# Release Notes:
|
||||||
|
@ -335,6 +355,20 @@ Border Depth for all elements that support it (inputs, slider, table, tree, etc)
|
||||||
Fix for Element padding done incorrectly!! Sorry about this one
|
Fix for Element padding done incorrectly!! Sorry about this one
|
||||||
|
|
||||||
|
|
||||||
|
### 0.16.0 24-Nov-2018
|
||||||
|
|
||||||
|
Easier forcing to use PyQt5 for testing
|
||||||
|
Predefined events for Tray Icons
|
||||||
|
* Double Clicked
|
||||||
|
* Icon Activated
|
||||||
|
* Message Clicked
|
||||||
|
* Timeout key for polling
|
||||||
|
|
||||||
|
Tray icon tooltip
|
||||||
|
Menu keys with programmable separator
|
||||||
|
Better element padding hierarchy
|
||||||
|
Menubar now returns values as does the ButtonMenu
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Design
|
# Design
|
||||||
|
|
Loading…
Reference in New Issue