TkInter wrapper for tcl/tk GUI

From ASCEND
Revision as of 20:59, 27 December 2018 by MarkJones (talk | contribs) (Notes)
Jump to navigation Jump to search

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() #the Tktable issue hasn't been resolved yet
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('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()

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. See this link to build the extensions in ascend/tcltk/interface:

https://wiki.tcl-lang.org/page/Hello+World+as+a+C+extension

from https://www.tcl.tk/man/tcl8.4/TclLib/InitStubs.htm:

Enabling the stubs mechanism for an extension requires the following steps:

1)

   Call Tcl_InitStubs in the extension before calling any other Tcl functions.

2)

   Define the USE_TCL_STUBS symbol. Typically, you would include the -DUSE_TCL_STUBS flag when compiling the extension.

3)

   Link the extension with the Tcl stubs library instead of the standard Tcl library. On Unix platforms, the library name is libtclstub8.4.a; on Windows platforms, the library name is tclstub84.lib.

If the extension also requires the Tk API, it must also call Tk_InitStubs to initialize the Tk stubs interface and link with the Tk stubs libraries. See the Tk_InitStubs page for more information.

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

load LibraryProc.so

couldn't load file "LibraryProc.so": LibraryProc.so: undefined symbol: g_alt_ending