1+ import pglet
2+ from pglet import Text , Stack , Grid , Column , Textbox , Checkbox , Button , Toolbar
3+ from pglet import toolbar
4+
5+ class Person ():
6+ def __init__ (self , first_name : str , last_name : str , age : int = None , employee : bool = False ):
7+ self .first_name = first_name
8+ self .last_name = last_name
9+ self .age = age
10+ self .employee = employee
11+
12+ def main (page ):
13+ page .title = "Grid example"
14+ page .update ()
15+
16+ # Basic grid
17+ page .add (
18+ Text ("Basic grid" , size = 'large' ),
19+ Stack (width = '50%' , controls = [
20+ Grid (columns = [
21+ Column (name = "First name" , field_name = "first_name" ),
22+ Column (name = "Last name" , field_name = "last_name" ),
23+ Column (name = "Age" , field_name = "age" )
24+ ], items = [
25+ Person (first_name = 'John' , last_name = 'Smith' , age = 30 ),
26+ Person (first_name = 'Samantha' , last_name = 'Fox' , age = 43 ),
27+ Person (first_name = 'Alice' , last_name = 'Brown' , age = 25 )
28+ ])
29+ ])
30+ )
31+
32+ # Sortable grid
33+ page .add (
34+ Text ("Sortable grid with resizable columns and selectable rows" , size = 'large' ),
35+ Grid (selection_mode = 'single' , preserve_selection = True , columns = [
36+ Column (resizable = True , sortable = 'string' , name = "First name" , field_name = "first_name" ),
37+ Column (resizable = True , sortable = 'string' , sorted = 'asc' , name = "Last name" , field_name = "last_name" ),
38+ Column (resizable = True , sortable = 'number' , name = "Age" , field_name = "age" )
39+ ], items = [
40+ Person (first_name = 'John' , last_name = 'Smith' , age = 30 ),
41+ Person (first_name = 'Samantha' , last_name = 'Fox' , age = 43 ),
42+ Person (first_name = 'Alice' , last_name = 'Brown' , age = 25 )
43+ ])
44+ )
45+
46+ # Compact grid
47+ page .add (
48+ Text ("Compact grid with no header and multiple selection" , size = 'large' ),
49+ Grid (compact = True , header_visible = False , selection_mode = 'multiple' , preserve_selection = True , columns = [
50+ Column (max_width = 100 , field_name = "first_name" ),
51+ Column (max_width = 100 , field_name = "last_name" ),
52+ Column (max_width = 100 , field_name = "age" )
53+ ], items = [
54+ Person (first_name = 'John' , last_name = 'Smith' , age = 30 ),
55+ Person (first_name = 'Samantha' , last_name = 'Fox' , age = 43 ),
56+ Person (first_name = 'Alice' , last_name = 'Brown' , age = 25 )
57+ ])
58+ )
59+
60+ # Dynamic grid
61+ grid = None
62+
63+ def delete_records (e ):
64+ for r in grid .selected_items :
65+ grid .items .remove (r )
66+ page .update ()
67+
68+ delete_records = toolbar .Item (text = "Delete records" , icon = 'Delete' , disabled = True , on_click = delete_records )
69+ grid_toolbar = Toolbar (items = [
70+ delete_records
71+ ])
72+
73+ def grid_items_selected (e ):
74+ delete_records .disabled = (len (e .control .selected_items ) == 0 )
75+ delete_records .update ()
76+
77+ grid = Grid (selection_mode = 'multiple' , compact = True , header_visible = True , columns = [
78+ Column (name = 'First name' , template_controls = [
79+ Textbox (value = "{first_name}" )
80+ ]),
81+ Column (name = 'Last name' , template_controls = [
82+ Textbox (value = "{last_name}" )
83+ ]),
84+ Column (name = 'Age' , template_controls = [
85+ Text (value = "{age}" )
86+ ]),
87+ Column (name = 'Is employee' , template_controls = [
88+ Checkbox (value_field = "employee" )
89+ ])
90+ ], items = [
91+ Person (first_name = 'John' , last_name = 'Smith' , age = 30 , employee = False ),
92+ Person (first_name = 'Jack' , last_name = 'Brown' , age = 43 , employee = True ),
93+ Person (first_name = 'Alice' , last_name = 'Fox' , age = 25 , employee = False )
94+ ], margin = 0 , on_select = grid_items_selected )
95+
96+ first_name = Textbox ('First name' )
97+ last_name = Textbox ('Last name' )
98+ age = Textbox ('Age' )
99+
100+ def add_record (e ):
101+ grid .items .append (Person (first_name = first_name .value , last_name = last_name .value , age = age .value , employee = True ))
102+ first_name .value = ''
103+ last_name .value = ''
104+ age .value = ''
105+ page .update ()
106+
107+ page .add (
108+ Text ("Dynamic grid with template columns" , size = 'large' ),
109+ grid_toolbar ,
110+ grid ,
111+ Text ("Add new employee record" , size = 'medium' ),
112+ Stack (horizontal = True , controls = [
113+ first_name ,
114+ last_name ,
115+ age
116+ ]),
117+ Button ("Add record" , on_click = add_record )
118+ )
119+
120+ pglet .app ("python-grid" , target = main )
0 commit comments