MHo 2020-08-28: Seems that page content is truncated. Many informations are lost. Can someone restore it?
adavis 2015-11-29: GRIDPLUS 2.11 has been released and is available from:-
http://www.satisoft.com/tcltk/gridplus2
ENHANCEMENTS:
-- I hope this means "-maintainsort"? Larry Smith - adavis 2017-11-15: it does indeed - Corrected!!!
CHANGES:
BUG FIXES:
GRIDPLUS is a "Grid" based GUI builder system which builds on, simplifies and extends the existing Tk grid manager. GRIDPLUS layouts are defined as a hierarchy of grids. Each cell in a grid consists of two elements. These will usually be a text label and some other widget such as an entry. It is also allowed to have just one element in a cell, or a cell which is empty. GRIDPLUS grids can also be stretched to neatly fill the cells in which they are positioned. While the GRIDPLUS grid can be used "native", GRIDPLUS commands/options exist to create grids of Buttons, Checkbuttons, Date-selectors, Dropdowns (comboboxes), Entries, Links, Menubuttons and Radiobuttons. All places where text can be displayed make use of the Tcl message catalog facility.
In fact GRIDPLUS is much more than an alternative to the grid geometry manager, it provides most, if not all, of the facilities required to build complete screens/windows. In many cases, using GRIDPLUS to code an application GUI will be quicker than using a "Visual" screen design tool. Although aimed at producing data entry/update/display form screens for database applications, it may be useful for other tasks.
GRIDPLUS also includes the following features:-
Here Are Some Screens Created Using GRIDPLUS2:
Jeff Smith 2020-08-18 : Below is an online demo using CloudTk. This demo runs GridPlus2 example 6 in an Alpine Linux Docker Container. It is a 29.3MB image which is made up of Alpine Linux + tclkit + gridplus.kit + + libx11 + libxft + fontconfig + ttf-linux-libertine. It is run under a user account in the Container. The Container is restrictive with permissions for "Other" removed for "execute" and "read" for certain directories.
adavis 2013-07-03: GRIDPLUS 2.10 has been released and is available from:-
ENHANCEMENTS:
CHANGES:
BUG FIXES:
adavis 2012-07-12: GRIDPLUS 2.9 has been released and is available from:-
BUG FIXES:
adavis 2012-04-04: GRIDPLUS 2.8 has been released and is available from:-
http://www.satisoft.com/tcltk/gridplus2
ENHANCEMENTS:
CHANGES
BUG FIXES:
adavis 2012-02-27: GRIDPLUS 2.7 has been released and is available from:-
http://www.satisoft.com/tcltk/gridplus2
ENHANCEMENTS:
BUG FIXES:
adavis (29th February 2012): I have corrected an error in the documentation example for setting default date values. Both the website and the documentation download have been updated.
adavis 2010-10-25: GRIDPLUS 2.6 has been released and is available from:-
http://www.satisoft.com/tcltk/gridplus2
ENHANCEMENTS:
BUG FIXES:
adavis 2009-11-11: GRIDPLUS 2.5 has been released and is available from:-
http://www.satisoft.com/tcltk/gridplus2
ENHANCEMENTS:
CHANGES:
BUG FIXES:
EXAMPLES:
Here are examples of the the calendar and date selector widgets:-
adavis 2009-09-06: GRIDPLUS 2.4 has been released and is available from:-
http://www.satisoft.com/tcltk/gridplus2
ENHANCEMENTS:
CHANGES:
BUG FIXES:
adavis 2008-05-27: GRIDPLUS 2.3 has been released.
ENHANCEMENTS:
CHANGES:
BUG FIXES:
adavis 2007-07-26: GRIDPLUS 2.2 has been released.
ENHANCEMENTS:
CHANGES:
BUG FIXES:
adavis 2007-02-28: GRIDPLUS 2.1 has been released.
ENHANCEMENTS:
CHANGES:
BUG FIXES:
adavis 2006-10-10: GRIDPLUS 2.0 has been released.
GRIDPLUS2 is a Tile based version of GRIDPLUS. Whereas GRIDPLUS Version 1 has features to control widget style as well as window layout - GRIDPLUS2 assumes that the Tile style engine facilities will be used to control widget styles. GRIDPLUS2 instead provides significantly enhanced screen layout/design functionality which can further reduce the coding required to create the desired window/widget layout.
One of the main enhancements is the new GRIDPLUS2 Widget Grid [L2 ]. With GRIDPLUS1 it was only possible to create one type of widget in a particular Grid (Buttons, checkbuttons, entries etc.). In order to mix widgets in a Grid it was necessary to create additional Grids for the other widget types and then "embed" them into a parent Grid. The new widget Grid allows all of the GRIDPLUS widget types to be mixed in the same Grid.
There are many more changes and enhancements - See the GRIDPLUS2 Readme [L3 ] for further details.
AET 2007-03-01: As usual, Adrian, A top-notch offering. A well thought out utility, and documentation that is exemplory. Thanks very much. I am still struggling to put together a database using GRIDPLUS, but will be porting it to GRIDPLUS 2 as soon as I can.
Ro 2007-03-03: Fantastic project! Currently resizable toplevels are not supported, but you can do it with "wm resizable .mytoplevel 1 1" if you really need to. I don't think it's necessary for these kinds of apps (database + well behaved windows apps) but it's interesting to know. Thanks Adrian for this superb package.
WHD: The GRIDPLUS2 home page says that it's only been tested on Windows XP. Has anyone used it successfully on Linux?
Effe: I didn't check each and every detail, but GRIDPLUS 2.4 works well on Linux (tested with ActiveTcl 8.6 on fluxflux Linux).
MHo 2009-11-10:
adavis (11th November 2009): I'm assuming that "C:/Programme/Tcl/lib/tcl8.5" is your Tcl library path (info library) - If this is the case, have you installed/copied the "TkIcons" file to this location? If this isn't the problem can you give me an example? MHo No I forgot this...
MHo 2009-11-14:
This works:
gpset .mytree2 { /a /a/b /a/b/c }
This one does not work:
gpset .mytree2 { /a/b /a/b/c }
Does this mean that trees always have to begin with the root element?
adavis 2009-11-16: More generally, it is required that the parent for a node be created explicitly, unless the parent is the root.
MHo 2009-12-05: More questions:
adavis 2009-12-07:
MHo 2009-12-07:
adavis 2009-12-08: Currently that is true.
However - Adding a...
single/space { bind $options(name).tree <Button-1> "after 1 [list ::gridplus::gpTreeSelect $options(name) .$window $options(-validate) [list $command]]" bind $options(name).tree <space> "after 1 [list ::gridplus::gpTreeSelect $options(name) .$window $options(-validate) [list $command]]" }
...case to the "$options(-action)" switch in ::gridplus::gpTree will add an option (-action single/space) to implement this functionality. I will include this modification in the next GRIDPLUS2 release.
nb 2010-09-05:
Really good stuff Adrian I've been putting off doing a complex db/form app for awhile now due to "packing hell" that comes along with these forms.I'm blowing this app off like nothing with your package, bravo... If I'm not careful, I'm risking finishing it too early ;-)
OTOH, Maybe I'm missing something obvious, I went through the docs but did not see anywhere a way to set the state of individual widgets (as opposed to the whole grid), e.g. set an entry to disabled.
regards
adavis 2010-02-05: In GRIDPLUS2 there are a couple of ways to achieve this - depending on what you are trying to do.
If you simply want to set the state of an individual widget when it is created you can use the "<" (create as disabled) or ">" (create as enabled) widget option. The GRIDPLUS2 documentation Example 1 uses this for the "ID" field.
You can also use the Groups facility to enable/disable named groups of widgets.
nb 2010-05-08:
I've also found the following very helpful which is referenced in the docs
http://www.satisoft.com/tcltk/gridplus2/reference.html#modes
"It maybe neccessary to reference Tablelist, Text or Tree widgets directly in order to get information about the widget -or- to set an attribute not available through GRIDPLUS."
GRIDPLUS uses a simple widget naming scheme which makes this easy.
Examples assuming a GRIDPLUS widget called ".mywidget" of each of the above types:-
Tablelist: .mywidget.tablelist
Text: .mywidget.text
Tree: .mywidget.tree
For example: To get the number of rows in a tablelist:-
.mywidget.tablelist size
Figure I'd save someone sometime ;-)
milarepa 2010-10-17 07:54:41:
Hi, I am testing gridplus 2.5 on Linux. I am trying to run the "Container Example 1" GRIDPLUS2 Container without success. I tested it with both tcl/tk 8.5.9 and 8.6b1 versions and both Ubuntu 10.10 and Archlinux and is not working properly. It does only works on Windows XP. Please any help or thoughts. This is the error log:
invalid command name ".win2" invalid command name ".win2" while executing "$options(name) configure -menu {}" (procedure "gpClear" line 24) invoked from within "gpClear" (procedure "::gridplus::gridplus" line 116) invoked from within "::gridplus::gridplus clear .win2" ("eval" body line 1) invoked from within "eval $gpInfo($options(-in):wcmd)" (procedure "gpWindow" line 29) invoked from within "gpWindow" (procedure "gridplus" line 138) invoked from within "gridplus window .win1 -in .mycont" (procedure "display_win1" line 3) invoked from within "display_win1" invoked from within ".select,win1 invoke " invoked from within ".select,win1 instate {pressed !disabled} { .select,win1 state !pressed; .select,win1 invoke } " (command bound to event)
THANK YOU
adavis 2010-10-19: I now have a fix for this (still testing). I intend to upload to the website within the next week. If you need it urgently please email me.
milarepa 2010-10-19 18:11:47:
Thank you Adrian for your quick reply and for trying to solve the issue. I can wait for the fix. And thank you for your work on gridplus, I love this package, it is so easy to build applications and I always find a way to arrange the widgets the way I want it.
adavis 2010-10-25: This problem is fixed in GRIDPLUS 2.6.
nb 2010-11-29: Hi all,
Was wondering if there's any preferred way to read/write to an sqlite db from a gridplus application interface, outside of looping over the "" array where the widget values are stored.
Currently trying to use nstcl w/ sqlite backend?
Any hints would be welcome
regards
milarepa 2010-11-29 10:30:05:
Currently I am developing an application with gridplus and sqlite as backend. I don't use any database layer, just the standard sqlite3 library for tcl.
For example, let say you are developing an application for a school and you want to load a dropdown widget with a list of lessons:
gpset .form,dropdown_lesson [db eval "SELECT lesson_name FROM lesson"]
To save it:
db eval "INSERT INTO new_lesson (lesson_name) VALUES ('[.form,dropdown_lesson get]'"
I do not quite understand what you mean when you said "outside of looping over the array". If you could be more specific.
adavis 2010-11-29: You can also use gpmap to set multiple interface items with a single command - See "Mapping of a SQLite result" here . All GRIDPLUS interface items have their value in the null named array. If you have an item called ".form,dropdown_lesson" its value can be referenced as: $(.form,dropdown_lesson)
nb 2011-01-27: Thanks for the advice above, I've gotten my simple items working ok. While this is probably not gridplus specific, the difficulties I'm facing now is a strategy for storing the multiple items selected in a treeview. While storing the selected values of a tree in a single field is straightforward, e.g just store "/u1 /u1/3 /u1/6 /u1/8 /u2 /u2/2 /u2/4 /u2/6 /u2/18 /u3/2 /u3/3 /u6" /u2", this approach does not facilitate future queries, like what "find all the /u1's"....
MHo 2011-05-29: I miss scrolled windows as a gridplus widget type. 2nd question: I noticed that, when doing a gridplus window operation to define a new toplevel window, for a short time, a blank windows is appearing just before the final layout is configured and the window is packed. Is there a way to avoid the flicker? The code (fragment) is as follows:
gridplus window .main -modal 1 -topmost 1 -windowcommand main:buttons,exit wm withdraw .main eval [format {gridplus widget .main.userWidget -title $fTitle %s} $args] gridplus button .main.buttons { {Weiter .ok} {Abbruch .exit} } gridplus layout .main.layout -wtitle $wTitle { .main.userWidget .main.buttons:e } bind .main <Escape> [list main:buttons,exit] pack .main.layout
adavis 2011-05-31: I don't have a complete cure for this (for the moment at least) - but you could try the following...
gridplus window .main -modal 1 -topmost 1 -windowcommand main:buttons,exit -overrideredirect 1 wm withdraw .main wm overrideredirect .main 0
...the flicker should be much less noticable.
MHo: Thanks, that works. Another remark: As you may guess from the code fragment above, I'll try to encapsulate gridplus in a way that one could quickly define a simple dialog without caring about the tricky details. The call from the shelling application's perspective than looks something like:
if {[gpDialog1 TestFensterTitel TestFrameTitel { {&e "Benutzer" .benutzer} {&e "Neues Kennwort" .passwort +} {"Optionen" &c .unlock} {} }] == 1} { msgBox ">>>$gpDialog1bValues<<<" }
which is pretty simple, I think. The only thing which isn't possible this way is using constructs which needs explicitely coded callbacks. This was the reason that I first choosed tepam as part of my program. With tepam, one could build complex dialogs without using callbacks. As I discovered several things which does not work as I expected and the dialog layout doesn't fullfill my needs though, I switched to gridplus2 again...
adavis 2011-05-31: Can you give me an example of how you would like it to behave?
adavis 2011-06-01: Something you may find useful - maybe if developing a dialog builder which allows users to create/customise their own dialogs/screens - is to use GRIDPLUS defined widgets.
This is best explained using a simple example:-
#-------------------------------# # First, define some widgets... # #-------------------------------# gridplus define { userid {&e "User ID" .userid 25 +} password {&e "Password" .password 25 *} ok-cancel {|&b "OK" .ok |> "Cancel" .cancel} } #----------------------------------# # Then, use the defined widgets... # #----------------------------------# gridplus widget .dialog -wtitle Login { @userid @password = @ok-cancel } pack .dialog #-------------------------------------# # ...to create a simple login dialog. # #-------------------------------------#
MHo Thanks again, later I will give a complete example, which illustrates better, what I want. Here's another questions:
More questions: