diff --git a/.gitignore b/.gitignore index ede3637d..0a11441d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ __pycache__/ *$py.class # other +tests/test.dummy.py *.swp tmp profiler.txt diff --git a/TermTk/TTkCore/canvas.py b/TermTk/TTkCore/canvas.py index 5026eba5..6d9b9717 100644 --- a/TermTk/TTkCore/canvas.py +++ b/TermTk/TTkCore/canvas.py @@ -170,7 +170,7 @@ class TTkCanvas: self._set(y,l, gg[7], color) self._set(y,r, gg[6], color) - self.drawText((l+1,y),text,colorText) + self.drawText(pos=(l+1,y),text=text,color=colorText) diff --git a/TermTk/TTkCore/log.py b/TermTk/TTkCore/log.py index d1d2c602..f3ec36c2 100644 --- a/TermTk/TTkCore/log.py +++ b/TermTk/TTkCore/log.py @@ -27,7 +27,7 @@ import inspect import logging -from collections.abc import Callable +from collections.abc import Callable, Set class _TTkContext: __slots__ = ['file', 'line', 'function'] @@ -47,7 +47,8 @@ class TTkLog: FatalMsg = 0x0020 SystemMsg = CriticalMsg - _messageHandler: Callable = None + # TypeHandlers = list[Callable] + _messageHandler: Set = [] @staticmethod def _logging_message_handler(mode, context, message): @@ -75,12 +76,12 @@ class TTkLog: @staticmethod def _process_msg(mode: int, msg: str): - if TTkLog._messageHandler is not None: + for cb in TTkLog._messageHandler: curframe = inspect.currentframe() calframe = inspect.getouterframes(curframe,1) if len(calframe) > 2: ctx = _TTkContext(calframe[2]) - TTkLog._messageHandler(mode, ctx, msg) + cb(mode, ctx, msg) @staticmethod def debug(msg): @@ -108,4 +109,4 @@ class TTkLog: @staticmethod def installMessageHandler(mh: Callable): - TTkLog._messageHandler = mh \ No newline at end of file + TTkLog._messageHandler.append(mh) diff --git a/TermTk/TTkLayouts/gridlayout.py b/TermTk/TTkLayouts/gridlayout.py index 5631156e..db0b9526 100644 --- a/TermTk/TTkLayouts/gridlayout.py +++ b/TermTk/TTkLayouts/gridlayout.py @@ -194,6 +194,8 @@ class TTkGridLayout(TTkLayout): def maximumWidth(self) -> int: ''' process the widgets and get the min size ''' + if not self._gridItems[0]: + return 0x1000 maxw = 0 for gridCol in range(len(self._gridItems[0])): maxw += self.maximumColWidth(gridCol) @@ -201,6 +203,8 @@ class TTkGridLayout(TTkLayout): def maximumHeight(self) -> int: ''' process the widgets and get the min size ''' + if not self._gridItems[0]: + return 0x1000 maxh = 0 for gridRow in range(len(self._gridItems)): maxh += self.maximumRowHeight(gridRow) @@ -227,8 +231,8 @@ class TTkGridLayout(TTkLayout): if h < minHeight: h = minHeight if w < minWidth: w = minWidth - # TTkLog.debug(f"w,h:({w,h}) mh:{minHeight} sh:{sortedHeights}") - # TTkLog.debug(f"w,h:({w,h}) mw:{minWidth} sw:{sortedWidths}") + #TTkLog.debug(f"w,h:({w,h}) mh:{minHeight} sh:{sortedHeights}") + #TTkLog.debug(f"w,h:({w,h}) mw:{minWidth} sw:{sortedWidths}") def parseSizes(sizes, space, out): iterate = True @@ -273,7 +277,7 @@ class TTkGridLayout(TTkLayout): i[0] = newy newy += i[1] - # TTkLog.debug(f"h:{horSizes} v:{vertSizes}") + #TTkLog.debug(f"h:{horSizes} v:{vertSizes}") # loop and set the geometry of any item for item in self.children(): diff --git a/TermTk/TTkLayouts/layout.py b/TermTk/TTkLayouts/layout.py index a15d1fe0..f860cb2b 100644 --- a/TermTk/TTkLayouts/layout.py +++ b/TermTk/TTkLayouts/layout.py @@ -127,6 +127,12 @@ class TTkLayout(TTkLayoutItem): item.z = minz self._zSortItems() + def setGeometry(self, x, y, w, h): + ax, ay, aw, ah = self.geometry() + if ax==x and ay==y and aw==w and ah==h: return + TTkLayoutItem.setGeometry(self, x, y, w, h) + self.update() + def update(self): ret = False for i in self.children(): diff --git a/TermTk/TTkWidgets/combobox.py b/TermTk/TTkWidgets/combobox.py index 3cff026e..eb7401f8 100644 --- a/TermTk/TTkWidgets/combobox.py +++ b/TermTk/TTkWidgets/combobox.py @@ -68,7 +68,7 @@ class TTkComboBox(TTkWidget): def mousePressEvent(self, evt): frameHeight = len(self._list) + 2 frameWidth = self.width() - if frameHeight > 30: frameHeight = 30 + if frameHeight > 20: frameHeight = 20 if frameWidth < 20: frameWidth = 20 frame = TTkResizableFrame(layout=TTkGridLayout(), size=(frameWidth,frameHeight)) diff --git a/TermTk/TTkWidgets/lineedit.py b/TermTk/TTkWidgets/lineedit.py index 90ff1365..2a1ad7b0 100644 --- a/TermTk/TTkWidgets/lineedit.py +++ b/TermTk/TTkWidgets/lineedit.py @@ -80,6 +80,7 @@ class TTkLineEdit(TTkWidget): txtPos = len(self._text) self._cursorPos = txtPos self._pushCursor() + return True def keyEvent(self, evt): diff --git a/TermTk/TTkWidgets/logviewer.py b/TermTk/TTkWidgets/logviewer.py index a0033998..bb047dda 100644 --- a/TermTk/TTkWidgets/logviewer.py +++ b/TermTk/TTkWidgets/logviewer.py @@ -20,4 +20,43 @@ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. \ No newline at end of file +# SOFTWARE. + +import os +from TermTk.TTkCore.log import TTkLog +from TermTk.TTkWidgets.widget import * +from TermTk.TTkTemplates.color import TColor +from TermTk.TTkTemplates.text import TText + +class TTkLogViewer(TTkWidget): + __slots__ = ('_color', '_text', '_messages', '_cwd') + def __init__(self, *args, **kwargs): + TTkWidget.__init__(self, *args, **kwargs) + self._name = kwargs.get('name' , 'TTkLabel' ) + self._messages = [] + self._cwd = os.getcwd() + TTkLog.installMessageHandler(self.loggingCallback) + + + def loggingCallback(self, mode, context, message): + logType = "NONE" + if mode == TTkLog.InfoMsg: logType = "INFO" + elif mode == TTkLog.DebugMsg: logType = "DEBUG" + elif mode == TTkLog.WarningMsg: logType = "WARNING" + elif mode == TTkLog.CriticalMsg: logType = "CRITICAL" + elif mode == TTkLog.FatalMsg: logType = "FATAL" + elif mode == TTkLog.ErrorMsg: logType = "ERROR" + self._messages.append(f"{logType}: {context.file}:{context.line} {message}".replace(self._cwd,"_")) + self.update() + + def paintEvent(self): + y = 0 + _,h = self.size() + offset = len(self._messages)-h + if offset<0: offset = 0 + for message in self._messages[offset:]: + self._canvas.drawText(pos=(0,y),text=message) + y+=1 + + + diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index 0154f8db..b0693e6f 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/TermTk/TTkWidgets/widget.py @@ -142,11 +142,6 @@ class TTkWidget: self._width = w self._height = h self._canvas.resize(self._width, self._height) - if self._layout is not None: - self._layout.setGeometry( - self._padl, self._padt, - self._width - self._padl - self._padr, - self._height - self._padt - self._padb) self.update(repaint=True, updateLayout=True) self.resizeEvent(w,h) @@ -164,11 +159,7 @@ class TTkWidget: self._padb = bottom self._padl = left self._padr = right - if self._layout is not None: - self._layout.setGeometry( - self._padl, self._padt, - self._width - self._padl - self._padr, - self._height - self._padt - self._padb) + self.update(repaint=True, updateLayout=True) def mouseDoubleClickEvent(self, evt): return False def mouseMoveEvent(self, evt): return False @@ -287,10 +278,6 @@ class TTkWidget: def setLayout(self, layout): self._layout = layout self._layout.setParent(self) - self._layout.setGeometry( - self._padl, self._padt, - self._width - self._padl - self._padr, - self._height - self._padt - self._padb) self.update(repaint=True, updateLayout=True) def layout(self): return self._layout @@ -419,10 +406,15 @@ class TTkWidget: TTkHelper.addUpdateBuffer(self) TTkHelper.addUpdateWidget(self) if updateLayout and self._layout is not None: - if self._layout.update(): - self.layoutUpdated() + self._layout.setGeometry( + self._padl, self._padt, + self._width - self._padl - self._padr, + self._height - self._padt - self._padb) if updateParent and self._parent is not None: self._parent.update(updateLayout=True) + if updateLayout and self._layout is not None: + if self._layout.update(): + self.layoutUpdated() def setFocus(self): tmp = TTkHelper.getFocus() diff --git a/docs/BUGS.md b/docs/BUGS.md index 8e294d26..aa6a0274 100644 --- a/docs/BUGS.md +++ b/docs/BUGS.md @@ -4,4 +4,5 @@ - [Minor] ~~Overlapping widget click (below window receive the click event)~~ - [Minor] Background color still propagate between widgets - [Minor] Window does not reshape to the max/min layout during initialization -- [Major] ~~[Canvas Paint] The Top Left corner start with the bottom right corner color~~ \ No newline at end of file +- [Minor] test.ui.009.py - Starting layout size is wrong +- [Major] ~~[Canvas Paint] The Top Left corner start with the bottom right corner color~~ diff --git a/tests/test.ui.008.table.py b/tests/test.ui.008.table.py index a011d449..1677d550 100755 --- a/tests/test.ui.008.table.py +++ b/tests/test.ui.008.table.py @@ -31,8 +31,8 @@ import TermTk as ttk words = ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", "elit,", "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore", "magna", "aliqua.", "Ut", "enim", "ad", "minim", "veniam,", "quis", "nostrud", "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo", "consequat.", "Duis", "aute", "irure", "dolor", "in", "reprehenderit", "in", "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla", "pariatur.", "Excepteur", "sint", "occaecat", "cupidatat", "non", "proident,", "sunt", "in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum."] def getWord(): return random.choice(words) -def getSentence(): - return " ".join([getWord() for i in range(0,random.randint(8, 30))]) +def getSentence(a,b): + return " ".join([getWord() for i in range(0,random.randint(a,b))]) ttk.TTkLog.use_default_file_logging() @@ -90,11 +90,11 @@ table3.setColumnColors(( table3.appendItem((" - ","","You see it's all clear, You were meant to be here, From the beginning","","")) for i in range(0, 5): - table1.appendItem((str(i), getWord(), getSentence(), getWord(), getWord())) + table1.appendItem((str(i), getWord(), getSentence(8,30), getWord(), getWord())) for i in range(0, 5): - table2.appendItem((str(i), getWord(), getSentence(), getWord(), getWord())) + table2.appendItem((str(i), getWord(), getSentence(8,30), getWord(), getWord())) for i in range(0, 35): - table3.appendItem((str(i), getWord(), getSentence(), getWord(), getWord())) + table3.appendItem((str(i), getWord(), getSentence(8,30), getWord(), getWord())) table3.appendItem((" - ","This is the end", "Beautiful friend, This is the end My only friend", "the end", "...")) @@ -105,15 +105,15 @@ ii = 1000 def add(): global ii ii+=1 - table1.appendItem((str(ii), getWord(), getSentence(), getWord(), getWord())) - table2.appendItem((str(ii), getWord(), getSentence(), getWord(), getWord())) + table1.appendItem((str(ii), getWord(), getSentence(8,30), getWord(), getWord())) + table2.appendItem((str(ii), getWord(), getSentence(8,30), getWord(), getWord())) btn1.clicked.connect(add) def addMany(): global ii for i in range(0, 500): ii+=1 - table1.appendItem((str(ii), getWord(), getSentence(), getWord(), getWord())) + table1.appendItem((str(ii), getWord(), getSentence(8,30), getWord(), getWord())) table1.appendItem((" - ","This is the end", "Beautiful friend, This is the end My only friend", "the end", "...")) btn2.clicked.connect(addMany) diff --git a/tests/test.ui.009.widgets.form.py b/tests/test.ui.009.widgets.form.py index a5fba967..9d0bbbf0 100755 --- a/tests/test.ui.009.widgets.form.py +++ b/tests/test.ui.009.widgets.form.py @@ -31,83 +31,80 @@ import TermTk as ttk words = ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", "elit,", "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore", "magna", "aliqua.", "Ut", "enim", "ad", "minim", "veniam,", "quis", "nostrud", "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo", "consequat.", "Duis", "aute", "irure", "dolor", "in", "reprehenderit", "in", "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla", "pariatur.", "Excepteur", "sint", "occaecat", "cupidatat", "non", "proident,", "sunt", "in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum."] def getWord(): return random.choice(words) -def getSentence(): - return " ".join([getWord() for i in range(0,random.randint(1, 4))]) +def getSentence(a,b): + return " ".join([getWord() for i in range(0,random.randint(a,b))]) ttk.TTkLog.use_default_file_logging() root = ttk.TTk() -win_form1 = ttk.TTkWindow(parent=root,pos=(1,1), size=(60,30), title="Test Window 1", border=True) -win_form1.setLayout(ttk.TTkGridLayout(columnMinWidth=1)) +win_form1 = ttk.TTkWindow(parent=root,pos=(1,1), size=(60,40), title="Test Window 1", layout=ttk.TTkVBoxLayout(), border=True) +win_form1_grid_layout = ttk.TTkGridLayout(columnMinWidth=1) +ttk.TTkFrame(parent=win_form1, layout=win_form1_grid_layout) +ttk.TTkLogViewer(parent=win_form1) -win_form1.layout().addWidget(ttk.TTkButton(text='Button 1'),0,0) -win_form1.layout().addWidget(ttk.TTkButton(text='Button 2'),1,0) -win_form1.layout().addWidget(ttk.TTkButton(text='Button 3'),0,2) -win_form1.layout().addWidget(ttk.TTkButton(text='Button 4'),1,2) +win_form1_grid_layout.addWidget(ttk.TTkButton(text='Button 1'),0,0) +win_form1_grid_layout.addWidget(ttk.TTkButton(text='Button 2'),1,0) +win_form1_grid_layout.addWidget(ttk.TTkButton(text='Button 3'),0,2) +win_form1_grid_layout.addWidget(ttk.TTkButton(text='Button 4'),1,2) row = 2 -row +=1; win_form1.layout().addWidget(ttk.TTkLabel(text='Combo Box'),row,0) -win_form1.layout().addWidget(ttk.TTkComboBox(list=['One','Two','Some Long Sentence That Is Not a Written Number','Three']),row,2) -row +=1; win_form1.layout().addWidget(ttk.TTkLabel(text='Combo long Box'),row,0) -win_form1.layout().addWidget(ttk.TTkComboBox(list=[getSentence() for i in range(100)]),row,2) - - -row +=1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Test 1'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='Line Edit Test 1'),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Test 2'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='Line Edit Test 2'),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Test 3'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='Line Edit Test 3'),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Test 4'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='Line Edit Test 4'),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Test 5'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='Line Edit Test 5'),row,2) - -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Input Number'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='123456', inputType=ttk.TTkK.Input_Number),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Input Wrong Number'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='No num Text', inputType=ttk.TTkK.Input_Number),row,2) - -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Input Password'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='Password', inputType=ttk.TTkK.Input_Password),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Line Edit Number Password'),row,0) -win_form1.layout().addWidget(ttk.TTkLineEdit(text='Password', inputType=ttk.TTkK.Input_Password+ttk.TTkK.Input_Number),row,2) - -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Checkbox'),row,0) -win_form1.layout().addWidget(ttk.TTkCheckbox(),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Checkbox Checked'),row,0) -win_form1.layout().addWidget(ttk.TTkCheckbox(checked=True),row,2) - -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Default)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Default)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Default)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Default)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(),row,2) - -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Name One)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(name="Name One"),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Name One)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(name="Name One"),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Name One)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(name="Name One"),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Name Two)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(name="Name Two"),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Name One)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(name="Name One"),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Name Two)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(name="Name Two"),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Name Two)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(name="Name Two"),row,2) -row += 1; win_form1.layout().addWidget(ttk.TTkLabel(text='Radio Button (Name Two)'),row,0) -win_form1.layout().addWidget(ttk.TTkRadioButton(name="Name Two"),row,2) +row +=1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Combo Box'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkComboBox(list=['One','Two','Some Long Sentence That Is Not a Written Number','Three']),row,2) +row +=1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Combo long Box'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkComboBox(list=[getSentence(1,4) for i in range(100)]),row,2) + + +row +=1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Test 1'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='Line Edit Test 1'),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Test 2'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='Line Edit Test 2'),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Test 3'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='Line Edit Test 3'),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Test 4'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='Line Edit Test 4'),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Test 5'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='Line Edit Test 5'),row,2) + +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Input Number'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='123456', inputType=ttk.TTkK.Input_Number),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Input Wrong Number'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='No num Text', inputType=ttk.TTkK.Input_Number),row,2) + +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Input Password'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='Password', inputType=ttk.TTkK.Input_Password),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Line Edit Number Password'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkLineEdit(text='Password', inputType=ttk.TTkK.Input_Password+ttk.TTkK.Input_Number),row,2) + +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Checkbox'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkCheckbox(),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Checkbox Checked'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkCheckbox(checked=True),row,2) + +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Radio Button (Default)'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkRadioButton(),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Radio Button (Default)'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkRadioButton(),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Radio Button (Default)'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkRadioButton(),row,2) + +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Radio Button (Name One)'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkRadioButton(name="Name One"),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Radio Button (Name One)'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkRadioButton(name="Name One"),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Radio Button (Name Two)'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkRadioButton(name="Name Two"),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Radio Button (Name One)'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkRadioButton(name="Name One"),row,2) +row += 1; win_form1_grid_layout.addWidget(ttk.TTkLabel(text='Radio Button (Name Two)'),row,0) +win_form1_grid_layout.addWidget(ttk.TTkRadioButton(name="Name Two"),row,2) # ttk.TTkResizableFrame(parent=root, pos=(20,3),size=(30,30)) -row += 1; win_form1.layout().addWidget(ttk.TTkSpacer(),row,0) +#row += 1; win_form1_grid_layout.addWidget(ttk.TTkSpacer(),row,0) + + + root.mainloop() \ No newline at end of file