diff --git a/PySimpleGUIQt/PySimpleGUIQt.py b/PySimpleGUIQt/PySimpleGUIQt.py index 87cef78c..e940450a 100644 --- a/PySimpleGUIQt/PySimpleGUIQt.py +++ b/PySimpleGUIQt/PySimpleGUIQt.py @@ -504,6 +504,7 @@ class InputText(Element): self.DefaultText = value def Get(self): + return self.QT_QLineEdit.text() return self.QT_QLineEdit.text() # return self.TKStringVar.get() @@ -969,33 +970,33 @@ class Multiline(Element, QWidget): key = event.key() if key in (Qt.Key_Return, Qt.Key_Enter): self.Element.ReturnKeyHandler(0) - # self.Element.ParentForm.LastButtonClicked = self.Element.Key - # self.Element.ParentForm.FormRemainedOpen = True - # if self.Element.ParentForm.CurrentlyRunningMainloop: - # self.Element.ParentForm.QTApplication.exit() if event.type() == QEvent.FocusIn and widget is self.QT_TextEdit: self.Element.ParentForm.FocusElement = self.Element - print('Multiline got focus') - return QWidget.eventFilter(self, widget, event) + def QtCallbackTextChanged(self): + if not self.ChangeSubmits: + return + element_callback_quit_mainloop(self) + + def Update(self, value=None, disabled=None, append=False, font=None): - if value is not None: + if value is not None and not append: self.DefaultText = value self.QT_TextEdit.setText(str(value)) - + elif value is not None and append: + self.DefaultText = value + self.QT_TextEdit.setText(self.QT_TextEdit.toPlainText() + str(value)) if self.Autoscroll: pass if disabled == True: - pass + self.QT_TextEdit.setDisabled(True) elif disabled == False: - pass - if font is not None: - pass + self.QT_TextEdit.setDisabled(False) def Get(self): - self.QT_TextEdit.Text() + self.QT_TextEdit.toPlainText() def SetFocus(self): self.QT_TextEdit.setFocus() @@ -1044,25 +1045,23 @@ class MultilineOutput(Element): 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 value is not None and not append: + self.QT_TextBrowser.setText(str(value)) + elif value is not None and append: + self.QT_TextBrowser.insertPlainText(str(value)) self.QT_TextBrowser.moveCursor(QtGui.QTextCursor.End) + # self.QT_TextBrowser.setText(self.QT_TextBrowser.toPlainText() + str(value)) if self.Autoscroll: pass if disabled == True: - pass + self.QT_TextBrowser.setDisabled(True) elif disabled == False: - pass - if font is not None: - pass + self.QT_TextBrowser.setDisabled(False) def Get(self): - pass - - def SetFocus(self): - pass + self.QT_TextBrowser.toPlainText() def __del__(self): super().__del__() @@ -1108,13 +1107,11 @@ class Text(Element): text_color=self.TextColor, pad=pad, key=key, tooltip=tooltip) return - def QtCallbackTextClicked(self): + def QtCallbackTextClicked(self, event): if not self.ClickSubmits: return element_callback_quit_mainloop(self) - - def Update(self, value=None, background_color=None, text_color=None, font=None): if value is not None: self.DisplayText = str(value) @@ -2871,7 +2868,7 @@ class Window: self.LastButtonClicked = None return results else: - if not self.XFound and self.Timeout != 0 and self.Timeout is not None: # Special Qt case because returning for no reason so fake timeout + if not self.XFound and self.Timeout != 0 and self.Timeout is not None and self.ReturnValues[0] is None: # Special Qt case because returning for no reason so fake timeout self.ReturnValues = self.TimeoutKey, self.ReturnValues[1] # fake a timeout return self.ReturnValues @@ -3918,7 +3915,7 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win): element.QT_Label.setStyleSheet(style) if element.ClickSubmits: - qlabel.linkActivated.connect(element.QtCallbackTextClicked) + element.QT_Label.mousePressEvent = element.QtCallbackTextClicked if element.Relief is not None: if element.Relief in (RELIEF_RIDGE, RELIEF_RAISED): @@ -4002,6 +3999,9 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win): focus_set = True toplevel_win.FocusElement = element.QT_QLineEdit + if element.Disabled: + element.QT_QLineEdit.setDisabled(True) + if element.ChangeSubmits: element.QT_QLineEdit.textChanged.connect(element.QtCallbackTextChanged) @@ -4105,16 +4105,21 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win): if element_size[1] is not None: element.QT_TextEdit.setFixedHeight(element_size[1]) - element.QT_TextEdit.setPlaceholderText(default_text) - qt_row_layout.setContentsMargins(*full_element_pad) + if element.Disabled: + element.QT_TextEdit.setDisabled(True) element.MultiQWidget = Multiline.MultiQWidget(element.QT_TextEdit, element) element.QT_TextEdit.installEventFilter(element.MultiQWidget) + if element.ChangeSubmits: + element.QT_TextEdit.textChanged.connect(element.QtCallbackTextChanged) + if (element.Focus or toplevel_win.UseDefaultFocus) and not focus_set: focus_set = True toplevel_win.FocusElement = element.QT_TextEdit + element.QT_TextEdit.setPlaceholderText(default_text) + qt_row_layout.setContentsMargins(*full_element_pad) qt_row_layout.addWidget(element.QT_TextEdit) # ------------------------- OUTPUT MULTI LINE element ------------------------- # @@ -4508,6 +4513,23 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win): # ------------------------- Separator element ------------------------- # elif element_type == ELEM_TYPE_SEPARATOR: + element.QT_Label = qlabel = QLabel('', toplevel_win.QTWindow) + 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]) + style = '' + if element.TextColor is not None and element.TextColor != COLOR_SYSTEM_DEFAULT: + style += 'color: %s;' % element.TextColor + if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT: + style += 'background-color: %s;' % element.BackgroundColor + element.QT_Label.setStyleSheet(style) + + qlabel.setFrameStyle(QFrame.VLine if element.Orientation[0] =='v' else QFrame.HLine) + + qt_row_layout.addWidget(element.QT_Label) + pass # ............................DONE WITH ROW pack the row of widgets ..........................# @@ -6269,7 +6291,12 @@ def main(): [Text('Destination Folder', size=(150, 25), justification='right'), InputText('Dest'), FolderBrowse()], [Ok(bind_return_key=True), Cancel()]] - window = Window('Demo window..',auto_size_buttons=False, default_element_size=(280,22), default_button_element_size=(80,21)).Layout(layout) + window = Window('Demo window..', + auto_size_buttons=False, + default_element_size=(280,22), + auto_size_text=False, + default_button_element_size=(80,21) + ).Layout(layout) event, values = window.Read() print(event, values) window.Close() diff --git a/PySimpleGUIQt/readme.md b/PySimpleGUIQt/readme.md index 1a102f4a..568a9956 100644 --- a/PySimpleGUIQt/readme.md +++ b/PySimpleGUIQt/readme.md @@ -77,7 +77,11 @@ It is recommended that you use PySide2, however, if that cannot be found, then P ## Testing your installation Once you have installed, or copied the .py file to your app folder, you can test the installation using python. At the command prompt start up Python. -``` python3 >>> import PySimpleGUIQt >>> PySimpleGUIQt.main() ``` + + python3 + >>> import PySimpleGUIQt + >>> PySimpleGUIQt.main() + You will see a sample window in the center of your screen. If it's not installed correctly you are likely to get an error message during one of those commands Here is the window you should see: @@ -96,6 +100,7 @@ PySide2 or PyQt5 `import PySimpleGUIQt as sg` Then use the exact same code as any other PySimpleGUI program that runs on tkinter. + ## Status ### FEATURE COMPLETE! @@ -159,11 +164,38 @@ Dial element default value Show expanded option for trees Titles for popups +### 0.13.0 - 22-Nov-2018 + +Focus for Input Text and Multiline Input + + - Get focus + - Set focus +Window.FindElementWithFocus works +Multiline input + + - Change submits + - Update - disabled, append + +Multiline output - Update value, append, disabled, get value +Text clicked submits +File types for open files +Initial folder, file types, for browse buttons +File types standardized on tkinter data format +Find Element With Focus now works for input and multiline input +Yet more multiwindow handling +Relief for Text element +Input text disable +Correct sizing of Comboboxes using visible items parm +Correct default values for input and multiline input +Change submits for multiline +Horizontal and Vertical separators +PopupGetFile and PopupGetFolder - no_window option works + ## Design - ## Author -Mike B. + ## Author + Mike B. ## Demo Code Contributors