pyTermTk - Layouts🌢️

Intro🌢️

TTkLayouts are specialised classes that allow the placement of the widgets.

https://ceccopierangiolieugenio.github.io/pyTermTk/_images/Layout.HLD.001.svg

TTkLayout🌢️

This is the base class for all the different layouts.
It allows free placement of the widgets in the layout area.
Used mainly to have free range moving windows because the widgets are not automatically replaced after a layout event
TTkLayout
 ╔════════════════════════════╗
 β•‘   pos(4,2)                 β•‘
 β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”   pos(16,4)    β•‘
 β•‘   β”‚Widget1β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
 β•‘   β”‚       β”‚   β”‚ Widget2 β”‚  β•‘
 β•‘   β”‚       β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
 β•‘   β”‚       β”‚                β•‘
 β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”˜                β•‘
 β•‘                            β•‘
 β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

TTkHBoxLayout🌢️

This layout allow an automatic place all the widgets horizontally

TTkHBoxLayout
 ╔═════════╀═════════╀═════════╗
 β•‘ Widget1 β”‚ Widget2 β”‚ Widget3 β•‘
 β•‘         β”‚         β”‚         β•‘
 β•‘         β”‚         β”‚         β•‘
 β•‘         β”‚         β”‚         β•‘
 β•‘         β”‚         β”‚         β•‘
 β•‘         β”‚         β”‚         β•‘
 β•šβ•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•

TTkVBoxLayout🌢️

This layout allow an automatic place all the widgets vertically

TTkVBoxLayout
 ╔═════════════════════════════╗
 β•‘         Widget 1            β•‘
 β•Ÿβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β•’
 β•‘         Widget 2            β•‘
 β•Ÿβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β•’
 β•‘         Widget 3            β•‘
 β•Ÿβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β•’
 β•‘         Widget 4            β•‘
 β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

TTkGridLayout🌢️

This layout allow an automatic place all the widgets in a grid the empty rows/cols are resized to the β€œcolumnMinHeight,columnMinWidth” parameters

TTkGridLayout        β”Œβ” columnMinWidth
 ╔═════════╀═════════╀╀═════════╗
 β•‘ Widget1 β”‚ Widget2 β”‚β”‚ Widget3 β•‘
 β•‘ (0,0)   β”‚ (0,1)   β”‚β”‚ (0,3)   β•‘
 β•Ÿβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β•’ ┐ columnMinHeight
 β•Ÿβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β•’ β”˜
 β•‘ Widget4 β”‚         β”‚β”‚         β•‘
 β•‘ (2,0)   β”‚         β”‚β”‚         β•‘
 β•Ÿβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β•’
 β•‘         β”‚         β”‚β”‚ Widget5 β•‘
 β•‘         β”‚         β”‚β”‚ (3,3)   β•‘
 β•šβ•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•§β•§β•β•β•β•β•β•β•β•β•β•

Examples🌢️

1 - Simple TTkLayout🌢️

Following is the code to execute Layout Example in pyTermTk (tryItOnline)

import TermTk as ttk

    # TTkLayout is used by default
root = ttk.TTk()

    # Attach 4 buttons to the root widget
ttk.TTkButton(parent=root, pos=(0,0),  size=(15,5), border=True, text="Button1")
ttk.TTkButton(parent=root, pos=(0,5),  size=(10,4), border=True, text="Button2")
ttk.TTkButton(parent=root, pos=(10,6), size=(10,3), border=True, text="Button3")
ttk.TTkButton(parent=root, pos=(13,1), size=(15,3), border=True, text="Button4")

root.mainloop()

The above code produces the following output:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Button1  β”‚   Button4   β”‚
β”‚            β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚Button2 β”‚β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚        β”‚β”‚Button3 β”‚
β•˜β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•›

2 - Simple TTkVBoxLayout🌢️

Following is the code to execute VBox Example in pyTermTk (tryItOnline)

import TermTk as ttk

    # Set the VBoxLayout as default in the terminal widget
root = ttk.TTk(layout=ttk.TTkVBoxLayout())

    # Attach 4 buttons to the root widget
ttk.TTkButton(parent=root, border=True, text="Button1")
ttk.TTkButton(parent=root, border=True, text="Button2")
ttk.TTkButton(parent=root, border=True, text="Button3")
ttk.TTkButton(parent=root, border=True, text="Button4")

root.mainloop()

The above code produces the following output:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                           β”‚
β”‚                          Button1                          β”‚
β”‚                                                           β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                           β”‚
β”‚                          Button2                          β”‚
β”‚                                                           β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                           β”‚
β”‚                          Button3                          β”‚
β”‚                                                           β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                           β”‚
β”‚                          Button4                          β”‚
β”‚                                                           β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›

3 - Simple TTkHBoxLayout🌢️

Following is the code to execute HBox Example in pyTermTk (tryItOnline)

import TermTk as ttk

    # Set the HBoxLayout as default in the terminal widget
root = ttk.TTk()
root.setLayout(ttk.TTkHBoxLayout())

    # Attach 4 buttons to the root widget
ttk.TTkButton(parent=root, border=True, text="Button1")
ttk.TTkButton(parent=root, border=True, text="Button2")
ttk.TTkButton(parent=root, border=True, text="Button3")
ttk.TTkButton(parent=root, border=True, text="Button4")

root.mainloop()

The above code produces the following output

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚   Button1   β”‚β”‚   Button2   β”‚β”‚   Button3   β”‚β”‚   Button4    β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β”‚             β”‚β”‚             β”‚β”‚             β”‚β”‚              β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›

4 - Simple TTkGridLayout🌢️

Following is the code to execute Grid Example in pyTermTk (tryItOnline)

import TermTk as ttk

    # Set the GridLayout as default in the terminal widget
gridLayout = ttk.TTkGridLayout(columnMinHeight=0,columnMinWidth=2)
root = ttk.TTk(layout=gridLayout)

    # Attach 2 buttons to the root widget using the default method
    # this will append them to the first row
ttk.TTkButton(parent=root, border=True, text="Button1")
ttk.TTkButton(parent=root, border=True, text="Button2")
    # Attach 2 buttons to a specific position in the grid
gridLayout.addWidget(ttk.TTkButton(parent=root, border=True, text="Button3"), 1,2)
gridLayout.addWidget(ttk.TTkButton(parent=root, border=True, text="Button4"), 3,4)

root.mainloop()

The above code produces the following output

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           β”‚β”‚           β”‚
β”‚  Button1  β”‚β”‚  Button2  β”‚
β”‚           β”‚β”‚           β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•β•β•β•›
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚           β”‚
                          β”‚  Button3  β”‚
                          β”‚           β”‚
                          β•˜β•β•β•β•β•β•β•β•β•β•β•β•›
                                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                         β”‚           β”‚
                                         β”‚  Button4  β”‚
                                         β”‚           β”‚
                                         β•˜β•β•β•β•β•β•β•β•β•β•β•β•›

5 - Nested Layouts🌢️

Following is the code to execute Nested Layouts Example in pyTermTk (tryItOnline)

import TermTk as ttk

    # Set the GridLayout as default in the terminal widget
root = ttk.TTk()

gridLayout = ttk.TTkGridLayout()
root.setLayout(gridLayout)

    # Attach 2 buttons to the root widget using the default method
    # this will append them to the first row
    # NOTE: it is not recommended to use this legacy method in a gridLayout
ttk.TTkButton(parent=root, border=True, text="Button1")
ttk.TTkButton(parent=root, border=True, text="Button2")
    # Attach 2 buttons to a specific position in the grid
gridLayout.addWidget(ttk.TTkButton(border=True, text="Button3"), 1,2)
gridLayout.addWidget(ttk.TTkButton(border=True, text="Button4"), 2,4)

    # Create a VBoxLayout and add it to the gridLayout
vboxLayout = ttk.TTkVBoxLayout()
gridLayout.addItem(vboxLayout,1,3)
    # Attach 2 buttons to the vBoxLayout
vboxLayout.addWidget(ttk.TTkButton(border=True, text="Button5"))
vboxLayout.addWidget(ttk.TTkButton(border=True, text="Button6"))

root.mainloop()

The above code produces the following output

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         β”‚β”‚         β”‚
β”‚ Button1 β”‚β”‚ Button2 β”‚
β”‚         β”‚β”‚         β”‚
β•˜β•β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•β•›
                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                      β”‚         β”‚β”‚ Button5 β”‚
                      β”‚ Button3 β”‚β•˜β•β•β•β•β•β•β•β•β•β•›
                      β”‚         β”‚β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                      β”‚         β”‚β”‚ Button6 β”‚
                      β•˜β•β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•β•›
                                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                            β”‚         β”‚
                                            β”‚ Button4 β”‚
                                            β”‚         β”‚
                                            β•˜β•β•β•β•β•β•β•β•β•β•›

6 - Rowspan/Colspan in Grid Layout🌢️

Following is the code to execute row/colspan Example in pyTermTk (tryItOnline)

import TermTk as ttk

root = ttk.TTk()

gridLayout = ttk.TTkGridLayout()
root.setLayout(gridLayout)

    # | x = 0   | x = 1 | x = 2   |
    # |         |       |         |
    # β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” ──────
    # β”‚y=0 x=0 h=1 w=2 β”‚β”‚y=0 x=2  β”‚  y = 0
    # β”‚    Button1     β”‚β”‚h=2 w=1  β”‚
    # β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›β”‚         β”‚ ──────
    # β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚ Button2 β”‚  y = 1
    # β”‚y=1 x=0  β”‚       β•˜β•β•β•β•β•β•β•β•β•β•›
    # β”‚h=2 w=1  β”‚β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” ──────
    # β”‚         β”‚β”‚y=2 x=1 h=1 w=2 |  y = 2
    # β”‚ Button3 β”‚β”‚    Button4     β”‚
    # β•˜β•β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•› ──────

gridLayout.addWidget(ttk.TTkButton(border=True, text="Button1"), 0,0, 1,2)
gridLayout.addWidget(ttk.TTkButton(border=True, text="Button2"), 0,2, 2,1)
gridLayout.addWidget(ttk.TTkButton(border=True, text="Button3"), 1,0, 2,1)
    # It is possible to expand the names
gridLayout.addWidget(ttk.TTkButton(border=True, text="Button4"), row=2, col=1, rowspan=1, colspan=2)

root.mainloop()

The above code produces the following output

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                       β”‚β”‚           β”‚
β”‚        Button1        β”‚β”‚           β”‚
β”‚                       β”‚β”‚           β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›β”‚  Button2  β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚           β”‚
β”‚           β”‚            β”‚           β”‚
β”‚           β”‚            β”‚           β”‚
β”‚           β”‚            β•˜β•β•β•β•β•β•β•β•β•β•β•β•›
β”‚  Button3  β”‚β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           β”‚β”‚                       β”‚
β”‚           β”‚β”‚        Button4        β”‚
β”‚           β”‚β”‚                       β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•›β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›