Browse Source

Basic LogViewer, Minor Fixes, Multiple log handlers

pull/3/head
Eugenio Parodi 5 years ago
parent
commit
eb7507292c
  1. 1
      .gitignore
  2. 2
      TermTk/TTkCore/canvas.py
  3. 11
      TermTk/TTkCore/log.py
  4. 10
      TermTk/TTkLayouts/gridlayout.py
  5. 6
      TermTk/TTkLayouts/layout.py
  6. 2
      TermTk/TTkWidgets/combobox.py
  7. 1
      TermTk/TTkWidgets/lineedit.py
  8. 41
      TermTk/TTkWidgets/logviewer.py
  9. 24
      TermTk/TTkWidgets/widget.py
  10. 3
      docs/BUGS.md
  11. 16
      tests/test.ui.008.table.py
  12. 129
      tests/test.ui.009.widgets.form.py

1
.gitignore vendored

@ -4,6 +4,7 @@ __pycache__/
*$py.class
# other
tests/test.dummy.py
*.swp
tmp
profiler.txt

2
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)

11
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
TTkLog._messageHandler.append(mh)

10
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():

6
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():

2
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))

1
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):

41
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.
# 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

24
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()

3
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~~
- [Minor] test.ui.009.py - Starting layout size is wrong
- [Major] ~~[Canvas Paint] The Top Left corner start with the bottom right corner color~~

16
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)

129
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()
Loading…
Cancel
Save