Pre-Alpha PySimpleGUI_Qt

This commit is contained in:
MikeTheWatchGuy 2018-11-06 14:06:54 -05:00
parent cb56e0fed8
commit b6ed299d27
5 changed files with 556 additions and 94 deletions

View File

@ -5,9 +5,13 @@ import datetime
import textwrap
import pickle
import calendar
from PySide2.QtWidgets import QApplication, QLabel, QWidget, QLineEdit, QComboBox, QFormLayout, QVBoxLayout, QHBoxLayout, QListWidget
from PySide2.QtWidgets import QSlider, QCheckBox, QRadioButton, QSpinBox, QPushButton
from PySide2.QtWidgets import QApplication, QLabel, QWidget, QLineEdit, QComboBox, QFormLayout, QVBoxLayout, QHBoxLayout, QListWidget, QDial
from PySide2.QtWidgets import QSlider, QCheckBox, QRadioButton, QSpinBox, QPushButton, QTextEdit, QMainWindow, QDialog
from PySide2.QtWidgets import QSpacerItem, QFrame, QGroupBox
from PySide2.QtCore import Qt
import PySide2.QtGui as QtGui
"""
The QT version if PySimpleGUI.
@ -56,8 +60,8 @@ def TimerStop():
# ----====----====----==== Constants the user CAN safely change ====----====----====----#
DEFAULT_WINDOW_ICON = 'default_icon.ico'
DEFAULT_ELEMENT_SIZE = (45, 1) # In CHARACTERS
DEFAULT_BUTTON_ELEMENT_SIZE = (10, 1) # In CHARACTERS
DEFAULT_ELEMENT_SIZE = (250, 30) # In PIXELS
DEFAULT_BUTTON_ELEMENT_SIZE = (80, 30 ) # In PIXELS
DEFAULT_MARGINS = (10, 5) # Margins for each LEFT/RIGHT margin is first term
DEFAULT_ELEMENT_PADDING = (5, 3) # Padding between elements (row, col) in pixels
DEFAULT_AUTOSIZE_TEXT = True
@ -177,6 +181,7 @@ class MyWindows():
self.NumOpenWindows = 0
self.user_defined_icon = None
self.hidden_master_root = None
self.QTApplication = None
def Decrement(self):
self.NumOpenWindows -= 1 * (self.NumOpenWindows != 0) # decrement if not 0
@ -232,6 +237,7 @@ ELEM_TYPE_GRAPH = 'graph'
ELEM_TYPE_TAB = 'tab'
ELEM_TYPE_TAB_GROUP = 'tabgroup'
ELEM_TYPE_INPUT_SLIDER = 'slider'
ELEM_TYPE_INPUT_DIAL = 'dial'
ELEM_TYPE_INPUT_LISTBOX = 'listbox'
ELEM_TYPE_OUTPUT = 'output'
ELEM_TYPE_COLUMN = 'column'
@ -242,6 +248,7 @@ ELEM_TYPE_TABLE = 'table'
ELEM_TYPE_TREE = 'tree'
ELEM_TYPE_ERROR = 'error'
ELEM_TYPE_SEPARATOR = 'separator'
ELEM_TYPE_STRETCH = 'stretch'
# ------------------------- Popup Buttons Types ------------------------- #
POPUP_BUTTONS_YES_NO = 1
@ -264,7 +271,7 @@ POPUP_BUTTONS_NO_BUTTONS = 5
# ------------------------------------------------------------------------- #
class Element():
def __init__(self, type, size=(None, None), auto_size_text=None, font=None, background_color=None, text_color=None,
key=None, pad=None, tooltip=None):
key=None, pad=None, tooltip=None, size_px=(None,None)):
self.Size = size
self.Type = type
self.AutoSizeText = auto_size_text
@ -286,6 +293,7 @@ class Element():
self.Key = key # dictionary key for return values
self.Tooltip = tooltip
self.TooltipObject = None
self.SizePx = size_px
def FindReturnKeyBoundButton(self, form):
for row in form.Rows:
@ -463,7 +471,7 @@ Input = InputText
# ---------------------------------------------------------------------- #
# Combo #
# ---------------------------------------------------------------------- #
class InputCombo(Element):
class Combo(Element):
def __init__(self, values, default_value=None, size=(None, None), auto_size_text=None, background_color=None,
text_color=None, change_submits=False, disabled=False, key=None, pad=None, tooltip=None,
readonly=False, font=None):
@ -487,6 +495,11 @@ class InputCombo(Element):
super().__init__(ELEM_TYPE_INPUT_COMBO, size=size, auto_size_text=auto_size_text, background_color=bg,
text_color=fg, key=key, pad=pad, tooltip=tooltip, font=font or DEFAULT_FONT)
def Qt_init(self):
self.QT_Combobox = QComboBox()
self.QT_Combobox.addItems(self.Values)
def Update(self, value=None, values=None, set_to_index=None, disabled=None, readonly=None, font=None):
if values is not None:
try:
@ -530,7 +543,7 @@ class InputCombo(Element):
# ------------------------- INPUT COMBO Element lazy functions ------------------------- #
Combo = InputCombo
InputCombo = Combo
DropDown = InputCombo
Drop = InputCombo
@ -891,7 +904,7 @@ class Multiline(Element):
# Text #
# ---------------------------------------------------------------------- #
class Text(Element):
def __init__(self, text, size=(None, None), auto_size_text=None, click_submits=None, relief=None, font=None,
def __init__(self, text, size=(None, None), size_px=(None, None), auto_size_text=None, click_submits=None, relief=None, font=None,
text_color=None, background_color=None, justification=None, pad=None, key=None, tooltip=None):
'''
Text Element
@ -910,26 +923,40 @@ class Text(Element):
'''
self.DisplayText = text
self.TextColor = text_color if text_color else DEFAULT_TEXT_COLOR
self.Justification = justification
self.Justification = justification or 'left'
self.Relief = relief
self.ClickSubmits = click_submits
if background_color is None:
bg = DEFAULT_TEXT_ELEMENT_BACKGROUND_COLOR
else:
bg = background_color
self.QT_Label = None
super().__init__(ELEM_TYPE_TEXT, size, auto_size_text, background_color=bg, font=font if font else DEFAULT_FONT,
text_color=self.TextColor, pad=pad, key=key, tooltip=tooltip)
text_color=self.TextColor, pad=pad, key=key, tooltip=tooltip, size_px=size_px)
return
def Update(self, value=None, background_color=None, text_color=None, font=None):
if value is not None:
self.DisplayText = value
self.QT_Label.setText(value)
style = ''
temp_font = font if font is not None else self.Font
if temp_font is None:
temp_font = DEFAULT_FONT
if temp_font is not None:
style += 'font-family: %s;' % temp_font[0]
style += 'font-size: %spt;' % temp_font[1]
temp_text_color = text_color or self.TextColor
style += 'color: %s;' % temp_text_color
if background_color is not None:
pass
if text_color is not None:
pass
if font is not None:
pass
style += 'background-color: %s;' % background_color
self.QT_Label.setStyleSheet(style)
def __del__(self):
super().__del__()
@ -1007,6 +1034,8 @@ class Button(Element):
self.Target = target
self.ButtonText = button_text
self.ButtonColor = button_color if button_color else DEFAULT_BUTTON_COLOR
self.TextColor = self.ButtonColor[0]
self.BackgroundColor = self.ButtonColor[1]
self.ImageFilename = image_filename
self.ImageData = image_data
self.ImageSize = image_size
@ -1021,8 +1050,9 @@ class Button(Element):
self.InitialFolder = initial_folder
self.Disabled = disabled
self.ChangeSubmits = change_submits
self.QT_Push_Button = None
super().__init__(ELEM_TYPE_BUTTON, size=size, font=font, pad=pad, key=key, tooltip=tooltip)
super().__init__(ELEM_TYPE_BUTTON, size=size, font=font, pad=pad, key=key, tooltip=tooltip, text_color=self.TextColor, background_color=self.BackgroundColor)
return
# Realtime button release callback
@ -1044,6 +1074,7 @@ class Button(Element):
def ButtonCallBack(self):
global _my_windows
# print('Button callback')
# print(f'Parent = {self.ParentForm} Position = {self.Position}')
@ -1097,7 +1128,7 @@ class Button(Element):
self.ParentForm.FormRemainedOpen = False
self.ParentForm._Close()
if self.ParentForm.CurrentlyRunningMainloop:
pass # quit mainloop
self.ParentForm.QTApplication.exit() # Exit the mainloop
if self.ParentForm.NonBlocking:
# TODO DESTROY WIN
_my_windows.Decrement()
@ -1110,7 +1141,7 @@ class Button(Element):
self.ParentForm.LastButtonClicked = self.ButtonText
self.ParentForm.FormRemainedOpen = True
if self.ParentForm.CurrentlyRunningMainloop: # if this window is running the mainloop, kick out
pass # kick the users out of the mainloop
self.ParentForm.QTApplication.exit()
elif self.BType == BUTTON_TYPE_CLOSES_WIN_ONLY: # special kind of button that does not exit main loop
self.ParentForm._Close()
if self.ParentForm.NonBlocking:
@ -1123,27 +1154,41 @@ class Button(Element):
self.ParentForm.LastButtonClicked = target_element.Key
self.ParentForm.FormRemainedOpen = True
if self.ParentForm.CurrentlyRunningMainloop:
pass # TODO # kick the sssssssssssssssssssssssssssssssssssssssssusers out of the mainloop
pass # TODO # kick the users out of the mainloop
return
def Update(self, text=None, button_color=(None, None), disabled=None, image_data=None, image_filename=None):
try:
if text is not None:
self.TKButton.configure(text=text)
self.ButtonText = text
if button_color != (None, None):
self.TKButton.config(foreground=button_color[0], background=button_color[1])
except:
return
if disabled == True:
pass
elif disabled == False:
pass
if image_data is not None:
pass
if image_filename is not None:
pass
if text is not None:
self.QT_Push_Button.setText(text)
self.ButtonText = text
style = ''
if self.ParentForm.Font and (self.Font == DEFAULT_FONT or not self.Font):
font = self.ParentForm.Font
elif self.Font is not None:
font = self.Font
else:
font = DEFAULT_FONT
if font is not None:
style += 'font-family: %s;' % font[0]
style += 'font-size: %spt;' % font[1]
if button_color != (None, None):
style += 'color: %s;' % button_color[0]
style += 'background-color: %s;' % button_color[1]
if style != '':
self.QT_Push_Button.setStyleSheet(style)
if disabled:
self.QT_Push_Button.setDisabled(True)
elif disabled is False:
self.QT_Push_Button.setDisabled(False)
style = ''
def GetText(self):
return self.ButtonText
@ -1707,12 +1752,25 @@ class Slider(Element):
self.TickInterval = tick_interval
temp_size = size
if temp_size == (None, None):
temp_size = (20, 20) if self.Orientation.startswith('h') else (8, 20)
temp_size = (150, 30) if self.Orientation.startswith('h') else (30, 150)
super().__init__(ELEM_TYPE_INPUT_SLIDER, size=temp_size, font=font, background_color=background_color,
text_color=text_color, key=key, pad=pad, tooltip=tooltip)
return
def Qt_init(self):
self.QT_Slider = QSlider()
if self.Orientation.startswith('h'):
self.QT_Slider.setOrientation(Qt.Horizontal)
else:
self.QT_Slider.setOrientation(Qt.Vertical)
self.QT_Slider.setMinimum(self.Range[0])
self.QT_Slider.setMaximum(self.Range[1])
self.QT_Slider.setTickPosition(QSlider.TicksBothSides)
self.QT_Slider.setTickInterval(self.Range[1] / 10)
def Update(self, value=None, range=(None, None), disabled=None):
if value is not None:
pass
@ -1736,6 +1794,112 @@ class Slider(Element):
def __del__(self):
super().__del__()
# ---------------------------------------------------------------------- #
# Dial #
# ---------------------------------------------------------------------- #
class Dial(Element):
def __init__(self, range=(None, None), default_value=None, resolution=None, tick_interval=None, orientation=None,
border_width=None, relief=None, change_submits=False, disabled=False, size=(None, None), font=None,
background_color=None, text_color=None, key=None, pad=None, tooltip=None):
'''
Slider Element
:param range:
:param default_value:
:param resolution:
:param orientation:
:param border_width:
:param relief:
:param change_submits:
:param disabled:
:param size:
:param font:
:param background_color:
:param text_color:
:param key:
:param pad:
:param tooltip:
'''
self.TKScale = None
self.Range = (1, 10) if range == (None, None) else range
self.DefaultValue = self.Range[0] if default_value is None else default_value
self.Orientation = orientation if orientation else DEFAULT_SLIDER_ORIENTATION
self.BorderWidth = border_width if border_width else DEFAULT_SLIDER_BORDER_WIDTH
self.Relief = relief if relief else DEFAULT_SLIDER_RELIEF
self.Resolution = 1 if resolution is None else resolution
self.ChangeSubmits = change_submits
self.Disabled = disabled
self.TickInterval = tick_interval
temp_size = size
if temp_size == (None, None):
temp_size = (20, 20) if self.Orientation.startswith('h') else (8, 20)
super().__init__(ELEM_TYPE_INPUT_DIAL, size=temp_size, font=font, background_color=background_color,
text_color=text_color, key=key, pad=pad, tooltip=tooltip)
return
def Qt_init(self):
self.QT_Dial = QDial()
self.QT_Dial.setMinimum(self.Range[0])
self.QT_Dial.setMaximum(self.Range[1])
def Update(self, value=None, range=(None, None), disabled=None):
if value is not None:
pass
self.DefaultValue = value
if disabled == True:
pass
elif disabled == False:
pass
def SliderChangedHandler(self, event):
# first, get the results table built
# modify the Results table in the parent FlexForm object
if self.Key is not None:
self.ParentForm.LastButtonClicked = self.Key
else:
self.ParentForm.LastButtonClicked = ''
self.ParentForm.FormRemainedOpen = True
if self.ParentForm.CurrentlyRunningMainloop:
pass # TODO # kick the users out of the mainloop
def __del__(self):
super().__del__()
# ---------------------------------------------------------------------- #
# Stretch #
# ---------------------------------------------------------------------- #
class Stretch(Element):
def __init__(self, size=(None, None), font=None, background_color=None, text_color=None, key=None, pad=None, tooltip=None):
'''
Slider Element
:param range:
:param default_value:
:param resolution:
:param orientation:
:param border_width:
:param relief:
:param change_submits:
:param disabled:
:param size:
:param font:
:param background_color:
:param text_color:
:param key:
:param pad:
:param tooltip:
'''
super().__init__(ELEM_TYPE_STRETCH, size=size, font=font, background_color=background_color,
text_color=text_color, key=key, pad=pad, tooltip=tooltip)
return
def __del__(self):
super().__del__()
# ---------------------------------------------------------------------- #
# Column #
@ -2151,6 +2315,7 @@ class Window:
self.TimerCancelled = False
self.DisableClose = disable_close
self._Hidden = False
self.QTApplication = None
# ------------------------- Add ONE Row to Form ------------------------- #
def AddRow(self, *args):
@ -2305,7 +2470,7 @@ class Window:
################################# CALL GUI MAINLOOP ############################
self.QTApplication.exec_()
self.LastButtonClicked = 'TEST'
# self.LastButtonClicked = 'TEST'
self.CurrentlyRunningMainloop = False
self.TimerCancelled = True
if self.RootNeedsDestroying:
@ -2328,15 +2493,14 @@ class Window:
return None, None
if not self.Shown:
self.Show(non_blocking=True)
try:
rc = self.TKroot.update()
except:
if 0: # TODO add window closed with X logic
self.TKrootDestroyed = True
_my_windows.Decrement()
# print("read failed")
# return None, None
return BuildResults(self, False, self)
def Finalize(self):
if self.TKrootDestroyed:
return self
@ -2349,7 +2513,6 @@ class Window:
_my_windows.Decrement()
# return None, None
return self
def Refresh(self):
if self.TKrootDestroyed:
return self
@ -2957,10 +3120,12 @@ def BuildResultsForSubform(form, initialize_only, top_level_form):
value = []
elif element.Type == ELEM_TYPE_INPUT_SPIN:
value = element.QT_Spinner.value()
elif element.Type == ELEM_TYPE_INPUT_DIAL:
value = element.QT_Dial.value()
elif element.Type == ELEM_TYPE_INPUT_SLIDER:
value = element.QT_Slider.value()
elif element.Type == ELEM_TYPE_INPUT_MULTILINE:
value = 0
value = element.QT_TextEdit.toPlainText()
elif element.Type == ELEM_TYPE_TAB_GROUP:
value = 0
elif element.Type == ELEM_TYPE_TABLE:
@ -3214,7 +3379,7 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
# Set foreground color
text_color = element.TextColor
# Determine Element size
element_size = element.Size
element_size = element.Size if element.Size != (None, None) else element.SizePx
if (element_size == (None, None) and element_type != ELEM_TYPE_BUTTON): # user did not specify a size
element_size = toplevel_win.DefaultElementSize
elif (element_size == (None, None) and element_type == ELEM_TYPE_BUTTON):
@ -3223,37 +3388,122 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
auto_size_text = False # if user has specified a size then it shouldn't autosize
# ------------------------- COLUMN element ------------------------- #
if element_type == ELEM_TYPE_COLUMN:
if element.Scrollable:
pass
else:
pass
column_widget = QWidget()
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
column_widget.setStyleSheet(style)
print(style)
column_layout = QFormLayout()
column_vbox = QVBoxLayout()
PackFormIntoFrame(element, column_layout, toplevel_win)
column_vbox.addLayout(column_layout)
column_widget.setLayout(column_vbox)
qt_row_layout.addWidget(column_widget)
# ------------------------- TEXT element ------------------------- #
elif element_type == ELEM_TYPE_TEXT:
# auto_size_text = element.AutoSizeText
display_text = element.DisplayText # text to display
element.QT_label = QLabel(display_text, toplevel_win.QTWindow)
qt_row_layout.addWidget(element.QT_label)
element.QT_Label = QLabel(element.DisplayText, toplevel_win.QTWindow)
if element.Justification[0] == 'c':
element.QT_Label.setAlignment(Qt.AlignCenter)
elif element.Justification[0] == 'r':
element.QT_Label.setAlignment(Qt.AlignRight)
if not auto_size_text:
if element_size[0] is not None:
element.QT_Label.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Label.setFixedHeight(element_size[1])
# element.QT_Label.setWordWrap(True)
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Label.setStyleSheet(style)
if element.Tooltip:
element.QT_Label.setToolTip(element.Tooltip)
qt_row_layout.addWidget(element.QT_Label)
# ------------------------- BUTTON element ------------------------- #
elif element_type == ELEM_TYPE_BUTTON:
btext = element.ButtonText
btype = element.BType
element.QT_Push_Button = QPushButton(btext)
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Push_Button.setStyleSheet(style)
if element.AutoSizeButton is False or toplevel_win.AutoSizeButtons is False or element.Size[0] is not None:
if element_size[0] is not None:
element.QT_Push_Button.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Push_Button.setFixedHeight(element_size[1])
if element.Disabled:
element.QT_Push_Button.setDisabled(True)
qt_row_layout.addWidget(element.QT_Push_Button)
element.QT_Push_Button.clicked.connect(window.QTApplication.exit)
element.QT_Push_Button.clicked.connect(element.ButtonCallBack)
# element.QT_Push_Button.clicked.connect(window.QTApplication.exit)
# ------------------------- INPUT (Single Line) element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_TEXT:
default_text = element.DefaultText
element.QT_LineEdit = QLineEdit()
element.QT_LineEdit.setPlaceholderText(default_text)
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_LineEdit.setStyleSheet(style)
if element.AutoSizeText is False or toplevel_win.AutoSizeButtons is False or element.Size[0] is not None:
if element_size[0] is not None:
element.QT_LineEdit.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_LineEdit.setFixedHeight(element_size[1])
qt_row_layout.addWidget(element.QT_LineEdit)
# ------------------------- COMBO BOX (Drop Down) element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_COMBO:
element.QT_Combobox = QComboBox()
max_line_len = max([len(str(l)) for l in element.Values])
if auto_size_text is False:
width = element_size[0]
else:
width = max_line_len
element.QT_Combobox = QComboBox()
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Combobox.setStyleSheet(style)
if not auto_size_text:
if element_size[0] is not None:
element.QT_Combobox.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Combobox.setFixedHeight(element_size[1])
element.QT_Combobox.addItems(element.Values)
qt_row_layout.addWidget(element.QT_Combobox)
# ------------------------- OPTION MENU (Like ComboBox but different) element ------------------------- #
@ -3263,17 +3513,67 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
elif element_type == ELEM_TYPE_INPUT_LISTBOX:
max_line_len = max([len(str(l)) for l in element.Values]) if len(element.Values) != 0 else 0
element.QT_List_Widget = QListWidget()
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_List_Widget.setStyleSheet(style)
if not auto_size_text:
if element_size[0] is not None:
element.QT_List_Widget.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_List_Widget.setFixedHeight(element_size[1])
element.QT_List_Widget.addItems(element.Values)
qt_row_layout.addWidget(element.QT_List_Widget)
# ------------------------- INPUT MULTI LINE element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_MULTILINE:
default_text = element.DefaultText
width, height = element_size
element.QT_TextEdit = QTextEdit()
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_TextEdit.setStyleSheet(style)
if element.AutoSizeText is False or toplevel_win.AutoSizeButtons is False or element.Size[0] is not None:
if element_size[0] is not None:
element.QT_TextEdit.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_TextEdit.setFixedHeight(element_size[1])
element.QT_TextEdit.setPlaceholderText(default_text)
qt_row_layout.addWidget(element.QT_TextEdit)
# ------------------------- INPUT CHECKBOX element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_CHECKBOX:
width = 0 if auto_size_text else element_size[0]
default_value = element.InitialState
element.QT_Checkbox = QCheckBox(element.Text)
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Checkbox.setStyleSheet(style)
if element.AutoSizeText is False or toplevel_win.AutoSizeButtons is False or element.Size[0] is not None:
if element_size[0] is not None:
element.QT_Checkbox.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Checkbox.setFixedHeight(element_size[1])
qt_row_layout.addWidget(element.QT_Checkbox)
# ------------------------- PROGRESS BAR element ------------------------- #
elif element_type == ELEM_TYPE_PROGRESS_BAR:
@ -3285,6 +3585,22 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
default_value = element.InitialState
ID = element.GroupID
element.QT_Radio_Button = QRadioButton(element.Text)
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Radio_Button.setStyleSheet(style)
if element.AutoSizeText is False or toplevel_win.AutoSizeButtons is False or element.Size[0] is not None:
if element_size[0] is not None:
element.QT_Radio_Button.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Radio_Button.setFixedHeight(element_size[1])
qt_row_layout.addWidget(element.QT_Radio_Button)
# ------------------------- INPUT SPIN Box element ------------------------- #
@ -3292,7 +3608,22 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
width, height = element_size
width = 0 if auto_size_text else element_size[0]
element.QT_Spinner = QSpinBox()
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Spinner.setStyleSheet(style)
element.QT_Spinner.setRange(element.Values[0], element.Values[1])
if not auto_size_text:
if element_size[0] is not None:
element.QT_Spinner.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Spinner.setFixedHeight(element_size[1])
qt_row_layout.addWidget(element.QT_Spinner)
# ------------------------- OUTPUT element ------------------------- #
elif element_type == ELEM_TYPE_OUTPUT:
@ -3311,7 +3642,24 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
menu_def = element.MenuDefinition
# ------------------------- Frame element ------------------------- #
elif element_type == ELEM_TYPE_FRAME:
pass
column_widget = QGroupBox()
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
column_widget.setStyleSheet(style)
column_widget.setTitle(element.Title)
column_layout = QFormLayout()
column_vbox = QVBoxLayout()
PackFormIntoFrame(element, column_layout, toplevel_win)
column_vbox.addLayout(column_layout)
column_widget.setLayout(column_vbox)
qt_row_layout.addWidget(column_widget)
# ------------------------- Tab element ------------------------- #
elif element_type == ELEM_TYPE_TAB:
pass
@ -3320,17 +3668,31 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
pass
# ------------------------- SLIDER Box element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_SLIDER:
element.QT_Slider = QSlider()
if element.Orientation.startswith('h'):
element.QT_Slider.setOrientation(Qt.Horizontal)
else:
element.QT_Slider.setOrientation(Qt.Vertical)
element.QT_Slider.setMinimum(element.Range[0])
element.QT_Slider.setMaximum(element.Range[1])
element.QT_Slider.setTickPosition(QSlider.TicksBothSides)
element.QT_Slider.setTickInterval(element.Range[1]/10)
element.Qt_init()
if element_size[0] is not None:
element.QT_Slider.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Slider.setFixedHeight(element_size[1])
qt_row_layout.addWidget(element.QT_Slider)
# ------------------------- DIAL element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_DIAL:
element.Qt_init()
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
style += 'font-size: %spt;'%font[1]
if element.TextColor is not None:
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Dial.setStyleSheet(style)
qt_row_layout.addWidget(element.QT_Dial)
# ------------------------- Stretch element ------------------------- #
elif element_type == ELEM_TYPE_STRETCH:
qt_row_layout.addStretch(1)
# ------------------------- TABLE element ------------------------- #
elif element_type == ELEM_TYPE_TABLE:
pass
@ -3342,7 +3704,7 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
pass
# ............................DONE WITH ROW pack the row of widgets ..........................#
window.QFormLayout.addRow('', qt_row_layout)
containing_frame.addRow('', qt_row_layout)
# done with row, pack the row of widgets
# tk_row_frame.grid(row=row_num+2, sticky=tk.NW, padx=DEFAULT_MARGINS[0])
@ -3353,7 +3715,7 @@ def ConvertFlexToTK(window):
InitializeResults(window)
pass
master = 000000
PackFormIntoFrame(window, master, window)
PackFormIntoFrame(window, window.QFormLayout, window)
# ....................................... DONE creating and laying out window ..........................#
screen_width = 000000 # get window info to move to middle of screen
screen_height = 000000
@ -3389,12 +3751,18 @@ def StartupTK(window):
else:
root =000000
window.QTApplication = QApplication(sys.argv)
if _my_windows.QTApplication is None:
_my_windows.QTApplication = QApplication(sys.argv)
window.QTApplication = _my_windows.QTApplication
window.QTWindow = QWidget()
style = ''
if window.BackgroundColor is not None:
style += 'background-color: %s;' % window.BackgroundColor
window.QTWindow.setStyleSheet(style)
window.QTWindow.setWindowTitle(window.Title)
# root.wm_overrideredirect(True)
if window.BackgroundColor is not None and window.BackgroundColor != COLOR_SYSTEM_DEFAULT:
root = 000000
_my_windows.Increment()
@ -3407,13 +3775,14 @@ def StartupTK(window):
if window.KeepOnTop:
pass
# root.protocol("WM_DELETE_WINDOW", MyFlexForm.DestroyedCallback())
# root.bind('<Destroy>', MyFlexForm.DestroyedCallback())
window.QFormLayout = QFormLayout()
window.QT_Box_Layout = QVBoxLayout()
ConvertFlexToTK(window)
window.QT_Box_Layout.addLayout(window.QFormLayout)
# Make window visible again
pass
@ -3433,12 +3802,12 @@ def StartupTK(window):
window.QTApplication.exec_()
window.CurrentlyRunningMainloop = False
window.TimerCancelled = True
window.LastButtonClicked = 'Test'
# window.LastButtonClicked = 'Test'
# print('..... BACK from MainLoop')
if not window.FormRemainedOpen:
_my_windows.Decrement()
if window.RootNeedsDestroying:
window.TKroot.destroy()
window.QTWindow.close() # destroy the window
window.RootNeedsDestroying = False
return
@ -4452,20 +4821,20 @@ def Popup(*args, button_color=None, background_color=None, text_color=None, butt
# show either an OK or Yes/No depending on paramater
if button_type is POPUP_BUTTONS_YES_NO:
window.AddRow(PopupButton('Yes', button_color=button_color, focus=True, bind_return_key=True, pad=((20, 5), 3),
size=(5, 1)), PopupButton('No', button_color=button_color, size=(5, 1)))
size=(60, 20)), PopupButton('No', button_color=button_color, size=(60, 20)))
elif button_type is POPUP_BUTTONS_CANCELLED:
window.AddRow(
PopupButton('Cancelled', button_color=button_color, focus=True, bind_return_key=True, pad=((20, 0), 3)))
elif button_type is POPUP_BUTTONS_ERROR:
window.AddRow(PopupButton('Error', size=(6, 1), button_color=button_color, focus=True, bind_return_key=True,
window.AddRow(PopupButton('Error', size=(60, 20), button_color=button_color, focus=True, bind_return_key=True,
pad=((20, 0), 3)))
elif button_type is POPUP_BUTTONS_OK_CANCEL:
window.AddRow(PopupButton('OK', size=(6, 1), button_color=button_color, focus=True, bind_return_key=True),
PopupButton('Cancel', size=(6, 1), button_color=button_color))
window.AddRow(PopupButton('OK', size=(60, 20), button_color=button_color, focus=True, bind_return_key=True),
PopupButton('Cancel', size=(60, 20), button_color=button_color))
elif button_type is POPUP_BUTTONS_NO_BUTTONS:
pass
else:
window.AddRow(PopupButton('OK', size=(5, 1), button_color=button_color, focus=True, bind_return_key=True,
window.AddRow(PopupButton('OK', size=(60, 20), button_color=button_color, focus=True, bind_return_key=True,
pad=((20, 0), 3)))
if non_blocking:
@ -4856,7 +5225,7 @@ def PopupGetFolder(message, default_path='', no_window=False, size=(None, None),
layout = [[Text(message, auto_size_text=True, text_color=text_color, background_color=background_color)],
[InputText(default_text=default_path, size=size), FolderBrowse(initial_folder=initial_folder)],
[CloseButton('Ok', size=(5, 1), bind_return_key=True), CloseButton('Cancel', size=(5, 1))]]
[CloseButton('Ok', size=(60, 20), bind_return_key=True), CloseButton('Cancel', size=(60, 20))]]
window = Window(title=message, icon=icon, auto_size_text=True, button_color=button_color,
background_color=background_color,
@ -4915,7 +5284,7 @@ def PopupGetFile(message, default_path='', default_extension='', save_as=False,
layout = [[Text(message, auto_size_text=True, text_color=text_color, background_color=background_color)],
[InputText(default_text=default_path, size=size), browse_button],
[CloseButton('Ok', size=(6, 1), bind_return_key=True), CloseButton('Cancel', size=(6, 1))]]
[CloseButton('Ok', size=(60, 20), bind_return_key=True), CloseButton('Cancel', size=(60, 20))]]
window = Window(title=message, icon=icon, auto_size_text=True, button_color=button_color, font=font,
background_color=background_color,
@ -4954,7 +5323,7 @@ def PopupGetText(message, default_text='', password_char='', size=(None, None),
layout = [[Text(message, auto_size_text=True, text_color=text_color, background_color=background_color, font=font)],
[InputText(default_text=default_text, size=size, password_char=password_char)],
[CloseButton('Ok', size=(5, 1), bind_return_key=True), CloseButton('Cancel', size=(5, 1))]]
[CloseButton('Ok', size=(60, 20), bind_return_key=True), CloseButton('Cancel', size=(60, 20))]]
window = Window(title=message, icon=icon, auto_size_text=True, button_color=button_color, no_titlebar=no_titlebar,
background_color=background_color, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top,
@ -4970,11 +5339,11 @@ def PopupGetText(message, default_text='', password_char='', size=(None, None),
def main():
layout = [[Text('You are running the PySimpleGUI.py file itself')],
[Text('You should be importing it rather than running it', size=(50, 2))],
[Text('You should be importing it rather than running it')],
[Text('Here is your sample input window....')],
[Text('Source Folder', size=(15, 1), justification='right'), InputText('Source', focus=True),
[Text('Source Folder', size=(150, 20), justification='right'), InputText('Source', focus=True),
FolderBrowse()],
[Text('Destination Folder', size=(15, 1), justification='right'), InputText('Dest'), FolderBrowse()],
[Text('Destination Folder', size=(150, 20), justification='right'), InputText('Dest'), FolderBrowse()],
[Ok(), Cancel()]]
window = Window('Demo window..').Layout(layout)

View File

@ -0,0 +1,66 @@
#!/usr/bin/env python
import sys
if sys.version_info[0] >= 3:
import PySimpleGUI_Qt as sg
else:
import PySimpleGUI27 as sg
sg.ChangeLookAndFeel('GreenTan')
# # Column layout
# col = [[sg.Text('col Row 1', text_color='white', background_color='blue')],
# [sg.Text('col Row 2', text_color='white', background_color='blue'), sg.Input('col input 1')],
# [sg.Text('col Row 3', text_color='white', background_color='blue'), sg.Input('col input 2')]]
# # Window layout
# layout = [ [sg.In()],
# [sg.Text('test'), sg.Column(col, background_color='blue')],]
#
# # Display the window and get values
# event, values = sg.Window('Compact 1-line form with column').Layout(layout).Read()
#
# exit()
# ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', 'E&xit', 'Properties']],
['&Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
['&Help', '&About...'], ]
# ------ Column Definition ------ #
column1 = [[sg.Text('Column 1', background_color='lightblue',text_color='black', justification='center', size=(100,30))],
[sg.Spin((1,10), size=(100,30))],
[sg.Spin((1,10), size=(100,30))],
[sg.Spin((1,10), size=(100,30))],]
layout = [
[sg.Menu(menu_def, tearoff=True)],
[sg.Text('(Almost) All widgets in one Window!', size=(600, 50), justification='l', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
[sg.Text('Here is some text.... and a place to enter text')],
[sg.InputText('This is my text', size=(300,30))],
[sg.Frame(layout=[
[sg.Checkbox('Checkbox', size=(185,30)), sg.Checkbox('My second checkbox!', default=True)],
[sg.Radio('My first Radio!', "RADIO1", default=True, size=(180,30), ),sg.Radio('My second Radio!', "RADIO1")]], title='Options',title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags', ), sg.Stretch()],
[sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(300, 80)),
sg.Multiline(default_text='A second multi-line', size=(300, 80))],
[sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(150, 30)),
sg.Slider(range=(1, 100), orientation='h', size=(150, 30), default_value=85)],
[sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
[sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(200,100)),
sg.Frame('Labelled Group',[[
sg.Slider(range=(1, 100), orientation='v', default_value=25, tick_interval=25),
sg.Slider(range=(1, 100), orientation='v', default_value=75),
sg.Slider(range=(1, 100), orientation='v', default_value=10),
sg.Column(column1, background_color='lightblue')]]), sg.Stretch()],
[sg.Text('_' * 80)],
[sg.Text('Choose A Folder')],
[sg.Text('Your Folder', auto_size_text=True, justification='right'),
sg.InputText('Default Folder', size=(300,30)), sg.FolderBrowse()],
[sg.Submit(tooltip='Click to submit this form', size=(120,30)), sg.Cancel(size=(120,30))]]
window = sg.Window('Everything bagel', default_element_size=(40, 1), grab_anywhere=False, font=('Helvetica', 12)).Layout(layout)
event, values = window.Read()
sg.Popup('Title',
'The results of the window.',
'The button clicked was "{}"'.format(event),
'The values are', values)

View File

@ -0,0 +1,17 @@
import PySimpleGUI_Qt as sg
layout = [
[sg.Text('This is the new Dial Element!')],
[sg.Dial(range=(1,100), key='_DIAL_')],
[sg.Button('Show'), sg.Button('Exit')]
]
window = sg.Window('Window Title').Layout(layout)
while True: # Event Loop
event, values = window.Read()
print(event, values)
if event is None or event == 'Exit':
break
window.Close()

View File

@ -1,20 +1,30 @@
import PySimpleGUI_Qt as sg
# sg.Popup('test 1')
# sg.Popup('test 2')
sg.ChangeLookAndFeel('GreenTan')
layout = [
[sg.Text('Hello PySimpleGUI!'),sg.Text(' '*5), sg.Text('On the same row'), ],
[sg.Text('Input something here'), sg.Input('default text')],
[sg.Combo(['Combo 1', 'Combo 2', 'Combo 3'])],
[sg.Listbox(['Listbox Item 1', 'Listbox Item 2', 'Listbox Item 3'], size=(30,10)),
sg.Slider((1,100))],
[sg.Slider((1,10), orientation='h')],
[sg.Checkbox('Checkbox 1')],
[sg.Checkbox('Checkbox 2')],
[sg.Checkbox('Checkbox 3')],
[sg.Text('Hello From PySimpleGUI_Qt!', text_color='red', tooltip='This is my tooltip', justification='c', font=('Courier', 22), key='_TEXT_')],
[sg.Text('Input something here'),sg.Stretch(), sg.Input('This is an InputText Element', key='_INPUT_', font=('Any', 14))],
[sg.Text('This is the new Dial Element'), sg.Dial(background_color='red'), sg.Stretch()],
[sg.Combo(['Combo 1', 'Combo 2', 'Combo 3'], key='+COMBO+', size=(150,30), text_color='green')],
[sg.Listbox(['Listbox Item 1', 'Listbox Item 2', 'Listbox Item 3'], key='+LIST+', size=(200,150), text_color='blue'),sg.Slider((1,100), orientation='v', key='+SLIDER 1+')],
[sg.Slider((1,10), size=(200,30), orientation='h', key='+SLIDER 2+'), sg.Stretch()],
[sg.Checkbox('Checkbox 1', key='+CB1+'), sg.Checkbox('Checkbox 2', key='+CB2')],
[sg.Checkbox('Checkbox 3'), sg.Checkbox('Checkbox 4')],
[sg.Radio('Radio1', group_id=1),sg.Radio('Radio2', group_id=1)],
[sg.Spin((5,8))],
[sg.Button('My Button')],
[sg.Spin((5,8), size=(100,30))],
[sg.Multiline('This is a Multiline Element', key='+MULTI+')],
[sg.Button('My Button', size=(120,30)), sg.Exit(), sg.Button('Change', key='_CHANGE_')],
]
window = sg.Window('My first QT Window').Layout(layout)
window = sg.Window('My first QT Window', auto_size_text=True, auto_size_buttons=False, font=('Helvetica', 16)).Layout(layout)
while True:
event, values = window.Read()
print(event, values)
if event is None or event == 'Exit':
break
window.FindElement('_TEXT_').Update(values['_INPUT_'], font=('Helvetica', 30))
if event == '_CHANGE_':
window.FindElement('_CHANGE_').Update('Disabled', disabled=True, button_color=('gray', 'gray20'),)