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