TkInter wrapper for tcl/tk GUI: Difference between revisions
No edit summary |
|||
| Line 282: | Line 282: | ||
Stuck with "couldn't find procedure Color_Init". And I can't find it myself in which file this procedure ought to be. | Stuck with "couldn't find procedure Color_Init". And I can't find it myself in which file this procedure ought to be. | ||
Searching through the whole trunk branch gives no results: | |||
grep -Ril Color_Init * | |||
Revision as of 01:17, 28 December 2018
This is a guide how you can check out the oldschool 90s tcl/tk interface of ASCEND which is part of engineering history and worth conserving.
The TkInter wrapper is used to call the tcl legacy code:
https://wiki.python.org/moin/TkInter
https://en.wikipedia.org/wiki/Tkinter
Here are notes which are going to be formulated in detail over time:
Python script to wrap the legacy tcl code with TkInter
Environment variables have to be set in the Python script.
See http://ascend4.org/Environment_variables_for_ASCEND for more information.
Locate the following script in the ascend/tcltk/tk/ folder and call it from the command line.
import tkinter gui = tkinter.Tk() #Variables ASCENDTK = tkinter.StringVar() ASCENDTK.set("./") ASCENDBITMAPS = tkinter.StringVar() ASCENDBITMAPS.set("./bitmaps") ASCENDDIST = tkinter.StringVar() ASCENDDIST.set("../../") TKTABLE_LIBRARY = tkinter.StringVar() TKTABLE_LIBRARY.set("/usr/lib/tcltk/x86_64-linux-gnu/Tktable2.10") asc_swap_del_backspace = tkinter.StringVar() asc_swap_del_backspace.set("1") # for UNIX systems argc = tkinter.IntVar() argc.set(0) #Evaluation gui.tk.eval('lappend auto_path {%s}' % './') gui.tk.eval('lappend auto_path {%s}' % '../interface') gui.tk.eval('lappend auto_path {%s}' % '../../ascend/compiler') gui.tk.eval('lappend auto_path {%s}' % '../../ascend/general') gui.tk.eval('lappend auto_path {%s}' % '../../ascend/system') gui.tk.eval('lappend auto_path {%s}' % '../../ascend/utilities') gui.tk.eval('package require color 1.0') gui.tk.eval('package require block 1.0') gui.tk.eval('package require error 1.0') gui.tk.eval('package require module 1.0') gui.tk.eval('package require LibraryProc 1.0') gui.tk.eval('set env(ASCENDTK) %s' % (ASCENDTK.get())) gui.tk.eval('set env(ASCENDBITMAPS) %s' % (ASCENDBITMAPS.get())) gui.tk.eval('set env(ASCENDDIST) %s' % (ASCENDDIST.get())) gui.tk.eval('set asc_swap_del_backspace %s' % (asc_swap_del_backspace.get())) gui.tk.eval('set argc %s' % (argc.get())) #gui.tk.eval('package require Tktable') gui.tk.eval('source {ascend.tcl}') #Mainloop gui.mainloop()
The GUI starts if one comments all the lines loading the packages out (package require) and see the Notes section below what to change in the codebase.
Shared libraries can be compiled and then provided as a package via pkgIndex.tcl in the respective folder for the shared libraries.
Example for ascend/tcltk/interface/LibraryProc.c:
$ gcc -fPIC -shared -DUSE_TCL_STUBS -I /usr/include/tcl8.5/ -I ../../ -o LibraryProc.so LibraryProc.c -L /usr/share/tcltk/tcl8.5 -ltclstub8.5
Create pkgIndex.tcl (case-sensitive!) in the same folder:
package ifneeded LibraryProc 1.0 \ [list load [file join $dir LibraryProc[info sharedlibextension]]]
ascend/tcltk/tk/
| AscendRC | |
|---|---|
| ascend.tcl | env(ASCENDTK) |
| GlobalProc.tcl | set_global_defaults Glob_do_GNU set_Template_defaults asc_swap_del_backspace -> GlobalProc.tcl ; set to "1" for unix systems set_Global_Defaults {} { __userdata_init |
| View.tcl | |
| main.tcl | load_Templates Util_do_Read |
ascend/tcltk/interface
| config.h | |
|---|---|
| main.c | main() This function creates a Tcl interpreter, initializes Tcl and Tk, initializes the Ascend data structures, sets up the user's environment, sources ASCEND's startup script, and calls Tk_MainLoop so the user can interact with ASCEND. Cleans up and exits the program when Tk_MainLoop returns. This function is based on the functions Tk_Main and Tcl_AppInit from the Tk8.0 distribution. See the files tkMain.c and tkAppInit.c in the Tk sources. |
| Commands.c | __userdata_init |
| Driver.c | AscDriver() |
Changes made to the codebase to get the GUI up and running with TkInter
There was an issue with tktable which I couldn't fix and also found this bug report which might actually not be resolved: http://bugs.ascend4.org/view.php?id=254 see also:
https://github.com/nbro/tktable/issues/3
https://github.com/nbro/tktable/issues/1
Also the trunk branch was missing the interval.c and interval.h files in ascend/compiler/.
I copied the files over from the Python3 branch and then the issue was solved
In line 138 in solver.tcl the - bitmap {feet} and -bitmap{stop} options couldn't find the bitmaps in ascend/tcltk/tk/bitmaps.
See the Notes section for other changes to get the tcl/tk interface working.
Notes
ASC_IMPORT:
Definition at line 124 of file ascend/general/platform.h
asc_swap_del_backspace:
set to "1" for unix systems (done in Python script)
__userdata_init:
comment out
argc:
set argument counter argc to 0 (done in Python script)
tktable missing:
- install via sudo apt-get install tk-table
- ascend still can't find tktable
- install tcl8.5-dev, tk8.5-dev, libxft-dev, libfontconfig1-dev, libfreetype6-dev, libpng-dev
- error: if {[catch {package require Tktable 2.8} err]} in ascend.tcl
- http://bugs.ascend4.org/view.php?id=254
- https://github.com/nbro/tktable/issues/3
- The plot window and the solver window require the
- TkTable exension package by Roland King mthomas 98.05.07: require 1.8 until we debug the memory errors in 2.0
- comment the if clause block starting with line 225 in ascend.tcl out
- Issue not yet resolved
error because interval.c and interval.h files were missing (trunk branch) in ascend/compiler/:
copy both files from Python3 branch into the trunk branch folder
bitmap "feet" not defined:
- ascend.tcl line 259: awin all
- awin is in GlobalProc.tcl
- ShowWindow.solver in line 108 in GlobalProc.tcl
- line 138 in solver.tcl
- option -bitmap {feet} was removed because it couldn't be located
- option -bitmap {stop} was removed
Ascend starts with main GUI! Some windows or buttons still don't work.
still having these error messages:
Error calling set_Library_Defaults; invalid command name "libr_query (in NoteboxProc.tcl) defined in LibraryProc.h
Error calling set_Probe_Defaults; invalid command name "__probe" (in ProbeProc.tcl)
Error calling set_Solver_Defaults; invalid command name "slv_available" (in SolverProc.tcl)
Error calling set_Units_Defaults invalid command name "u_dim2num" (in UnitsProc.tcl)
The commands aren't found because the C code isn't compiled as a shared library (extension). See this link to build the extensions in ascend/tcltk/interface:
https://wiki.tcl-lang.org/page/Hello+World+as+a+C+extension
https://www.tcl.tk/man/tcl8.4/TclLib/InitStubs.htm:
see also: https://www.tcl.tk/doc/howto/stubs.html
Change to interface directory and compile to shared libraries:
$ gcc -fPIC -shared -DUSE_TCL_STUBS -I /usr/include/tcl8.5/ -I ../../ -o LibraryProc.so LibraryProc.c -L /usr/share/tcltk/tcl8.5 -ltclstub8.5
But getting this error then when trying to load the shared library in the tcl shell (tclsh):
$tclsh
% load LibraryProc.so
% couldn't load file "LibraryProc.so": LibraryProc.so: undefined symbol: g_alt_ending
So the global variable g_alt_ending can't be found:
http://ascend4.org/Global_variables
ASC_DLLSPEC CONST char* g_alt_ending[MOD_FILE_EXTS]
This array defines the expected file extensions for parsable ascend MODEL/ATOM/unit code. Files are not limited to these, however. Interfaces that see a trailing .* where * is other than these should enquire as to the user intent: the user may have made a mistake.
Definition at line 58 of file ascend/compiler/module.h
Recursively going through all files where a symbol is defined on which the previous generated shared library depends on and make a shared library of it and package it via pkgIndex.tcl in the respective folder.
Stuck with "couldn't find procedure Color_Init". And I can't find it myself in which file this procedure ought to be.
Searching through the whole trunk branch gives no results:
grep -Ril Color_Init *