Still reworking multiline output... hooked up files and folder browser buttons

This commit is contained in:
MikeTheWatchGuy 2018-11-07 00:20:12 -05:00
parent b6ed299d27
commit 3d99d2772e
2 changed files with 151 additions and 51 deletions

View File

@ -7,7 +7,8 @@ import pickle
import calendar
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.QtWidgets import QSpacerItem, QFrame, QGroupBox, QTextBrowser, QPlainTextEdit, QButtonGroup, QFileDialog
# from PySide2.QtWidgets import
from PySide2.QtCore import Qt
import PySide2.QtGui as QtGui
@ -227,6 +228,7 @@ ELEM_TYPE_INPUT_COMBO = 'combo'
ELEM_TYPE_INPUT_OPTION_MENU = 'option menu'
ELEM_TYPE_INPUT_RADIO = 'radio'
ELEM_TYPE_INPUT_MULTILINE = 'multiline'
ELEM_TYPE_MULTILINE_OUTPUT = 'multioutput'
ELEM_TYPE_INPUT_CHECKBOX = 'checkbox'
ELEM_TYPE_INPUT_SPIN = 'spind'
ELEM_TYPE_BUTTON = 'button'
@ -440,14 +442,11 @@ class InputText(Element):
def Update(self, value=None, disabled=None):
if disabled is True:
self.TKEntry['state'] = 'disabled'
self.QT_QLineEdit.setDisabled(True)
elif disabled is False:
self.TKEntry['state'] = 'normal'
self.QT_QLineEdit.setDisabled(False)
if value is not None:
try:
self.TKStringVar.set(value)
except:
pass
self.QT_QLineEdit.setText(value)
self.DefaultText = value
def Get(self):
@ -497,8 +496,8 @@ class Combo(Element):
def Qt_init(self):
self.QT_Combobox = QComboBox()
self.QT_Combobox.addItems(self.Values)
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:
@ -881,6 +880,8 @@ class Multiline(Element):
def Update(self, value=None, disabled=None, append=False, font=None):
if value is not None:
self.DefaultText = value
self.QT_TextEdit.setPlaceholderText(value)
if self.Autoscroll:
pass
if disabled == True:
@ -900,6 +901,72 @@ class Multiline(Element):
super().__del__()
# ---------------------------------------------------------------------- #
# ScrolledOutput #
# ---------------------------------------------------------------------- #
class ScrolledOutput(Element):
def __init__(self, default_text='', enter_submits=False, disabled=False, autoscroll=False, size=(None, None),
auto_size_text=None, background_color=None, text_color=None, change_submits=False, do_not_clear=False,
key=None, focus=False,
font=None, pad=None, tooltip=None):
'''
Multiline Element
:param default_text:
:param enter_submits:
:param disabled:
:param autoscroll:
:param size:
:param auto_size_text:
:param background_color:
:param text_color:
:param do_not_clear:
:param key:
:param focus:
:param pad:
:param tooltip:
:param font:
'''
self.DefaultText = default_text
self.EnterSubmits = enter_submits
bg = background_color if background_color else DEFAULT_INPUT_ELEMENTS_COLOR
self.Focus = focus
self.do_not_clear = do_not_clear
fg = text_color if text_color is not None else DEFAULT_INPUT_TEXT_COLOR
self.Autoscroll = autoscroll
self.Disabled = disabled
self.ChangeSubmits = change_submits
super().__init__(ELEM_TYPE_MULTILINE_OUTPUT, 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)
return
def Update(self, value=None, disabled=None, append=False, font=None):
if value is not None:
self.DefaultText = value
self.QT_TextBrowser.insertPlainText(value)
if self.Autoscroll:
pass
if disabled == True:
pass
elif disabled == False:
pass
if font is not None:
pass
def Get(self):
pass
def SetFocus(self):
pass
def __del__(self):
super().__del__()
# ---------------------------------------------------------------------- #
# Text #
# ---------------------------------------------------------------------- #
@ -1050,7 +1117,7 @@ class Button(Element):
self.InitialFolder = initial_folder
self.Disabled = disabled
self.ChangeSubmits = change_submits
self.QT_Push_Button = None
self.QT_QPushButton = None
super().__init__(ELEM_TYPE_BUTTON, size=size, font=font, pad=pad, key=key, tooltip=tooltip, text_color=self.TextColor, background_color=self.BackgroundColor)
return
@ -1108,16 +1175,24 @@ class Button(Element):
pass
filetypes = (("ALL Files", "*.*"),) if self.FileTypes is None else self.FileTypes
if self.BType == BUTTON_TYPE_BROWSE_FOLDER:
folder_name = 'TODO'
folder_name = QFileDialog.getExistingDirectory()
if folder_name != '':
target_element.Update(folder_name)
elif self.BType == BUTTON_TYPE_BROWSE_FILE:
file_name = 'TODO'
file_name = QFileDialog.getOpenFileName()
if file_name != '':
target_element.Update(file_name[0])
elif self.BType == BUTTON_TYPE_COLOR_CHOOSER:
color = 'TODO'
elif self.BType == BUTTON_TYPE_BROWSE_FILES:
file_name = 'TODO'
file_name = ';'.join(file_name)
file_name = QFileDialog.getOpenFileNames()
if file_name != '':
file_name = ';'.join(file_name[0])
target_element.Update(file_name)
elif self.BType == BUTTON_TYPE_SAVEAS_FILE:
file_name = 'TODO'
file_name = QFileDialog.getSaveFileName()
if file_name != '':
target_element.Update(file_name[0])
elif self.BType == BUTTON_TYPE_CLOSES_WIN: # this is a return type button so GET RESULTS and destroy window
# first, get the results table built
# modify the Results table in the parent FlexForm object
@ -1160,7 +1235,7 @@ class Button(Element):
def Update(self, text=None, button_color=(None, None), disabled=None, image_data=None, image_filename=None):
if text is not None:
self.QT_Push_Button.setText(text)
self.QT_QPushButton.setText(text)
self.ButtonText = text
style = ''
@ -1179,11 +1254,11 @@ class Button(Element):
style += 'color: %s;' % button_color[0]
style += 'background-color: %s;' % button_color[1]
if style != '':
self.QT_Push_Button.setStyleSheet(style)
self.QT_QPushButton.setStyleSheet(style)
if disabled:
self.QT_Push_Button.setDisabled(True)
self.QT_QPushButton.setDisabled(True)
elif disabled is False:
self.QT_Push_Button.setDisabled(False)
self.QT_QPushButton.setDisabled(False)
style = ''
@ -3089,7 +3164,7 @@ def BuildResultsForSubform(form, initialize_only, top_level_form):
if not initialize_only:
if element.Type == ELEM_TYPE_INPUT_TEXT:
value = element.QT_LineEdit.text()
value = element.QT_QLineEdit.text()
if not top_level_form.NonBlocking and not element.do_not_clear and not top_level_form.ReturnKeyboardEvents:
pass
elif element.Type == ELEM_TYPE_INPUT_CHECKBOX:
@ -3110,12 +3185,12 @@ def BuildResultsForSubform(form, initialize_only, top_level_form):
else:
value=0
elif element.Type == ELEM_TYPE_INPUT_COMBO:
value = element.QT_Combobox.currentText()
value = element.QT_ComboBox.currentText()
elif element.Type == ELEM_TYPE_INPUT_OPTION_MENU:
value = 0
elif element.Type == ELEM_TYPE_INPUT_LISTBOX:
try:
value= [element.QT_List_Widget.currentItem().text(),]
value= [element.QT_ListWidget.currentItem().text(),]
except:
value = []
elif element.Type == ELEM_TYPE_INPUT_SPIN:
@ -3434,7 +3509,7 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
elif element_type == ELEM_TYPE_BUTTON:
btext = element.ButtonText
btype = element.BType
element.QT_Push_Button = QPushButton(btext)
element.QT_QPushButton = QPushButton(btext)
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
@ -3443,24 +3518,24 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Push_Button.setStyleSheet(style)
element.QT_QPushButton.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])
element.QT_QPushButton.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Push_Button.setFixedHeight(element_size[1])
element.QT_QPushButton.setFixedHeight(element_size[1])
if element.Disabled:
element.QT_Push_Button.setDisabled(True)
element.QT_QPushButton.setDisabled(True)
qt_row_layout.addWidget(element.QT_Push_Button)
element.QT_Push_Button.clicked.connect(element.ButtonCallBack)
# element.QT_Push_Button.clicked.connect(window.QTApplication.exit)
qt_row_layout.addWidget(element.QT_QPushButton)
element.QT_QPushButton.clicked.connect(element.ButtonCallBack)
# element.QT_QPushButton.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)
element.QT_QLineEdit = QLineEdit()
element.QT_QLineEdit.setPlaceholderText(default_text)
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
@ -3469,19 +3544,19 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_LineEdit.setStyleSheet(style)
element.QT_QLineEdit.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])
element.QT_QLineEdit.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_LineEdit.setFixedHeight(element_size[1])
element.QT_QLineEdit.setFixedHeight(element_size[1])
qt_row_layout.addWidget(element.QT_LineEdit)
qt_row_layout.addWidget(element.QT_QLineEdit)
# ------------------------- COMBO BOX (Drop Down) element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_COMBO:
element.QT_Combobox = QComboBox()
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]
@ -3495,24 +3570,24 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_Combobox.setStyleSheet(style)
element.QT_ComboBox.setStyleSheet(style)
if not auto_size_text:
if element_size[0] is not None:
element.QT_Combobox.setFixedWidth(element_size[0])
element.QT_ComboBox.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_Combobox.setFixedHeight(element_size[1])
element.QT_ComboBox.setFixedHeight(element_size[1])
element.QT_Combobox.addItems(element.Values)
qt_row_layout.addWidget(element.QT_Combobox)
element.QT_ComboBox.addItems(element.Values)
qt_row_layout.addWidget(element.QT_ComboBox)
# ------------------------- OPTION MENU (Like ComboBox but different) element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_OPTION_MENU:
max_line_len = max([len(str(l)) for l in element.Values])
# ------------------------- LISTBOX element ------------------------- #
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()
element.QT_ListWidget = QListWidget()
style = ''
if font is not None:
style += 'font-family: %s;'%font[0]
@ -3521,15 +3596,15 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
style += 'color: %s;' % element.TextColor
if element.BackgroundColor is not None:
style += 'background-color: %s;' % element.BackgroundColor
element.QT_List_Widget.setStyleSheet(style)
element.QT_ListWidget.setStyleSheet(style)
if not auto_size_text:
if element_size[0] is not None:
element.QT_List_Widget.setFixedWidth(element_size[0])
element.QT_ListWidget.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_List_Widget.setFixedHeight(element_size[1])
element.QT_ListWidget.setFixedHeight(element_size[1])
element.QT_List_Widget.addItems(element.Values)
qt_row_layout.addWidget(element.QT_List_Widget)
element.QT_ListWidget.addItems(element.Values)
qt_row_layout.addWidget(element.QT_ListWidget)
# ------------------------- INPUT MULTI LINE element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_MULTILINE:
default_text = element.DefaultText
@ -3553,6 +3628,31 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
element.QT_TextEdit.setPlaceholderText(default_text)
qt_row_layout.addWidget(element.QT_TextEdit)
# ------------------------- OUTPUT MULTI LINE element ------------------------- #
elif element_type == ELEM_TYPE_MULTILINE_OUTPUT:
default_text = element.DefaultText
width, height = element_size
element.QT_TextBrowser = QTextBrowser()
element.QT_TextBrowser.setDisabled(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_TextBrowser.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_TextBrowser.setFixedWidth(element_size[0])
if element_size[1] is not None:
element.QT_TextBrowser.setFixedHeight(element_size[1])
element.QT_TextBrowser.insertPlainText(default_text)
qt_row_layout.addWidget(element.QT_TextBrowser)
# ------------------------- INPUT CHECKBOX element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_CHECKBOX:
width = 0 if auto_size_text else element_size[0]
@ -5341,12 +5441,12 @@ def main():
layout = [[Text('You are running the PySimpleGUI.py file itself')],
[Text('You should be importing it rather than running it')],
[Text('Here is your sample input window....')],
[Text('Source Folder', size=(150, 20), justification='right'), InputText('Source', focus=True),
FolderBrowse()],
[Text('Source File', size=(150, 20), justification='right'), InputText('Source', focus=True),Stretch(),
FileBrowse(target=(ThisRow,-2))],
[Text('Destination Folder', size=(150, 20), justification='right'), InputText('Dest'), FolderBrowse()],
[Ok(), Cancel()]]
window = Window('Demo window..').Layout(layout)
window = Window('Demo window..',auto_size_buttons=False, default_button_element_size=(80,30)).Layout(layout)
event, values = window.Read()
window.Close()