Tcl error command

Error in tcl script Purpose: for users and developers to list error messages they encounter in Tcl and for others to explain some of the possible causes (and solutions) for these msgs. See also Common Tk Error Messages and Possible Explanations. In many cases, the Tcl error messages are so clear that by reading […]

Содержание

  1. Error in tcl script
  2. Debugging and Errors — errorInfo errorCode catch error return
  3. Error in tcl script
  4. Error in tcl script
  5. What is error management?
  6. Which error-management features are provided by Tcl?
  7. Exception raising commands
  8. return
  9. error
  10. throw
  11. Dealing with an unknown command
  12. Exception handling commands
  13. catch
  14. Background error handling
  15. The return options dictionary and other exception information sources
  16. The return options dictionary
  17. Errorinfo
  18. Errorcode
  19. Errorstack
  20. errorCode and errorInfo
  21. The info command
  22. How to use all this stuff?
  23. Approach 1: return, catch and process the error
  24. Approach 2: tracing ::errorCode
  25. Which errors shall be told to the user?
  26. Which errors shall NOT be told to the user?

Error in tcl script

Purpose: for users and developers to list error messages they encounter in Tcl and for others to explain some of the possible causes (and solutions) for these msgs. See also Common Tk Error Messages and Possible Explanations.

In many cases, the Tcl error messages are so clear that by reading the words carefully, one can pretty much figure out what is needed. However, there are occasionally times when this is not the case. Also, sometimes the error msg in question is from the operating system, but it appears as though the error is coming from Tcl. This page is intended to provide some assistance in those cases.

joem/tcl/faq.html#SectionD I start with these questions and answers:

  1. «not found» or «Command not found»

This error message comes from your shell, not Tcl. The script probably starts with a #! that is followed by a path to the Tcl interpreter that is too long for your system. Many Unix systems are limited to 32 characters (including the #!) in this regard. So, something like this will fail:

You can either shorten the path by moving the tclsh executable to a different directory or by using symbolic links. Another option is to not specify the path at all. See the question «How do I make my script executable regardless of the location of tclsh?» for an example of how to do this.

You have probably commented out a line that ends with an open curly brace. See http://www.psg.com/

Another common cause can be the difference between interactive and command modes for Tcl. When you start up a Tcl interpreter, get a prompt, and type in commands to Tcl, this is called interactive mode. In this mode, Tcl does a few extra things for you. For instance, if you type ls, and you have no proc called ls defined, Tcl will try to exec a command called ls. This sometimes misleads a new Tcl user into thinking that Tcl has ls defined. They then copy into a script file the same commands they typed in during interactive mode. This results in the user getting the error:

Your braces aren’t balanced. Again, one likely, though perhaps non-obvious, reason is improperly commented lines. See Question 12.

  1. expected integer but got .

This error occurs when the interpreter was trying to perform some mathematical operation that requires an integer value, but encountered a non-integer value. While this is pretty obvious when the value supplied is a floating point value or an alphabetic string, this error can be confusing when the value is something that may look like a valid integer — specifically numbers that have leading zeros. See the question How can I use numbers with leading zeros? for an explanation.

  1. «Undefined symbol: main» or similar

The message, which comes not from Tcl but from some tool in the build process, occurs when linking an application. It is probably because the application was written for a version of Tcl different from the one you are linking against.

Older versions of Tcl included a main function in the library (libtcl.a). This caused various problems, in particular with C++ programs, and it was removed starting with version 7.4b1. The application being linked with the Tcl library must now provide the main routine itself.

  1. «extra characters after close brace while executing» [confirm message text]

This error occurs when the user incorrectly codes a proc like this:

That is to say — neglects to put a space before the opening brace of the proc’s body.

  1. «extra characters after close-quote»

This error can occur when there is no space between «if» and open brace «<» for example.

Источник

Debugging and Errors — errorInfo errorCode catch error return

In previous lessons we discussed how the return command could be used to return a value from a proc. In Tcl, a proc may return a value, but it always returns a status.

When a Tcl command or procedure encounters an error during its execution, the global variable errorInfo is set, and an error condition is generated. If you have proc a that called proc b that called c that called d , if d generates an error, the «call stack» will unwind. Since d generates an error, c will not complete execution cleanly, and will have to pass the error up to b , and in turn on to a . Each procedure adds some information about the problem to the report. For instance:

Produces the following output:

This actually occurs when any exception condition occurs, including break and continue . The break and continue commands normally occur within a loop of some sort, and the loop command catches the exception and processes it properly, meaning that it either stops executing the loop, or continues on to the next instance of the loop without executing the rest of the loop body.

It is possible to «catch» errors and exceptions with the catch command, which runs some code, and catches any errors that code happens to generate. The programmer can then decide what to do about those errors and act accordingly, instead of having the whole application come to a halt.

For example, if an open call returns an error, the user could be prompted to provide another file name.

A Tcl proc can also generate an error status condition. This can be done by specifying an error return with an option to the return command, or by using the error command. In either case, a message will be placed in errorInfo , and the proc will generate an error.

error message ?info? ?code?

Generates an error condition and forces the Tcl call stack to unwind, with error information being added at each step.

If info or code are provided, the errorInfo and errorCode variables are initialized with these values.

catch script ?varName?

Evaluates and executes script . The return value of catch is the status return of the Tcl interpreter after it executes script If there are no errors in script , this value is 0. Otherwise it is 1.

If varName is supplied, the value returned by script is placed in varName if the script successfully executes. If not, the error is placed in varName .

return ?-code code? ?-errorinfo info? ?-errorcode errorcode? ?value? Generates a return exception condition. The possible arguments are: -code code The next value specifies the return status. code must be one of:

  • ok — Normal status return
  • error — Proc returns error status
  • return — Normal return
  • break — Proc returns break status
  • continue — Proc returns continue status

These allow you to write procedures that behave like the built in commands break , error , and continue . -errorinfo info info will be the first string in the errorInfo variable. -errorcode errorcode The proc will set errorCode to errorcode . value The string value will be the value returned by this proc. errorInfo errorInfo is a global variable that contains the error information from commands that have failed. errorCode errorCode is a global variable that contains the error code from command that failed. This is meant to be in a format that is easy to parse with a script, so that Tcl scripts can examine the contents of this variable, and decide what to do accordingly.

Источник

Error in tcl script

In previous lessons we discussed how the return command could be used to return a value from a proc. In Tcl, a proc may return a value, but it always returns a status.

When a Tcl command or procedure encounters an error during its execution, the global variable errorInfo is set, and an error condition is generated. If you have proc a that called proc b that called c that called d , if d generates an error, the «call stack» will unwind. Since d generates an error, c will not complete execution cleanly, and will have to pass the error up to b , and in turn on to a . Each procedure adds some information about the problem to the report. For instance:

This produces the following output:

This actually occurs when any exception condition occurs, including break and continue . The break and continue commands normally occur within a loop of some sort, and the loop command catches the exception and processes it properly, meaning that it either stops executing the loop, or continues on to the next instance of the loop without executing the rest of the loop body.

It is possible to «catch» errors and exceptions with the catch command, which runs some code, and catches any errors that code happens to generate. The programmer can then decide what to do about those errors and act accordingly, instead of having the whole application come to a halt. A more flexible facility is the try command — see below.

For example, if an open call returns an error, the user could be prompted to provide another file name.

A Tcl proc can also generate an error status condition. This can be done by specifying an error return with an option to the return command, or by using the error command. In either case, a message will be placed in errorInfo , and the proc will generate an error.

Источник

Error in tcl script

Fabricio Rocha — 08-Feb-2010 — Error treatment in programming always seems to be an underestimated topic, often untold by and to newbies, while it’s a useful thing that might be naturally taught along with the basics in a programming language. Only after some two years of studying Tcl/Tk I was able to find some information about this subject and develop myself a very basic and limited idea of how applications can avoid being crashed by bugs or misuse, so I would like to discuss some error management techniques with the experienced folks, while building up a tutorial from this discussion (something highly useful by aspiring Tclers like me). And, please, treat the errors you find.

What is error management?

Error management is about handling (and sometimes deliberately causing) error termination in scripts. Error termination is one of the modes of termination (see Script termination: results and control) provided by Tcl. As with all modes of termination, the interpreter gathers three pieces of information about the termination: the return code (always 1 in the case of error termination), the result value (by convention, the result value consists of an error message in the case of error termination), and the return options dictionary (a dict ionary structure, described under its own heading below).

Exceptions happen in an unplanned manner in programs: numeric operations overflow, a divisor value happens to be 0, a resource turns out to be unavailable, etc. Such events need to be dealt with to avoid the program crashing. Exceptions can, on the other hand, also be used as a form of flow control to e.g. abandon a deeply nested subroutine that can’t complete its task for some reason, and withdraw directly to a save point location higher up in the call stack.

Which error-management features are provided by Tcl?

Exception raising commands

The following commands cause an error ( raise an exception) that must be handled by code on an earlier level on the call stack: if the error isn’t handled (see below), the program stops. Exception-raising commands can add to the error information gathered by the interpreter, as described in the following.

return

The return command has been around for a long time, but has only been able to raise exceptions since Tcl 8.5.

When used to raise an exception, the minimal invocation is return -code error . Instead of -code error you may write -code 1 : it has the same meaning.

The value of the -code option is stored in the return options dictionary. Other options, such as -level , -errorinfo , -errorcode , -errorline , and -errorstack , may be added to the invocation of return and have their values stored in the return options dictionary too. The option -options , with a dictionary for value, may be used to set the return options dictionary all at once.

The return command always passes a return code equal to the value of the -code option (which, again, should be 1 or error when raising an exception) and a result value equal to the optional result parameter, which comes after any options given. It basically sets up the return options dictionary according to the invocation, with default values used if some options aren’t provided.

See return and the man page for a more thorough description of the command.

error

The error command has been the primary exception-raising command since Tcl 8.4.

It can be invoked in three ways:

The invocation. . is functionally equivalent to:
«Unary error» error message return -code error -level 0 message
«Binary error» error message info return -code error -level 0 -errorinfo info message
«Ternary error» error message info code return -code error -level 0 -errorinfo info -errorcode code message

The error command always passes a return code of 1 and a result value equal to the message parameter. It sets up the return options dictionary a bit differently depending on the invocation.

See error and the man page for a more thorough description of the command.

throw

The throw command was added in Tcl 8.6.

It is invoked like this:

throw type message

which is functionally equivalent to:

return -code error -level 0 -errorcode type message

The throw command always passes a return code of 1 and a result value equal to the message parameter.

See throw and the man page for a more thorough description of the command.

Dealing with an unknown command

This is a conditionally exception-raising command. When Tcl is asked to execute a command procedure it doesn’t know, it first attempts to save the situation by invoking another command named unknown , which then goes through a multi-step procedure to find the command that was asked for. If it still fails to find the command that was invoked, it raises an exception. You can override this behavior by providing your own unknown procedure.

Since Tcl 8.5, there is also the namespace unknown command, which allows the programmer to name a procedure which will be called when a command/procedure lookup fails in the scope of a specific namespace .

The unknown command doesn’t always raise an exception, but when it does, it passes a return code of 1 and a result value equal to invalid command name «yyz» (should the (non-existent) command yyz be invoked).

See unknown and the man page for a more thorough description of the command. The namespace unknown command is described here .

Exception handling commands

An exception that isn’t handled by the program is eventually handled by a default handler which basically only does two things: 1) output an error message, and 2) stop the program. If you want to do something else, like for instance deal with the error somehow and go on, or give up and at least save important data, you need to define an exception handler. The handler will deal with exceptions from commands invoked in the body script or from commands called by those commands, and so on.

An exception handler has two parts: the catcher and the dispatcher. The catcher executes a script or body and intercepts any exceptions raised during the execution. The interpreter passes the return code, the result value, and the return options dictionary to the handler. This information can then be used to dispatch to the exact piece of code (the handler clause) that the programmer has assigned to deal with the kind of termination in question.

catch

The catch command has been the basic exception-handling command since Tcl 8.4.

The catch command performs the catching part of exception handling, but does not dispatch. If fail is a command that raises an exception, this invocation:

simply prevents the exception from stopping the program but does nothing to deal with the problem. The traditional invocation looks like this:

set returnCode [catch < script> result]

In this case, after running catch the variable result contains the result value at termination of script . The result value of catch (which is stored in returnCode in this snippet) is the return code of the termination. If this return code is 0, no exception was raised and the variable result contains valid data, the return value of script . If it is greater than 0, the script was interrupted by an error or control flow operation (see Script termination: results and control for details).

This means that we can build a simplistic dispatcher using the return code from catch (in this example, only dealing with the non-zero and zero cases):

This construct will either set the variable f to whatever open returns, or if something happens, dispatch to the code puts «Ouch: $result» .

A more general dispatching construct:

For more fine-grained dispatching while handling exceptions, information from the return options dictionary (especially the -errorcode value) can be used. (The format of the value of -errorcode is discussed below.)

See catch and the man page for a more thorough description of the command.

The try command was added in Tcl 8.6.

The try command performs both the catching and dispatching parts of exception handling. The dispatching is defined by adding handler clauses to the command invocation:

There is no way to define a default handler clause to round up any remaining modes of termination, but if error codes like, say, 42 and 1138 are expected to be returned from a script, you can add the following specific clauses:

It isn’t necessary to define all kinds of handler clauses, indeed no handler clause at all needs to be defined. If none of the defined handler clauses get the dispatch, the exception is propagated outside the try construct.

Dispatching can also be based on the -errorcode value in the return options dictionary by using trap -style handler clauses:

The handler clauses should be ordered from most specific to most generic. Note that the on error handler clause must be placed after any trap handler clauses, because it picks up any kind of error exception.

If a handler clause needs to examine the return options dictionary, it can be passed as a second variable to the handler clause:

You can add a finally script clause to the try construct. The code in script will be run whether an error occurs or not and regardless of which handler clause, if any, was dispatched to.

The result value of the try construct is the result value of the handler clause that was dispatched to, or of the script if none of the handler clauses were engaged. The result value of the finally clause is never used.

See try and the man page for a more thorough description of the command.

Background error handling

Tcl/Tk automatically catches exceptions that are raised in background processing (e.g. when events are processed in an update or vwait call) and dispatches them to a programmer-defined handler procedure, if available. If such an exception handler is registered with interp bgerror (available as of Tcl 8.5) the result value of the termination (an error message) and the return options dictionary will be passed to the handler. If no such handler is registered for the active interpreter, it instead attempts to call a global command procedure named bgerror which the programmer needs to define (it doesn’t exist otherwise). The bgerror command only gets one argument passed to it, an error message. If bgerror isn’t available, the error message is simply displayed.

If fail is a command that raises an exception, and we run this code in a Tk-enabled console:

and then press K, we get a dialog box pointing out that an error has occurred.

If we define the bgerror command:

and then press K, we get the message «I’m bgerror».

If we define this command:

and then run this command:

interp bgerror <> myHandler

and then press K, we get the message «I’m myHandler».

See bgerror and the man page for a more thorough description of the command. The interp bgerror invocation is described here and background exception handling here .

The return options dictionary and other exception information sources

The return options dictionary

Whenever an exception is raised, since version 8.5 Tcl creates a dict ionary of keys and values that describe the exception:

Key Used for/describes
-code return category: only 1 signifies an actual exception
-level stack level: 0 for all exceptions
-errorinfo a brief human-readable description of the event, with an appended stack trace
-errorcode machine-readable: either NONE or a list of code words that classify the exception; not the same as -code
-errorline the line where the exception occurred
-errorstack machine-readable: an even-sized list of code words and sub-lists that describe the calling path to the point where the exception was raised

(I’ve heard rumours (e.g. on the man page for try ) of a seventh key, -during , that’s supposed to store information on an original exception if another exception occurs during the handling of the first, but I’m unable to find any real documentation for it.)

As described above, this dictionary is passed by the interpreter to an exception handler, which may pass them on to a handler clause. It is passed with all modes of termination, but the -error* keys are only available on error termination.

Errorinfo

The value of the -errorinfo member is described here . The value of the -errorinfo member is a multi-line string that consists of at least an error message and, on following lines, a stack trace that lists the command invocations between the handler and the point where the exception was raised, interspersed with lines like invoked from within or while executing . The try handler also adds a line reporting on which line in the try body the error occurred. The command invocations are shown unsubstituted, like error $msg . The first line is taken from either

  • the -errorinfo option to return , or
  • the info argument to error , or
  • the message / result argument to error , throw , or return , or
  • whatever error message a failing command produces

Errorcode

The value of the -errorcode member is described here . The value is a list of code words and data that is intended for processing by the program. When raising your own exceptions (and not, say, replicating an error generated by some other command), the single-value list NONE is generally applicable (it means «no further information available», not «no error»). You may also define your own format, in which case you should avoid beginning the list with any of the standard code words (which indicate the class of error and at the same time the format of the rest of the code value) ARITH , CHILDKILLED , CHILDSTATUS , CHILDSUSP , POSIX , or TCL . The value is taken from either

  • the -errorcode option to return , or
  • the code / type argument to error or throw , or
  • whatever error code is generated when a command fails

The CHILDKILLED and CHILDSUSP error classes include in their list the name of the signal that killed or suspended the child process; the name is one of those given in the signal.h C header file (most likely extended by signal names taken from Unix systems, for signals supported by the platform). The POSIX error class reports the symbolic name of the error as defined by the POSIX extension of the errno.h header file. Note that the level of compliance to the POSIX standard varies between platforms, with Windows being only partly compliant.

Errorstack

The value of the -errorstack member is described here . The value is an even-sized list where each pair of members represent one level on the call stack between the handler and the error. Every pair is a code word (or token) followed by a parameter list with one or more members: the members in the parameter list are the name of an invoked command or a descriptor like syntax , returnStk , returnImm , etc, followed by the parameter values as received by the command (i.e. substituted, unlike how they appear in the value of the -errorinfo member).

errorCode and errorInfo

Before Tcl 8.5, basic information on exceptions could be found in two global variables , errorCode and errorInfo . For backwards compatibility, the variables are still available. The errorCode variable contains, as might be expected, the same value as the -errorcode member of the return options dictionary for the latest error. Correspondingly, the errorInfo variable contains the same value as the -errorinfo member. The variables are in no way deprecated, but they are no longer needed: the return options dictionary should be used instead.

The info command

The invocation info errorstack returns the value contained in the -errorstack member of the return options dictionary for the latest error.

How to use all this stuff?

The infrastructure provided by Tcl allows applications to use exception handling, in the traditional sense of «try to do this, and if something goes wrong tell me and I’ll see what can I do». This contrasts to the approach of «errors prediction», which, for example, performs a series of tests on the data which will be passed to a command for checking its validity, before the operation is performed. Both techniques are not excludent, however. Tcl allows various approaches to errors management, with their pros and cons:

Approach 1: return, catch and process the error

1) Always use the advanced return options when writing procedures which can cause or face errors, or which may give back an invalid result;

2) Always use catch for calling commands or your own procedures which can cause or face errors like described in 1;

3) Create a procedure to be called in the case that catch captures an error, for interpreting the error codes and, based on that, show error messages in friendly and standardized dialogs and perform operations which could minimize or solve the error.

Approach 2: tracing ::errorCode

Create a trace on ::errorCode , and a procedure to be called everytime it is modified, for interpreting the codes, display them, provide minimization measures, etc.

Any other? Please add what you do!

LV One useful thing that I sometimes use is creation of log files containing information intended to be useful in determining the state of the program during particular points. Sometimes, displaying information about the values of a number of variables is not as helpful as having that information written to a file — for instance, there are times when a GUI application might not have easy access to stderr for error traces. Writing information to a log file, which is available — and perhaps even emailable — to the programmer responsible is helpful.

Which errors shall be told to the user?

Failure in files, channels and sockets operations?

Errors caused by invalid inputs. It is often useful to use a distinct error code (e.g., INVALID) for data validation errors, as it makes it possible for the application to distinguish between errors in the user’s input and errors in the validation or execution code.

Which errors shall NOT be told to the user?

Syntax errors and programming bugs — They’d better be fixed. Sure, but.

LV Certainly they need to be fixed. However, if you hide the info from the user, how will the programmer know what the bug/error is? Unless you have a guaranteed method of getting said info to the programmer (and email doesn’t count — the user MIGHT be working off line), then providing the user with sufficent information to a) know what the error is and b) know who to contact or what to do about the problem seems the best approach to me.

Fabricio Rocha — 12-Feb-2010 — One more reason for having a way to intercept and explain this kind of errors to common users is that it seems that any test suite or any test routine will not be able to find some errors that users are able to find. Of course it is not nice to show weaknesses to a final user, but this is something practically unavoidable in software. And in addition to the situations listed by LV, we can consider that, for an open source/free software, providing good information about an error is a way to c) allow a user with sufficient programming knowledge to fix the problem and possibly contribute to the software development.

Источник

Tcl itself is quite a good teacher. Don’t be afraid to do something wrong — it will most often deliver a helpful error message. When tclsh is called with no arguments, it starts in an interactive mode and displays a «%» prompt. The user types something in and sees what comes out: either the result or an error message.

Trying isolated test cases interactively, and pasting the command into the editor when satisfied, can greatly reduce debugging time (there is no need to restart the application after every little change — just make sure it’s the right one, before restarting.)

A quick tour[edit | edit source]

Here’s a commented session transcript:

% hello
invalid command name "hello"

OK, so we’re supposed to type in a command. Although it doesn’t look so, here’s one:

% hi
     1  hello
    2  hi

Interactive tclsh tries to guess what we mean, and «hi» is the unambiguous prefix of the «history» command, whose results we see here. Another command worth remembering is «info»:

% info
wrong # args: should be "info option ?arg arg ...?"

The error message tells us there should be at least one option, and optionally more arguments.

% info option
bad option "option": must be args, body, cmdcount, commands, complete, default,
exists, functions, globals, hostname, level, library, loaded, locals, nameofexecutable,
patchlevel, procs, script, sharedlibextension, tclversion, or vars

Another helpful error: «option» is not an option, but the valid ones are listed. To get information about commands, it makes sense to type the following:

% info commands
tell socket subst lremove open eof tkcon_tcl_gets pwd glob list exec pid echo 
dir auto_load_index time unknown eval lrange tcl_unknown fblocked lsearch gets 
auto_import case lappend proc break dump variable llength tkcon auto_execok return
pkg_mkIndex linsert error bgerror catch clock info split thread_load loadvfs array
if idebug fconfigure concat join lreplace source fcopy global switch which auto_qualify
update tclPkgUnknown close clear cd for auto_load file append format tkcon_puts alias 
what read package set unalias pkg_compareExtension binary namespace scan edit trace seek 
while flush after more vwait uplevel continue foreach lset rename tkcon_gets fileevent 
regexp tkcon_tcl_puts observe_var tclPkgSetup upvar unset encoding expr load regsub history
exit interp puts incr lindex lsort tclLog observe ls less string

Oh my, quite many… How many?

% llength [info commands]
115

Now for a more practical task — let’s let Tcl compute the value of Pi.

% expr acos(-1)
3.14159265359

Hm.. can we have that with more precision?

% set tcl_precision 17
17
% expr acos(-1)
3.1415926535897931

Back to the first try, where «hello» was an invalid command. Let’s just create a valid one:

% proc hello {} {puts Hi!}

Silently acknowledged. Now testing:

% hello
Hi!

Errors are exceptions[edit | edit source]

What in Tcl is called error is in fact more like an exception in other languages — you can deliberately raise an error, and also catch errors. Examples:

if {$username eq ""} {error "please specify a user name"}
if [catch {open $filename w} fp] {
   error "$filename is not writable"
}

One reason for errors can be an undefined command name. One can use this playfully, together with catch, as in the following example of a multi-loop break, that terminates the two nested loops when a matrix element is empty:

if [catch {
   foreach row $matrix {
      foreach col $row {
          if {$col eq ""} throw
      }
   }
}] {puts "empty matrix element found"}

The throw command does not exist in normal Tcl, so it throws an error, which is caught by the catch around the outer loop.

The errorInfo variable[edit | edit source]

This global variable provided by Tcl contains the last error message and the traceback of the last error. Silly example:

% proc foo {} {bar x}
% proc bar {input} {grill$input}
% foo
invalid command name "grillx"
% set errorInfo
invalid command name "grillx"
   while executing
"grill$input"
   (procedure "bar" line 1)
   invoked from within
"bar x"
   (procedure "foo" line 1)
   invoked from within
"foo"

If no error has occurred yet, errorInfo will contain the empty string.

The errorCode variable[edit | edit source]

In addition, there is the errorCode variable that returns a list of up to three elements:

  • category (POSIX, ARITH, …)
  • abbreviated code for the last error
  • human-readable error text

Examples:

% open not_existing
couldn't open "not_existing": no such file or directory
% set errorCode
POSIX ENOENT {no such file or directory}
% expr 1/0
divide by zero
% set errorCode
ARITH DIVZERO {divide by zero}
% foo
invalid command name "foo"
% set errorCode
NONE

Tracing procedure calls[edit | edit source]

For a quick overview how some procedures are called, and when, and what do they return, and when, the trace execution is a valuable tool. Let’s take the following factorial function as example:

proc fac x {expr {$x<2? 1 : $x * [fac [incr x -1]]}} 

We need to supply a handler that will be called with different numbers of arguments (two on enter, four on leave). Here’s a very simple one:

proc tracer args {puts $args}

Now we instruct the interpreter to trace enter and leave of fac:

trace add execution fac {enter leave} tracer

Let’s test it with the factorial of 7:

fac 7

which gives, on stdout:

{fac 7} enter
{fac 6} enter
{fac 5} enter
{fac 4} enter
{fac 3} enter
{fac 2} enter
{fac 1} enter
{fac 1} 0 1 leave
{fac 2} 0 2 leave
{fac 3} 0 6 leave
{fac 4} 0 24 leave
{fac 5} 0 120 leave
{fac 6} 0 720 leave
{fac 7} 0 5040 leave

So we can see how recursion goes down to 1, then returns in backward order, stepwise building up the final result. The 0 that comes as second word in «leave» lines is the return status, 0 being TCL_OK.

Stepping through a procedure[edit | edit source]

To find out how exactly a proc works (and what goes wrong where), you can also register commands to be called before and after a command inside a procedure is called (going down transitively to all called procs). You can use the following step and interact procedures for this:

proc step {name {yesno 1}} {
   set mode [expr {$yesno? "add" : "remove"}]
   trace $mode execution $name {enterstep leavestep} interact
}
proc interact args {
   if {[lindex $args end] eq "leavestep"} {
       puts ==>[lindex $args 2]
       return
   }
   puts -nonewline "$args --"
   while 1 {
       puts -nonewline "> "
       flush stdout
       gets stdin cmd
       if {$cmd eq "c" || $cmd eq ""} break
       catch {uplevel 1 $cmd} res
       if {[string length $res]} {puts $res}
   }
}
#----------------------------Test case, a simple string reverter:
proc sreverse str {
   set res ""
   for {set i [string length $str]} {$i > 0} {} {
       append res [string index $str [incr i -1]]
   }
   set res
}
#-- Turn on stepping for sreverse:
step sreverse
sreverse hello
#-- Turn off stepping (you can also type this command from inside interact):
step sreverse 0
puts [sreverse Goodbye]

The above code gives the following transcript when sourced into a tclsh:

{set res {}} enterstep -->
==>
{for {set i [string length $str]} {$i > 0} {} {
       append res [string index $str [incr i -1]]
   }} enterstep -->
{string length hello} enterstep -->
==>5
{set i 5} enterstep -->
==>5
{incr i -1} enterstep -->
==>4
{string index hello 4} enterstep -->
==>o
{append res o} enterstep -->
==>o
{incr i -1} enterstep -->
==>3
{string index hello 3} enterstep -->
==>l
{append res l} enterstep -->
==>ol
{incr i -1} enterstep -->
==>2
{string index hello 2} enterstep -->
==>l
{append res l} enterstep -->
==>oll
{incr i -1} enterstep -->
==>1
{string index hello 1} enterstep -->
==>e
{append res e} enterstep -->
==>olle
{incr i -1} enterstep -->
==>0
{string index hello 0} enterstep -->
==>h
{append res h} enterstep -->
==>olleh
==>
{set res} enterstep -->
==>olleh
eybdooG

Debugging[edit | edit source]

The simplest way to inspect why something goes wrong is inserting a puts command before the place where it happens. Say if you want to see the values of variables x and y, just insert

puts x:$x,y:$y

(if the string argument contains no spaces, it needs not be quoted). The output will go to stdout — the console from where you started the script. On Windows or Mac, you might need to add the command

console show

to get the substitute console Tcl creates for you, when no real one is present.

If at some time you want to see details of what your program does, and at others not, you can define and redefine a dputs command that either calls puts or does nothing:

proc d+ {} {proc dputs args {puts $args}}
proc d- {} {proc dputs args {}}
d+ ;# initially, tracing on... turn off with d-

For more debugging comfort, add the proc interact from above to your code, and put a call to interact before the place where the error happens. Some useful things to do at such a debugging prompt:

info level 0    ;# shows how the current proc was called
info level      ;# shows how deep you are in the call stack
uplevel 1 ...   ;# execute the ... command one level up, i.e. in the caller of the current proc
set ::errorInfo ;# display the last error message in detail

Assertions[edit | edit source]

Checking data for certain conditions is a frequent operation in coding. Absolutely intolerable conditions can just throw an error:

  if {$temperature > 100} {error "ouch... too hot!"}

Where the error occurred is evident from ::errorInfo, which will look a bit clearer (no mention of the error command) if you code

  if {$temperature > 100} {return -code error "ouch... too hot!"}

If you don’t need hand-crafted error messages, you can factor such checks out to an assert command:

proc assert condition {
   set s "{$condition}"
   if {![uplevel 1 expr $s]} {
       return -code error "assertion failed: $condition"
   }
}

Use cases look like this:

  assert {$temperature <= 100}

Note that the condition is reverted — as «assert» means roughly «take for granted», the positive case is specified, and the error is raised if it is not satisfied.

Tests for internal conditions (that do not depend on external data) can be used during development, and when the coder is sure they are bullet-proof to always succeed, (s)he can turn them off centrally in one place by defining

proc assert args {}

This way, assertions are compiled to no bytecode at all, and can remain in the source code as a kind of documentation.

If assertions are tested, it only happens at the position where they stand in the code. Using a trace, it is also possible to specify a condition once, and have it tested whenever a variable’s value changes:

proc assertt {varName condition} {
   uplevel 1 [list trace var $varName w "assert $condition ;#"]
}

The «;#» at the end of the trace causes the additional arguments name element op, that are appended to the command prefix when a trace fires, to be ignored as a comment.

Testing:

% assertt list {[llength $list]<10}
% set list {1 2 3 4 5 6 7 8}
1 2 3 4 5 6 7 8
% lappend list 9 10
can't set "list": assertion failed: 10<10

The error message isn’t as clear as could be, because the [llength $list] is already substituted in it. But I couldn’t find an easy solution to that quirk in this breakfast fun project — backslashing the $condition in the assertt code sure didn’t help. Better ideas welcome.

To make the assertion condition more readable, we could quote the condition one more time,i.e

 % assertt list {{[llength $list]<10}}
 % set list {1 2 3 4 5 6 7 8}
 1 2 3 4 5 6 7 8
 % lappend list 9 10
 can't set "list": assertion failed: [llength $list]<10
 %

In this case,when trace trigger fires, the argument for assert is {[llength $list]<10}.

In any case, these few lines of code give us a kind of bounds checking — the size of Tcl’s data structures is in principle only bounded by the available virtual memory, but runaway loops may be harder to debug, compared to a few assertt calls for suspicious variables:

assertt aString {[string length $aString]<1024}

or

assertt anArray {[array size anArray] < 1024*1024}

Tcllib has a control::assert with more bells and whistles.

A tiny testing framework[edit | edit source]

Bugs happen. The earlier found, the easier for the coder, so the golden rule «Test early. Test often» should really be applied.

One easy way is adding self-tests to a file of Tcl code. When the file is loaded as part of a library, just the proc definitions are executed. If however you feed this file directly to a tclsh, that fact is detected, and the «e.g.» calls are executed. If the result is not the one expected, this is reported on stdout; and in the end, you even get a little statistics.

Here’s a file that implements and demonstrates «e.g.»:

# PROLOG -- self-test: if this file is sourced at top level:
if {[info exists argv0]&&[file tail [info script]] eq [file tail $argv0]} {
   set Ntest 0; set Nfail 0
   proc e.g. {cmd -> expected} {
       incr ::Ntest
       catch {uplevel 1 $cmd} res
       if {$res ne $expected} {
           puts "$cmd -> $res, expected $expected"
           incr ::Nfail
       }
   }
} else {proc e.g. args {}} ;# does nothing, compiles to nothing
##------------- Your code goes here, with e.g. tests following
proc sum {a b} {expr {$a+$b}}
e.g. {sum 3 4} -> 7
proc mul {a b} {expr {$a*$b}}
e.g. {mul 7 6} -> 42
# testing a deliberate error (this way, it passes):
e.g. {expr 1/0} -> "divide by zero"
## EPILOG -- show statistics:
e.g. {puts "[info script] : tested $::Ntest, failed $::Nfail"} -> ""

Guarded proc[edit | edit source]

In more complex Tcl software, it may happen that a procedure is defined twice with different body and/or args, causing hard-to-track errors. The Tcl command proc itself doesn’t complain if it is called with an existing name. Here is one way to add this functionality. Early in your code, you overload the proc command like this:

 rename proc _proc
 _proc proc {name args body} {
 	set ns [uplevel namespace current]
 	if {[info commands $name]!="" || [info commands ${ns}::$name]!=""} {
 		puts stderr "warning: [info script] redefines $name in $ns"
 	}
 	uplevel [list _proc $name $args $body]
 }

From the time that is sourced, any attempt to override a proc name will be reported to stderr (on Win-wish, it would show on the console in red). You may make it really strict by adding an «exit» after the «puts stderr …», or throw an error.

Known feature: proc names with wildcards will run into this trap, e.g.

  proc * args {expr [join $args *]*1}

will always lead to a complaint because «*» fits any proc name. Fix (some regsub magic on ‘name’) left as an exercise.

Windows wish console[edit | edit source]

While on Unixes, the standard channels stdin, stdout, and stderr are the same as the terminal you started wish from, a Windows wish doesn’t typically have these standard channels (and is mostly started with double-click anyway). To help this, a console was added that takes over the standard channels (stderr even coming in red, stdin in blue). The console is normally hidden, but can be brought up with the command

 console show

You can also use the partially documented «console» command. «console eval <script>» evals the given script in the Tcl interpreter that manages the console. The console’s text area is actually a text widget created in this interpreter. For example:

       console eval {.console config -font Times}

will change the font of the console to «Times». Since the console is a Tk text widget, you can use all text widget commands and options on it (for example, changing colors, bindings…).

console eval {winfo children .}

tells you more about the console widget: it is a toplevel with children .menu, .console (text), and .sb (scrollbar). You can resize the whole thing with

console eval {wm geometry . $Wx$H+$X+$Y}

where $W and $H are dimensions in character cells (default 80×24), but $X and $Y are in pixels.

And more again: you can even add widgets to the console — try

console eval {pack [button .b -text hello -command {puts hello}]}

The button appears between the text widget and the scroll bar, and looks and does as expected.
There is also a way back: the main interpreter is visible in the console interpreter under the name, consoleinterp.

Remote debugging[edit | edit source]

Here’s a simple experiment on how to connect two Tcl processes so that one (call it «debugger») can inspect and control the other («debuggee»). Both must have an event loop running (which is true when Tk runs, or when started with e.g. vwait forever).

As this goes over a socket connection, the two processes could be on different hosts and operating systems (though I’ve so far tested only the localhost variety). Use at your own risk, of course… :^)

The «debuggee» contains in my experiments the following code, in addition to its own:

proc remo_server {{port 3456}} {
   set sock [socket -server remo_accept $port]
}
proc remo_accept {socket adr port} {
   fileevent $socket readable [list remo_go $socket]
}
proc remo_go {sock} {
   gets $sock line
   catch {uplevel #0 $line} res
   puts $sock $res
   if [catch {flush $sock}] {close $sock}
}
remo_server

The «debugger» in this version (remo.tcl) runs only on Windows in a wish, as it needs a console, but you could modify it to avoid these restrictions:

#!/usr/bin/env wish
console show
wm withdraw .
set remo [socket localhost 3456]
fileevent $remo readable "puts [gets $remo]"
proc r args {puts $::remo [join $args]; flush $::remo}
puts "remote connection ready - use r to talk"

Now from remo you can call any Tcl command in the «debuggee», where it is executed in global scope, so in particular you can inspect (and modify) global variables. But you could also redefine procs on the fly, or whatever tickles your fancy… Examples from a remo session, showing that the two have different pids, how errors are reported, and that quoting is different from normal (needs more work):

10 % pid
600
11 % r pid
2556
12 % r wm title . "Under remote control"
wrong # args: should be "wm title window ?newTitle?"
13 % r wm title . {"Under remote control"}
Tcl - error Handlimg

Error handling in Tcl is provided with the help of error handling and catch commands in Tcl. The syntax for each of these commands is shown below.

Error syntax

In the above error command syntax, message is the error message, info is set in the global variable errorInfo and code is set in the global variable errorCode.

Catch Syntax

catch script resultVarName

In the above catch command syntax, script is the code to be executed, resultVarName is variable that holds the error or the result. The catch command returns 0 if there is no error, and 1 if there is an error.

An example for simple error handling is shown below −

#!/usr/bin/tclsh

proc Div {a b} {
   if {$b == 0} {
      error "Error generated by error" "Info String for error" 401
   } else {
      return [expr $a/$b]
   }
}

if {[catch {puts "Result = [Div 10 0]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:n$errorInfon"
}

if {[catch {puts "Result = [Div 10 2]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:n$errorInfon"
}

When the above code is executed, it produces the following result −

ErrorMsg: Error generated by error
ErrorCode: 401
ErrorInfo:
Info String for error
   (procedure "Div" line 1)
   invoked from within
"Div 10 0"

Result = 5

As you can see in the above example, we can create our own custom error messages. Similarly, it is possible to catch the error generated by Tcl. An example is shown below −

#!/usr/bin/tclsh

catch {set file [open myNonexistingfile.txt]} result
puts "ErrorMsg: $result"
puts "ErrorCode: $errorCode"
puts "ErrorInfo:n$errorInfon"

When the above code is executed, it produces the following result −

ErrorMsg: couldn't open "myNonexistingfile.txt": no such file or directory
ErrorCode: POSIX ENOENT {no such file or directory}
ErrorInfo:
couldn't open "myNonexistingfile.txt": no such file or directory
   while executing
"open myNonexistingfile.txt"

Next Topic : Click Here

Tcl – Обзор

Tcl – это сокращенная форма Tool Command Language . Джон Оустерхаут из Калифорнийского университета в Беркли разработал его. Это комбинация языка сценариев и его собственного интерпретатора, который внедряется в приложение, которое мы разрабатываем вместе с ним.

Tcl был разработан изначально для Unix. Затем он был портирован на Windows, DOS, OS / 2 и Mac OSX. Tcl очень похож на другие языки оболочки Unix, такие как Bourne Shell (Sh), C Shell (csh), Korn Shell (sh) и Perl.

Он направлен на предоставление возможности программам взаимодействовать с другими программами, а также выступать в качестве встраиваемого переводчика. Несмотря на то, что первоначальной целью было дать возможность программам взаимодействовать, вы можете найти полноценные приложения, написанные на Tcl / Tk.

Особенности Tcl

Особенности Tcl заключаются в следующем –

  • Сокращение времени разработки.

  • Мощный и простой пользовательский интерфейс с интеграцией TK.

  • Пиши один раз, беги куда угодно. Он работает на Windows, Mac OS X и почти на любой платформе Unix.

  • Довольно просто начать работу для опытных программистов; язык настолько прост, что они могут выучить Tcl за несколько часов или дней.

  • Вы можете легко расширить существующие приложения с Tcl. Кроме того, можно включить Tcl в C, C ++ или Java в Tcl или наоборот.

  • Имейте мощный набор сетевых функций.

  • Наконец, это открытый исходный код, бесплатный и может быть использован для коммерческих приложений без каких-либо ограничений.

Сокращение времени разработки.

Мощный и простой пользовательский интерфейс с интеграцией TK.

Пиши один раз, беги куда угодно. Он работает на Windows, Mac OS X и почти на любой платформе Unix.

Довольно просто начать работу для опытных программистов; язык настолько прост, что они могут выучить Tcl за несколько часов или дней.

Вы можете легко расширить существующие приложения с Tcl. Кроме того, можно включить Tcl в C, C ++ или Java в Tcl или наоборот.

Имейте мощный набор сетевых функций.

Наконец, это открытый исходный код, бесплатный и может быть использован для коммерческих приложений без каких-либо ограничений.

Приложения

Tcl – это язык общего назначения, и вы можете найти Tcl везде. Это включает,

  • Масштабируемые сайты, которые часто поддерживаются базами данных.
  • Высокопроизводительные веб-серверы создаются с помощью TclHttpd.
  • Tcl с CGI-сайтами.
  • Настольные приложения с графическим интерфейсом.
  • Встроенные приложения.

Tcl – настройка среды

Настройка локальной среды

Если вы хотите настроить свою среду для Tcl, вам потребуются следующие два программных приложения, доступные на вашем компьютере:

  • Текстовый редактор
  • Tcl переводчик.

Текстовый редактор

Это будет использоваться для ввода вашей программы. Примерами нескольких текстовых редакторов являются Блокнот Windows, команда «Редактирование ОС», Brief, Epsilon, EMACS и vim или vi.

Имя и версия текстового редактора могут различаться в разных операционных системах. Например, Блокнот будет использоваться в Windows, а vim или vi могут использоваться в Windows, а также в Linux или UNIX.

Файлы, которые вы создаете в текстовом редакторе, называются исходными файлами и содержат исходный код программы. Исходные файлы для программ Tcl названы с расширением “.tcl” .

Прежде чем приступить к программированию, убедитесь, что у вас есть один текстовый редактор, и у вас достаточно опыта, чтобы написать компьютерную программу, сохранить ее в файле, собрать ее и, наконец, выполнить.

Переводчик Tcl

Это небольшая программа, которая позволяет вам вводить команды Tcl и выполнять их построчно. Он останавливает выполнение файла tcl, в случае, если он сталкивается с ошибкой в ​​отличие от компилятора, который выполняется полностью.

Давайте создадим файл helloWorld.tcl следующим образом. Мы будем использовать это как первую программу, работающую на платформе, которую вы выберете.

#!/usr/bin/tclsh

puts "Hello World!" 

Установка на Windows

Загрузите последнюю версию для установщика Windows из списка доступных двоичных файлов Active Tcl. Активная версия сообщества Tcl бесплатна для личного использования.

Запустите загруженный исполняемый файл для установки Tcl, что можно сделать, следуя инструкциям на экране.

Теперь мы можем создать и запустить файл Tcl, скажем helloWorld.tcl, переключившись на папку, содержащую файл, с помощью команды ‘cd’, а затем выполнить программу, выполнив следующие шаги

C:Tcl> tclsh helloWorld.tcl

Мы можем увидеть следующий вывод.

C:Tcl> helloWorld

C: Tcl – папка, которую я использую для сохранения своих образцов. Вы можете изменить его на папку, в которой вы сохранили программы Tcl.

Установка в Linux

Большинство операционных систем Linux поставляются со встроенным Tcl, и вы можете сразу же начать работу с этими системами. В случае, если он недоступен, вы можете использовать следующую команду для загрузки и установки Tcl-Tk.

$ yum install tcl tk

Теперь мы можем создать и запустить файл Tcl, скажем helloWorld.tcl, переключившись на папку, содержащую этот файл, с помощью команды «cd», а затем выполнить программу, выполнив следующие шаги:

$ tclsh helloWorld.tcl

Мы можем увидеть следующий вывод –

$ hello world

Установка в системах на основе Debian

В случае, если это не доступно в вашей ОС, вы можете использовать следующую команду для загрузки и установки Tcl-Tk –

$ sudo apt-get install tcl tk

Теперь мы можем создать и запустить файл Tcl, скажем helloWorld.tcl, переключившись на папку, содержащую этот файл, с помощью команды «cd», а затем выполнить программу, выполнив следующие шаги:

$ tclsh helloWorld.tcl

Мы можем увидеть следующий вывод –

$ hello world

Установка в Mac OS X

Загрузите последнюю версию пакета Mac OS X из списка доступных двоичных файлов Active Tcl. Активная версия сообщества Tcl бесплатна для личного использования.

Запустите загруженный исполняемый файл, чтобы установить Active Tcl, что можно сделать, следуя инструкциям на экране.

Теперь мы можем создать и запустить файл Tcl, скажем helloWorld.tcl, переключившись на папку, содержащую файл, используя «cd», а затем выполнить программу, выполнив следующие шаги:

$ tclsh helloWorld.tcl

Мы можем увидеть следующий вывод –

$ hello world

Установка из исходных файлов

Вы можете использовать опцию установки из исходных файлов, когда двоичный пакет недоступен. Обычно предпочтительно использовать двоичные файлы Tcl для Windows и Mac OS X, поэтому ниже показана только компиляция исходных текстов в системе на основе Unix.

  • Загрузите исходные файлы.

  • Теперь используйте следующие команды для извлечения, компиляции и сборки после переключения в загруженную папку.

Загрузите исходные файлы.

Теперь используйте следующие команды для извлечения, компиляции и сборки после переключения в загруженную папку.

$ tar zxf tcl8.6.1-src.tar.gz
$ cd tcl8.6.1
$ cd unix
$ ./configure —prefix=/opt —enable-gcc
$ make
$ sudo make install

Примечание. Убедитесь, что вы изменили имя файла на версию, загруженную по командам 1 и 2, указанным выше.

Tcl – специальные переменные

В Tcl мы классифицируем некоторые переменные как специальные переменные, и они имеют предопределенное использование / функциональность. Список специальных переменных приведен ниже.

Sr.No. Специальная переменная и описание
1

ARGC

Относится к ряду аргументов командной строки.

2

ARGV

Относится к списку, содержащему аргументы командной строки.

3

argv0

Относится к имени файла интерпретируемого файла или имени, под которым мы вызываем скрипт.

4

окр

Используется для представления массива элементов, которые являются переменными среды.

5

код ошибки

Предоставляет код ошибки для последней ошибки Tcl.

6

errorInfo

Предоставляет трассировку стека для последней ошибки Tcl.

7

tcl_interactive

Используется для переключения между интерактивным и неинтерактивным режимами, устанавливая это в 1 и 0 соответственно.

8

tcl_library

Используется для настройки расположения стандартных библиотек Tcl.

9

tcl_pkgPath

Предоставляет список каталогов, в которых обычно установлены пакеты.

10

tcl_patchLevel

Относится к текущему уровню исправления интерпретатора Tcl.

11

tcl_platform

Используется для представления массива элементов с объектами, включая byteOrder, machine, osVersion, platform и os.

12

tcl_precision

Относится к точности, т. Е. К числу цифр, сохраняемых при преобразовании чисел с плавающей запятой в строки. Значение по умолчанию 12.

13

tcl_prompt1

Относится к первичной подсказке.

14

tcl_prompt2

Относится к дополнительному приглашению с недопустимыми командами.

15

tcl_rcFileName

Предоставляет пользовательский файл запуска.

16

tcl_traceCompile

Используется для контроля трассировки компиляции байт-кода. Используйте 0 для отсутствия вывода, 1 для сводки и 2 для подробности.

17

tcl_traceExec

Используется для контроля отслеживания выполнения байт-кода. Используйте 0 для отсутствия вывода, 1 для сводки и 2 для подробности.

18

tcl_version

Возвращает текущую версию интерпретатора Tcl.

ARGC

Относится к ряду аргументов командной строки.

ARGV

Относится к списку, содержащему аргументы командной строки.

argv0

Относится к имени файла интерпретируемого файла или имени, под которым мы вызываем скрипт.

окр

Используется для представления массива элементов, которые являются переменными среды.

код ошибки

Предоставляет код ошибки для последней ошибки Tcl.

errorInfo

Предоставляет трассировку стека для последней ошибки Tcl.

tcl_interactive

Используется для переключения между интерактивным и неинтерактивным режимами, устанавливая это в 1 и 0 соответственно.

tcl_library

Используется для настройки расположения стандартных библиотек Tcl.

tcl_pkgPath

Предоставляет список каталогов, в которых обычно установлены пакеты.

tcl_patchLevel

Относится к текущему уровню исправления интерпретатора Tcl.

tcl_platform

Используется для представления массива элементов с объектами, включая byteOrder, machine, osVersion, platform и os.

tcl_precision

Относится к точности, т. Е. К числу цифр, сохраняемых при преобразовании чисел с плавающей запятой в строки. Значение по умолчанию 12.

tcl_prompt1

Относится к первичной подсказке.

tcl_prompt2

Относится к дополнительному приглашению с недопустимыми командами.

tcl_rcFileName

Предоставляет пользовательский файл запуска.

tcl_traceCompile

Используется для контроля трассировки компиляции байт-кода. Используйте 0 для отсутствия вывода, 1 для сводки и 2 для подробности.

tcl_traceExec

Используется для контроля отслеживания выполнения байт-кода. Используйте 0 для отсутствия вывода, 1 для сводки и 2 для подробности.

tcl_version

Возвращает текущую версию интерпретатора Tcl.

Указанные выше специальные переменные имеют свои особые значения для интерпретатора Tcl.

Примеры использования специальных переменных Tcl

Давайте посмотрим несколько примеров для специальных переменных.

Версия Tcl

Live Demo

#!/usr/bin/tclsh

puts $tcl_version

Когда вы запустите программу, вы получите похожий вывод, как показано ниже –

8.6

Tcl Environment Path

Live Demo

#!/usr/bin/tclsh

puts $env(PATH)

Когда вы запустите программу, вы получите похожий вывод, как показано ниже –

/home/cg/root/GNUstep/Tools:/usr/GNUstep/Local/Tools:/usr/GNUstep/
System/Tools:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/webmaster/.local/bin:/
home/webmaster/bin:/usr/local/scriba/bin:/usr/local/smlnj/
bin:/usr/local/bin/std:/usr/local/bin/extra:/usr/local/fantom/bin:/usr/
local/dart/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/opt/mono/
bin:/opt/mono/lib/mono/4.5:/usr/local/bin:.:/usr/libexec/sdcc:/usr/local/
icon-v950/bin:/usr/local/mozart/bin:/opt/Pawn/bin:/opt/jdk1.7.0_75/bin:/
opt/jdk1.7.0_75/jre/bin:/opt/pash/Source/PashConsole/bin/Debug/

Путь к пакету Tcl

Live Demo

#!/usr/bin/tclsh

puts $tcl_pkgPath

Когда вы запустите программу, вы получите похожий вывод, как показано ниже –

/usr/lib64/tcl8.6 /usr/share/tcl8.6 /usr/lib64/tk8.6 /usr/share/tk8.6

Библиотека Tcl

Live Demo

#!/usr/bin/tclsh

puts $tcl_library

Когда вы запустите программу, вы получите похожий вывод, как показано ниже –

/usr/share/tcl8.6

Уровень Tcl Patch

Live Demo

#!/usr/bin/tclsh

puts $tcl_patchLevel

Когда вы запустите программу, вы получите похожий вывод, как показано ниже –

8.6.6

Tcl Precision

Live Demo

#!/usr/bin/tclsh

puts $tcl_precision

Когда вы запустите программу, вы получите похожий вывод, как показано ниже –

0

Tcl Startup File

Live Demo

#!/usr/bin/tclsh

puts $tcl_rcFileName

Когда вы запустите программу, вы получите похожий вывод, как показано ниже –

~/.tclshrc

Tcl – основной синтаксис

Tcl довольно прост в освоении, и давайте начнем создавать нашу первую программу Tcl!

Первая программа Tcl

Давайте напишем простую программу Tcl. Все файлы Tcl будут иметь расширение, т.е. .tcl. Итак, поместите следующий исходный код в файл test.tcl.

Live Demo

#!/usr/bin/tclsh

puts "Hello, World!" 

Предполагая, что среда Tcl настроена правильно; давайте запустим программу после переключения в каталог файла и затем запустим программу, используя –

$ tclsh test.tcl

Мы получим следующий вывод –

Hello, World!

Давайте теперь посмотрим на базовую структуру программы Tcl, так что вам будет легко понять основные строительные блоки языка Tcl. В Tcl мы используем новую строку или точку с запятой для завершения предыдущей строки кода. Но точка с запятой не обязательна, если вы используете новую строку для каждой команды.

Комментарии

Комментарии подобны тексту помощи в вашей программе Tcl, и интерпретатор их игнорирует. Комментарии могут быть написаны с использованием знака хэш _ (#) в начале.

Live Demo

#!/usr/bin/tclsh

# my first program in Tcl
puts "Hello World!" 

Когда приведенный выше код выполняется, он дает следующий результат –

Hello World!

Многострочный или блочный комментарий пишется с использованием ‘if’ с условием ‘0’. Пример показан ниже.

Live Demo

#!/usr/bin/tclsh

if 0 {
   my first program in Tcl program
   Its very simple
}
puts "Hello World!" 

Когда приведенный выше код выполняется, он дает следующий результат –

Hello World!

Использование встроенных комментариев; Пример приведен ниже.

Live Demo

#!/usr/bin/tclsh

puts "Hello World!" ;# my first print in Tcl program

Когда приведенный выше код выполняется, он дает следующий результат –

Hello World!

Идентификаторы

Идентификатор Tcl – это имя, используемое для идентификации переменной, функции или любого другого пользовательского элемента. Идентификатор начинается с буквы от A до Z или от a до z или подчеркивания (_), за которым следуют ноль или более букв, подчеркивания, доллары ($) и цифры (от 0 до 9).

Tcl не допускает использование знаков препинания, таких как @ и% в идентификаторах. Tcl является регистрозависимым _ языком. Таким образом, рабочая сила и рабочая сила – два разных идентификатора в Tcl. Вот несколько примеров допустимых идентификаторов:

mohd       zara    abc   move_name  a_123
myname50   _temp   j     a23b9      retVal

Зарезервированные слова

Следующий список показывает несколько зарезервированных слов в Tcl. Эти зарезервированные слова не могут использоваться как константы или переменные или любые другие имена идентификаторов.

после присоединять массив auto_execok
auto_import auto_load auto_load_index auto_qualify
двоичный Bgerror перерыв ловить
CD Часы близко CONCAT
Продолжить Dde дефолт еще
ElseIf кодирование ВФ ошибка
Eval Exec выход выраж
fblocked Fconfigure F КОПИРОВАТЬ файл
fileevent Промывать за для каждого
формат Получает шарик Глобальный
история Если Информация интерп
присоединиться Lappend LINDEX шланга вставьте
список Llength нагрузка lrange
lreplace Lsearch lsort Пространство имен
открыть пакет ПИД-регулятор pkg_mkIndex
процедура Оферты PWD читать
регулярное выражение Regsub переименовать ресурс
вернуть сканирование искать задавать
разъем Источник Трещина строка
Подст переключатель tclLog сказать
время след неизвестный снята с охраны
Обновить Верхний уровень upvar переменная
VWait В то время как

Пробелы в Tcl

Строка, содержащая только пробел, возможно, с комментарием, называется пустой строкой , и интерпретатор Tcl полностью игнорирует ее.

Пробел – это термин, используемый в Tcl для описания пробелов, вкладок, символов новой строки и комментариев. Пробелы отделяют одну часть оператора от другой и позволяют интерпретатору определить, где один элемент в утверждении, например, ставит, заканчивается и начинается следующий элемент. Поэтому в следующем утверждении –

#!/usr/bin/tclsh

puts "Hello World!" 

Должен быть как минимум один символ пробела (обычно пробел) между «путями» и «Hello World!» чтобы переводчик мог их различить. С другой стороны, в следующем утверждении –

Live Demo

#!/usr/bin/tclsh

puts [expr 3 + 2] ;# print sum of the 3 and 2

Когда приведенный выше код выполняется, он дает следующий результат –

5

Никакие пробельные символы не нужны между 3 и + или между + и 2; Тем не менее, вы можете включить некоторые из них, если вы хотите для удобства чтения.

Tcl – Команды

Как вы знаете, Tcl – это язык команд Tool, команды являются наиболее важной частью языка. Команды Tcl встроены в язык, каждая из которых имеет свою предопределенную функцию. Эти команды формируют зарезервированные слова языка и не могут использоваться для именования других переменных. Преимущество этих команд Tcl заключается в том, что вы можете определить собственную реализацию для любой из этих команд, чтобы заменить оригинальные встроенные функции.

Каждая из команд Tcl проверяет ввод, и это уменьшает работу интерпретатора.

Команда Tcl на самом деле представляет собой список слов, причем первое слово представляет команду для выполнения. Следующие слова представляют аргументы. Чтобы сгруппировать слова в один аргумент, мы заключаем несколько слов с помощью «» или {}.

Синтаксис команды Tcl следующий:

commandName argument1 argument2 ... argumentN

Давайте посмотрим на простой пример команды Tcl –

Live Demo

#!/usr/bin/tclsh

puts "Hello, world!"

Когда приведенный выше код выполняется, он дает следующий результат –

Hello, world!

В приведенном выше коде «put» – это команда Tcl, а «Hello World» – это аргумент1. Как было сказано ранее, мы использовали «» для группировки двух слов.

Давайте посмотрим еще один пример команды Tcl с двумя аргументами –

Live Demo

#!/usr/bin/tclsh

puts stdout "Hello, world!"

Когда приведенный выше код выполняется, он дает следующий результат –

Hello, world!

В вышеприведенном коде «put» – это команда Tcl, «stdout» – это аргумент1, а «Hello World» – аргумент2. Здесь stdout заставляет программу печатать на стандартном устройстве вывода.

Подстановка команд

В подстановках команд квадратные скобки используются для оценки сценариев внутри квадратных скобок. Простой пример добавления двух чисел показан ниже –

Live Demo

#!/usr/bin/tclsh

puts [expr 1 + 6 + 9]

Когда приведенный выше код выполняется, он дает следующий результат –

16

Подстановка переменных

В подстановках переменных $ используется перед именем переменной, и это возвращает содержимое переменной. Простой пример установки значения переменной и его вывода показан ниже.

Live Demo

#!/usr/bin/tclsh

set a 3
puts $a

Когда приведенный выше код выполняется, он дает следующий результат –

3

Замена обратной косой черты

Они обычно называются escape-последовательностями ; с каждой обратной косой чертой, за которой следует буква, имеющая свое значение. Простой пример замены новой строки показан ниже –

Live Demo

#!/usr/bin/tclsh

puts "HellonWorld"

Когда приведенный выше код выполняется, он дает следующий результат –

Hello
World

Tcl – типы данных

Примитивный тип данных Tcl – строка, и часто мы можем найти кавычки на Tcl как язык только для строк. Эти примитивные типы данных, в свою очередь, создают составные типы данных для списка и ассоциативного массива. В Tcl типы данных могут представлять не только простые объекты Tcl, но также могут представлять сложные объекты, такие как дескрипторы, графические объекты (в основном, виджеты) и каналы ввода-вывода. Давайте посмотрим на детали о каждом из вышеперечисленных.

Простые объекты Tcl

В Tcl, будь то целое число, логическое число, число с плавающей запятой или строка. Когда вы хотите использовать переменную, вы можете напрямую присвоить ей значение, в Tcl нет шага объявления. Могут быть внутренние представления для этих различных типов объектов. При необходимости он может преобразовывать один тип данных в другой. Синтаксис для присвоения значения переменной следующий:

Live Demo

#!/usr/bin/tclsh

set myVariable 18
puts $myVariable

Когда приведенный выше код выполняется, он дает следующий результат –

18

Приведенный выше оператор создаст имя переменной myVariable и сохранит ее в виде строки, хотя мы не использовали двойные кавычки. Теперь, если мы попытаемся сделать арифметику для переменной, она автоматически превращается в целое число. Простой пример показан ниже –

Live Demo

#!/usr/bin/tclsh

set myVariable 18
puts [expr $myVariable + 6 + 9]

Когда приведенный выше код выполняется, он дает следующий результат –

33

Важно отметить, что эти переменные не имеют никаких значений по умолчанию и должны быть назначены значения перед их использованием.

Если мы пытаемся печатать путями, число преобразуется в правильную строку. Наличие двух представлений, внутреннего и внешнего, помогает Tcl легко создавать сложные структуры данных по сравнению с другими языками. Кроме того, Tcl более эффективен благодаря своей динамической объектной природе.

Строковые представления

В отличие от других языков, в Tcl вам не нужно включать двойные кавычки, когда это всего лишь одно слово. Примером может быть –

Live Demo

#!/usr/bin/tclsh

set myVariable hello
puts $myVariable

Когда приведенный выше код выполняется, он дает следующий результат –

hello

Когда мы хотим представить несколько строк, мы можем использовать либо двойные кавычки, либо фигурные скобки. Это показано ниже –

Live Demo

#!/usr/bin/tclsh

set myVariable "hello world"
puts $myVariable
set myVariable {hello world}
puts $myVariable

Когда приведенный выше код выполняется, он дает следующий результат –

hello world
hello world

Список

Список – это не что иное, как группа элементов. Группа слов, использующая двойные кавычки или фигурные скобки, может использоваться для представления простого списка. Простой список показан ниже –

Live Demo

#!/usr/bin/tclsh

set myVariable {red green blue}
puts [lindex $myVariable 2]
set myVariable "red green blue"
puts [lindex $myVariable 1]

Когда приведенный выше код выполняется, он дает следующий результат –

blue
green

Ассоциативный массив

Ассоциативные массивы имеют индекс (ключ), который не обязательно является целым числом. Обычно это строка, которая действует как пары ключ-значение. Простой пример показан ниже –

Live Demo

#!/usr/bin/tclsh

set  marks(english) 80
puts $marks(english)
set  marks(mathematics) 90
puts $marks(mathematics)

Когда приведенный выше код выполняется, он дает следующий результат –

80
90

рукоятки

Дескрипторы Tcl обычно используются для представления файлов и графических объектов. Они могут включать дескрипторы сетевых запросов, а также другие каналы, такие как последовательный порт, сокеты или устройства ввода-вывода. Ниже приведен пример, где создается дескриптор файла.

set myfile [open "filename" r]

Подробнее о файлах вы узнаете в главе « Ввод / вывод файла Tcl» .

Tcl – переменные

В Tcl нет концепции объявления переменных. Как только новое имя переменной встретится, Tcl определит новую переменную.

Именование переменных

Имя переменных может содержать любые символы и длину. Вы даже можете иметь пробелы, заключив переменную в фигурные скобки, но это не является предпочтительным.

Команда set используется для присвоения значения переменной. Синтаксис для команды set:

set variableName value

Несколько примеров переменных показаны ниже –

Live Demo

#!/usr/bin/tclsh

set variableA 10
set {variable B} test
puts $variableA
puts ${variable B}

Когда приведенный выше код выполняется, он дает следующий результат –

10
test

Как вы можете видеть в приведенной выше программе, $ variableName используется для получения значения переменной.

Динамический набор текста

Tcl – это динамически типизированный язык. При необходимости значение переменной может быть динамически преобразовано в требуемый тип. Например, число 5, которое хранится в виде строки, будет преобразовано в число при выполнении арифметической операции. Это показано ниже –

Live Demo

#!/usr/bin/tclsh

set variableA "10"
puts $variableA
set sum [expr $variableA +20];
puts $sum

Когда приведенный выше код выполняется, он дает следующий результат –

10
30

Математические выражения

Как вы можете видеть в приведенном выше примере, expr используется для представления математического выражения. Точность по умолчанию Tcl составляет 12 цифр. Чтобы получить результаты с плавающей запятой, мы должны добавить хотя бы одну десятичную цифру. Простой пример объясняет вышеизложенное.

Live Demo

#!/usr/bin/tclsh

set variableA "10"
set result [expr $variableA / 9];
puts $result
set result [expr $variableA / 9.0];
puts $result
set variableA "10.0"
set result [expr $variableA / 9];
puts $result

Когда приведенный выше код выполняется, он дает следующий результат –

1
1.1111111111111112
1.1111111111111112

В приведенном выше примере вы можете увидеть три случая. В первом случае, дивиденд и делитель являются целыми числами, и мы получаем целое число в результате. Во втором случае один только делитель является десятичным числом, а в третьем случае дивидендом является десятичное число. И во втором, и в третьем случаях мы получаем десятичное число в качестве результата.

В приведенном выше коде вы можете изменить точность, используя специальную переменную tcl_precision. Это показано ниже –

Live Demo

#!/usr/bin/tclsh

set variableA "10"
set tcl_precision 5
set result [expr $variableA / 9.0];
puts $result

Когда приведенный выше код выполняется, он дает следующий результат –

1.1111

Tcl – Операторы

Оператор – это символ, который указывает компилятору выполнять определенные математические или логические манипуляции. Язык Tcl богат встроенными операторами и предоставляет следующие типы операторов:

  • Арифметические Операторы
  • Операторы отношений
  • Логические Операторы
  • Битовые операторы
  • Троичный оператор

Типы операторов

В этой главе один за другим будут объяснены арифметические, реляционные, логические, побитовые и троичные операторы.

Арифметические Операторы

В следующей таблице приведены все арифметические операторы, поддерживаемые языком Tcl. Предположим, что переменная «A» содержит 10, а переменная «B» содержит 20, тогда –

Показать примеры

оператор Описание пример
+ Добавляет два операнда А + Б даст 30
Вычитает второй операнд из первого A – B даст -10
* Умножает оба операнда А * Б даст 200
/ Делит числитель на числитель Б / у даст 2
% Оператор модуля и остаток от целочисленного деления B% A даст 0

Операторы отношений

В следующей таблице показаны все реляционные операторы, поддерживаемые языком Tcl. Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда –

Показать примеры

оператор Описание пример
== Проверяет, равны ли значения двух операндов или нет, если да, тогда условие становится истинным. (A == B) не соответствует действительности.
знак равно Проверяет, равны ли значения двух операндов или нет, если значения не равны, тогда условие становится истинным. (A! = B) верно.
> Проверяет, больше ли значение левого операнда, чем значение правого операнда, если да, тогда условие становится истинным. (A> B) не соответствует действительности.
< Проверяет, меньше ли значение левого операнда, чем значение правого операнда, если да, тогда условие становится истинным. (A <B) верно.
> = Проверяет, больше ли значение левого операнда или равно значению правого операнда, если да, тогда условие становится истинным. (A> = B) не соответствует действительности.
<= Проверяет, меньше ли значение левого операнда или равно значению правого операнда, если да, тогда условие становится истинным. (A <= B) верно.

Логические Операторы

В следующей таблице приведены все логические операторы, поддерживаемые языком Tcl. Предположим, что переменная A содержит 1, а переменная B содержит 0, тогда –

Показать примеры

оператор Описание пример
&& Называется логический оператор И. Если оба операнда отличны от нуля, условие становится истинным. (A && B) неверно.
|| Вызывается логическим оператором ИЛИ. Если любой из двух операндов отличен от нуля, условие становится истинным. (A || B) верно.
! Вызывается логическим оператором НЕ. Используйте для изменения логического состояния своего операнда. Если условие истинно, то оператор Логический НЕ будет делать ложь. ! (A && B) верно.

Битовые операторы

Побитовый оператор работает с битами и выполняет побитовую операцию. Таблицы истинности для &, | и ^ следующие:

п Q P & Q р | Q р ^ д
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

Предположим, если А = 60; и B = 13; теперь в двоичном формате они будут выглядеть следующим образом –

A = 0011 1100

B = 0000 1101

———————-

A & B = 0000 1100

A | B = 0011 1101

A ^ B = 0011 0001

Побитовые операторы, поддерживаемые языком Tcl, перечислены в следующей таблице. Предположим, что переменная A содержит 60, а переменная B содержит 13, тогда –

Показать примеры

оператор Описание пример
& Двоичный оператор AND немного копирует результат, если он существует в обоих операндах. (A & B) даст 12, что составляет 0000 1100
| Оператор двоичного ИЛИ копирует немного, если он существует в любом из операндов. (A | B) даст 61, что составляет 0011 1101
^ Двоичный оператор XOR копирует бит, если он установлен в одном операнде, но не в обоих. (A ^ B) даст 49, что составляет 0011 0001
<< Двоичный оператор левого сдвига. Значение левого операнда перемещается влево на количество битов, указанное правым операндом. А << 2 даст 240, что составляет 1111 0000
>> Оператор двоичного правого сдвига. Значение левого операнда перемещается вправо на количество битов, указанное правым операндом. A >> 2 даст 15, что составляет 0000 1111

Троичный оператор

Показать примеры

оператор Описание пример
? : троичный Если условие верно? Тогда значение X: в противном случае значение Y

Приоритет операторов в Tcl

Приоритет оператора определяет группировку терминов в выражении. Это влияет на то, как оценивается выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения.

Например : х = 7 + 3 * 2; здесь x назначено 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала умножается на 3 * 2, а затем прибавляется к 7.

Здесь операторы с самым высоким приоритетом отображаются вверху таблицы, а операторы с самым низким – внизу. Внутри выражения операторы с более высоким приоритетом будут оцениваться первыми.

Показать примеры

категория оператор Ассоциативность
Одинарный + – Справа налево
Multiplicative * /% Слева направо
присадка + – Слева направо
сдвиг << >> Слева направо
реляционный <<=>> = Слева направо
Побитовое И & Слева направо
Побитовый XOR ^ Слева направо
Побитовое ИЛИ | Слева направо
Логическое И && Слева направо
Логическое ИЛИ || Слева направо
троичный ?: Справа налево

Tcl – Решения

Структуры принятия решений требуют, чтобы программист определял одно или несколько условий, которые должны быть оценены или протестированы программой, вместе с оператором или инструкциями, которые должны быть выполнены, если условие определено как истинное, и, необязательно, другие операторы, которые должны быть выполнены, если условие определяется как ложный.

Ниже приводится общая форма типичной структуры принятия решений, встречающейся в большинстве языков программирования.

Принятие решения

Язык Tcl использует команду expr для внутреннего использования, поэтому мы не обязаны явно использовать выражение expr.

Язык Tcl предоставляет следующие типы заявлений о принятии решений –

Sr.No. Заявление и описание
1 если заявление

Оператор ‘if’ состоит из логического выражения, за которым следует одно или несколько операторов.

2 если … еще заявление

За оператором if может следовать необязательный оператор else, который выполняется, когда логическое выражение имеет значение false.

3 вложенные операторы if

Вы можете использовать один оператор «if» или «else if» внутри другого оператора «if» или «else if».

4 заявление о переключении

Оператор switch позволяет проверять переменную на соответствие списку значений.

5 вложенные операторы switch

Вы можете использовать один оператор switch внутри другого оператора (ов) switch .

Оператор ‘if’ состоит из логического выражения, за которым следует одно или несколько операторов.

За оператором if может следовать необязательный оператор else, который выполняется, когда логическое выражение имеет значение false.

Вы можете использовать один оператор «if» или «else if» внутри другого оператора «if» или «else if».

Оператор switch позволяет проверять переменную на соответствие списку значений.

Вы можете использовать один оператор switch внутри другого оператора (ов) switch .

? : Оператор

Мы накрыли условного оператора? : в предыдущей главе, которая может быть использована для замены операторов if … else . Он имеет следующую общую форму –

Exp1 ? Exp2 : Exp3;

Где Exp1, Exp2 и Exp3 являются выражениями. Обратите внимание на использование и размещение толстой кишки.

Значение а? выражение ‘определяется следующим образом: Exp1 оценивается. Если это правда, тогда Exp2 вычисляется и становится значением целого ‘? Выражение «. Если Exp1 имеет значение false, то Exp3 оценивается, и его значение становится значением выражения. Пример показан ниже.

Live Demo

#!/usr/bin/tclsh

set a 10;
set b [expr $a == 1 ? 20: 30]
puts "Value of b is $bn"
set b [expr $a == 10 ? 20: 30]
puts "Value of b is $bn" 

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат –

Value of b is 30
Value of b is 20

Tcl – Петли

Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз. В общем случае операторы выполняются последовательно: первый оператор в функции выполняется первым, затем второй и так далее.

Языки программирования предоставляют различные управляющие структуры, которые допускают более сложные пути выполнения.

Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз, и в большинстве языков программирования ниже приводится общая форма инструкции цикла.

Петлевая архитектура

Язык Tcl предоставляет следующие типы циклов для обработки требований циклов.

Sr.No. Тип и описание петли
1 в то время как цикл

Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.

2 для цикла

Выполняет последовательность операторов несколько раз и сокращает код, который управляет переменной цикла.

3 вложенные циклы

Вы можете использовать один или несколько циклов внутри любого другого цикла while, for или do.. while.

Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.

Выполняет последовательность операторов несколько раз и сокращает код, который управляет переменной цикла.

Вы можете использовать один или несколько циклов внутри любого другого цикла while, for или do.. while.

Заявления о контроле цикла

Операторы управления циклом изменяют выполнение от его нормальной последовательности. Когда выполнение покидает область действия, все автоматические объекты, созданные в этой области, уничтожаются.

Tcl поддерживает следующие управляющие операторы.

Sr.No. Контрольное заявление и описание
1 заявление о нарушении

Завершает оператор цикла или переключателя и передает выполнение в оператор, следующий сразу за циклом или переключателем.

2 продолжить заявление

Заставляет петлю пропускать оставшуюся часть своего тела и немедленно проверять свое состояние перед повторением.

Завершает оператор цикла или переключателя и передает выполнение в оператор, следующий сразу за циклом или переключателем.

Заставляет петлю пропускать оставшуюся часть своего тела и немедленно проверять свое состояние перед повторением.

Бесконечный цикл

Цикл становится бесконечным, если условие никогда не становится ложным. Цикл while традиционно используется для этой цели. Вы можете сделать бесконечный цикл, оставив условное выражение равным 1.

while {1} {
   puts "This loop will run forever."
}

Когда условное выражение отсутствует, оно считается истинным. Программисты Tcl чаще используют конструкцию while {1} для обозначения бесконечного цикла.

ПРИМЕЧАНИЕ. – Вы можете завершить бесконечный цикл, нажав клавиши Ctrl + C.

Tcl – Массивы

Массив – это систематическое расположение группы элементов с использованием индексов. Синтаксис для обычного массива показан ниже.

set ArrayName(Index) value

Пример для создания простого массива показан ниже.

Live Demo

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
puts $languages(0)
puts $languages(1)

Когда приведенный выше код выполняется, он дает следующий результат –

Tcl
C Language

Размер массива

Синтаксис для вычисления размера массива показан ниже.

[array size variablename]

Пример для печати размера показан ниже.

Live Demo

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
puts  [array size languages]

Когда приведенный выше код выполняется, он дает следующий результат –

2

Итерация массива

Хотя индексы массива могут быть не непрерывными, как значения, указанные для индекса 1, затем индекса 10 и так далее. Но, если они непрерывны, мы можем использовать итерацию массива для доступа к элементам массива. Простая итерация массива для печати элементов массива показана ниже.

Live Demo

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
for { set index 0 }  { $index < [array size languages] }  { incr index } {
   puts "languages($index) : $languages($index)"
}

Когда приведенный выше код выполняется, он дает следующий результат –

languages(0) : Tcl
languages(1) : C Language

Ассоциативные массивы

В Tcl все массивы по своей природе являются ассоциативными. Массивы хранятся и извлекаются без какого-либо определенного порядка. Ассоциативные массивы имеют индекс, который не обязательно является числом и может быть малонаселенным. Простой пример для ассоциативного массива с нечисловыми индексами показан ниже.

Live Demo

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
puts  $personA(Name)
puts  $personA(Age)

Когда приведенный выше код выполняется, он дает следующий результат –

Dave
14

Индексы массива

Синтаксис для получения индексов массива показан ниже.

[array names variablename]

Пример для печати размера показан ниже.

Live Demo

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
puts [array names personA]

Когда приведенный выше код выполняется, он дает следующий результат –

Age Name

Итерация ассоциативного массива

Вы можете использовать индексы массива для итерации по ассоциативному массиву. Пример показан ниже.

Live Demo

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
foreach index [array names personA] {
   puts "personA($index): $personA($index)"
}

Когда приведенный выше код выполняется, он дает следующий результат –

personA(Age): 14
personA(Name): Dave

Tcl – Струны

Примитивный тип данных Tcl – строка, и часто мы можем найти кавычки на Tcl как язык только для строк. Эти строки могут содержать буквенно-цифровые символы, только цифры, логические или даже двоичные данные. Tcl использует 16-битные символы Unicode, а буквенно-цифровые символы могут содержать буквы, включая нелатинские символы, цифры или знаки пунктуации.

Логическое значение может быть представлено как 1, да или истина для истины и 0, нет или ложь для ложного.

Строковые представления

В отличие от других языков, в Tcl вам не нужно включать двойные кавычки, когда это всего лишь одно слово. Примером может быть –

Live Demo

#!/usr/bin/tclsh

set myVariable hello
puts $myVariable

Когда приведенный выше код выполняется, он дает следующий результат –

hello

Когда мы хотим представить несколько строк, мы можем использовать либо двойные кавычки, либо фигурные скобки. Это показано ниже –

Live Demo

#!/usr/bin/tclsh

set myVariable "hello world"
puts $myVariable
set myVariable {hello world}
puts $myVariable

Когда приведенный выше код выполняется, он дает следующий результат –

hello world
hello world

Последовательность выхода из строки

Символьный литерал может быть простым символом (например, «x»), escape-последовательностью (например, « t») или универсальным символом (например, « u02C0»).

В Tcl есть определенные символы, когда им предшествует обратная косая черта, они будут иметь особое значение и использоваться для представления, например, новой строки ( n) или табуляции ( t). Здесь у вас есть список некоторых из таких кодов escape-последовательностей –

Последовательность побега Имея в виду
\ персонаж
» ‘ персонаж
» ” персонаж
? ? персонаж
а Оповещение или звонок
б возврат на одну позицию
е Форма подачи
п Новая линия
р Возврат каретки
т Горизонтальная вкладка
v Вертикальная вкладка

Ниже приведен пример, показывающий несколько символов escape-последовательности:

Live Demo

#!/usr/bin/tclsh

puts "HellotWorldnnTutorialspoint";

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Hello   World

Tutorialspoint

Строковая команда

Список подкоманд для строковых команд приведен в следующей таблице:

Sr.No. Методы и описание
1

сравнить строку1 строку2

Сравнивает строку1 и строку2 лексографически. Возвращает 0, если равно, -1, если строка1 предшествует строке2, иначе 1.

2

первая строка1 строка2

Возвращает индекс первого появления строки1 в строке2. Если не найден, возвращает -1.

3

индексная строка

Возвращает символ по индексу.

4

последняя строка1 строка2

Возвращает индекс последнего вхождения string1 в string2. Если не найден, возвращает -1.

5

длина строки

Возвращает длину строки.

6

строка соответствия шаблона

Возвращает 1, если строка соответствует шаблону.

7

строка диапазона index1 index2

Вернуть диапазон символов в строке от index1 до index2.

8

гирлянда

Возвращает строчную строку.

9

струна тупер

Возвращает заглавную строку.

10

обрезать строку?

Удаляет триммерные символы в обоих концах строки. Триммерными символами по умолчанию является пробел.

11

триммерная строка?

Удаляет символы в левом начале строки. Триммерными символами по умолчанию является пробел.

12

аккуратная строка?

Удаляет триммерные символы в левом конце строки. Триммерными символами по умолчанию является пробел.

13

индекс поиска строки

Возвращает индекс в строке поиска символа после слова, содержащего символ в индексе.

14

поиск слов

Возвращает индекс в строке поиска первого символа в слове, содержащем символ в индексе.

сравнить строку1 строку2

Сравнивает строку1 и строку2 лексографически. Возвращает 0, если равно, -1, если строка1 предшествует строке2, иначе 1.

первая строка1 строка2

Возвращает индекс первого появления строки1 в строке2. Если не найден, возвращает -1.

индексная строка

Возвращает символ по индексу.

последняя строка1 строка2

Возвращает индекс последнего вхождения string1 в string2. Если не найден, возвращает -1.

длина строки

Возвращает длину строки.

строка соответствия шаблона

Возвращает 1, если строка соответствует шаблону.

строка диапазона index1 index2

Вернуть диапазон символов в строке от index1 до index2.

гирлянда

Возвращает строчную строку.

струна тупер

Возвращает заглавную строку.

обрезать строку?

Удаляет триммерные символы в обоих концах строки. Триммерными символами по умолчанию является пробел.

триммерная строка?

Удаляет символы в левом начале строки. Триммерными символами по умолчанию является пробел.

аккуратная строка?

Удаляет триммерные символы в левом конце строки. Триммерными символами по умолчанию является пробел.

индекс поиска строки

Возвращает индекс в строке поиска символа после слова, содержащего символ в индексе.

поиск слов

Возвращает индекс в строке поиска первого символа в слове, содержащем символ в индексе.

Примеры некоторых часто используемых подкоманд Tcl string приведены ниже.

Сравнение строк

Live Demo

#!/usr/bin/tclsh

set s1 "Hello"
set s2 "World"
set s3 "World"
puts [string compare s1 s2]
if {[string compare s2 s3] == 0} {
   puts "String 's1' and 's2' are same."; 
} 

if {[string compare s1 s2] == -1} {
   puts "String 's1' comes before 's2'.";
}

if {[string compare s2 s1] == 1} {
   puts "String 's2' comes after 's1'.";
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

-1
String 's1' comes before 's2'.
String 's2' comes after 's1'.

Индекс строки

Live Demo

#!/usr/bin/tclsh

set s1 "Hello World"
set s2 "o"
puts "First occurrence of $s2 in s1"
puts [string first $s2 $s1]
puts "Character at index 0 in s1"
puts [string index $s1 0]
puts "Last occurrence of $s2 in s1"
puts [string last $s2 $s1]
puts "Word end index in s1"
puts [string wordend $s1 20]
puts "Word start index in s1"
puts [string wordstart $s1 20]

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

First occurrence of o in s1
4
Character at index 0 in s1
H
Last occurrence of o in s1
7
Word end index in s1
11
Word start index in s1
6

Длина строки

Live Demo

#!/usr/bin/tclsh

set s1 "Hello World"
puts "Length of string s1"
puts [string length $s1]

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Length of string s1
11

Обработка дел

Live Demo

#!/usr/bin/tclsh

set s1 "Hello World"
puts "Uppercase string of s1"
puts [string toupper $s1]
puts "Lowercase string of s1"
puts [string tolower $s1]

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Uppercase string of s1
HELLO WORLD
Lowercase string of s1
hello world

Обрезка персонажей

Live Demo

#!/usr/bin/tclsh

set s1 "Hello World"
set s2 "World"
puts "Trim right $s2 in $s1"
puts [string trimright $s1 $s2]

set s2 "Hello"
puts "Trim left $s2 in $s1"
puts [string trimleft $s1 $s2]

set s1 " Hello World "
set s2 " "
puts "Trim characters s1 on both sides of s2"
puts [string trim $s1 $s2]

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Trim right World in Hello World
Hello 
Trim left Hello in Hello World
 World
Trim characters s1 on both sides of s2
Hello World

Соответствующие строки

Live Demo

#!/usr/bin/tclsh

set s1 "test@test.com" 
set s2 "*@*.com"
puts "Matching pattern s2 in s1"
puts [string match "*@*.com" $s1 ]
puts "Matching pattern tcl in s1"
puts [string match {tcl} $s1]

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Matching pattern s2 in s1
1
Matching pattern tcl in s1
0

Добавить команду

Live Demo

#!/usr/bin/tclsh

set s1 "Hello" 
append s1 " World"
puts $s1

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Hello World

Команда форматирования

В следующей таблице приведен список спецификаторов формата, доступных в Tcl.

Тендерный использование
% s Строковое представление
% d Целочисленное представление
% е Представление с плавающей точкой
% е Представление с плавающей точкой в ​​мантиссе-показательной форме
%Икс Гекса десятичное представление

Некоторые простые примеры приведены ниже –

Live Demo

#!/usr/bin/tclsh

puts [format "%f" 43.5]
puts [format "%e" 43.5]
puts [format "%d %s" 4 tuts]
puts [format "%s" "Tcl Language"]
puts [format "%x" 40]

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

43.500000
4.350000e+01
4 tuts
Tcl Language
28

Команда сканирования

Команда сканирования используется для анализа строки на основе спецификатора формата. Некоторые примеры приведены ниже.

Live Demo

#!/usr/bin/tclsh

puts [scan "90" {%[0-9]} m]
puts [scan "abc" {%[a-z]} m]
puts [scan "abc" {%[A-Z]} m]
puts [scan "ABC" {%[A-Z]} m]

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

1
1
0
1

Tcl – Списки

Список является одним из основных типов данных, доступных в Tcl. Используется для представления упорядоченной коллекции предметов. Он может включать различные типы элементов в одном списке. Кроме того, список может содержать другой список.

Важно отметить, что эти списки полностью представлены в виде строк и при необходимости обрабатываются для формирования отдельных элементов. Поэтому избегайте больших списков и в таких случаях; использовать массив.

Создание списка

Общий синтаксис для списка приведен ниже –

set listName { item1 item2 item3 .. itemn }
# or
set listName [list item1 item2 item3]
# or 
set listName [split "items separated by a character" split_character]

Некоторые примеры приведены ниже –

Live Demo

#!/usr/bin/tclsh

set colorList1 {red green blue}
set colorList2 [list red green blue]
set colorList3 [split "red_green_blue" _]
puts $colorList1
puts $colorList2
puts $colorList3

Когда приведенный выше код выполняется, он дает следующий результат –

red green blue
red green blue
red green blue

Добавление элемента в список

Синтаксис для добавления элемента в список приведен ниже –

append listName split_character value
# or
lappend listName value

Некоторые примеры приведены ниже –

Live Demo

#!/usr/bin/tclsh

set var orange
append var " " "blue"
lappend var "red" 
lappend var "green" 
puts $var

Когда приведенный выше код выполняется, он дает следующий результат –

orange blue red green

Длина списка

Синтаксис длины списка приведен ниже –

llength listName

Пример длины списка приведен ниже –

Live Demo

#!/usr/bin/tclsh

set var {orange blue red green}
puts [llength $var] 

Когда приведенный выше код выполняется, он дает следующий результат –

4

Элемент списка в указателе

Синтаксис для выбора элемента списка по определенному индексу приведен ниже –

lindex listname index

Пример для элемента списка в индексе приведен ниже –

Live Demo

#!/usr/bin/tclsh

set var {orange blue red green}
puts [lindex $var  1]

Когда приведенный выше код выполняется, он дает следующий результат –

blue

Вставить элемент в указатель

Синтаксис для вставки элементов списка по определенному индексу приведен ниже.

linsert listname index value1 value2..valuen

Пример для вставки элемента списка по определенному индексу приведен ниже.

Live Demo

#!/usr/bin/tclsh

set var {orange blue red green}
set var [linsert  $var 3 black white]
puts $var

Когда приведенный выше код выполняется, он дает следующий результат –

orange blue red black white green

Заменить предметы по индексам

Синтаксис для замены элементов списка по определенным индексам приведен ниже –

lreplace listname firstindex lastindex value1 value2..valuen

Пример замены элементов списка на конкретные индексы приведен ниже.

Live Demo

#!/usr/bin/tclsh

set var {orange blue red green}
set var [lreplace $var 2 3 black white]
puts $var

Когда приведенный выше код выполняется, он дает следующий результат –

orange blue black white

Установить элемент на индекс

Синтаксис для установки элемента списка по определенному индексу приведен ниже –

lset listname index value 

Пример настройки элемента списка по определенному индексу приведен ниже –

Live Demo

#!/usr/bin/tclsh

set var {orange blue red green}
lset var 0 black 
puts $var

Когда приведенный выше код выполняется, он дает следующий результат –

black blue red green

Преобразовать список в переменные

Синтаксис для копирования значений в переменные приведен ниже –

lassign listname variable1 variable2.. variablen

Пример для преобразования списка в переменные приведен ниже –

Live Demo

#!/usr/bin/tclsh

set var {orange blue red green}
lassign $var colour1 colour2
puts $colour1
puts $colour2

Когда приведенный выше код выполняется, он дает следующий результат –

orange
blue

Сортировка списка

Синтаксис для сортировки списка приведен ниже –

lsort listname

Пример для сортировки списка приведен ниже –

Live Demo

#!/usr/bin/tclsh

set var {orange blue red green}
set var [lsort $var]
puts $var

Когда приведенный выше код выполняется, он дает следующий результат –

blue green orange red

Tcl – словарь

Словарь – это схема сопоставления значений с ключами. Синтаксис для обычного словаря показан ниже –

dict set dictname key value
# or 
dict create dictname key1 value1 key2 value2 .. keyn valuen

Некоторые примеры для создания словаря показаны ниже –

Live Demo

#!/usr/bin/tclsh

dict set colours  colour1 red 
puts $colours
dict set colours  colour2 green
puts $colours

set colours [dict create colour1 "black" colour2 "white"]
puts $colours

Когда приведенный выше код выполняется, он дает следующий результат –

colour1 red
colour1 red colour2 green
colour1 black colour2 white

Размер Дикта

Синтаксис для получения размера dict показан ниже –

[dict size dictname]

Пример для печати размера показан ниже –

Live Demo

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
puts [dict size $colours]

Когда приведенный выше код выполняется, он дает следующий результат –

2

Словарь итерации

Простая итерация словаря для печати ключей и значения словаря показана ниже –

Live Demo

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
foreach item [dict keys $colours] {
   set value [dict get $colours $item]
   puts $value
}

Когда приведенный выше код выполняется, он дает следующий результат –

black
white

Значение для ключа в Dict

Синтаксис для получения значения для ключа в dict показан ниже –

[dict get $dictname $keyname]

Пример для получения значения для ключа приведен ниже –

Live Demo

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
set value [dict get $colours colour1]
puts $value

Когда приведенный выше код выполняется, он дает следующий результат –

black

Все ключи в Dict

Синтаксис для получения всех ключей в dict показан ниже –

[dict keys $dictname]

Пример для печати всех ключей показан ниже –

Live Demo

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
set keys [dict keys $colours]
puts $keys

Когда приведенный выше код выполняется, он дает следующий результат –

colour1 colour2

Все значения в Dict

Синтаксис для получения всех значений в dict показан ниже –

[dict values $dictname]

Пример для печати всех значений показан ниже –

Live Demo

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
set values [dict values $colours]
puts $values

Когда приведенный выше код выполняется, он дает следующий результат –

black white

Ключ существует в Dict

Синтаксис проверки наличия ключа в dict показан ниже –

[dict exists $dictname $key]

Пример проверки, существует ли ключ в dict, показан ниже –

Live Demo

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
set result [dict exists $colours colour1]
puts $result

Когда приведенный выше код выполняется, он дает следующий результат –

1

Tcl – Процедуры

Процедуры – это не что иное, как блоки кода с серией команд, которые обеспечивают определенную функциональность многократного использования. Он используется, чтобы избежать повторения одного и того же кода в нескольких местах. Процедуры эквивалентны функциям, используемым во многих языках программирования, и доступны в Tcl с помощью команды proc .

Синтаксис создания простой процедуры показан ниже –

proc procedureName {arguments} {
   body
}

Простой пример процедуры приведен ниже –

Live Demo

#!/usr/bin/tclsh

proc helloWorld {} {
   puts "Hello, World!"
}
helloWorld

Когда приведенный выше код выполняется, он дает следующий результат –

Hello, World!

Процедуры с несколькими аргументами

Пример для процедуры с аргументами показан ниже –

Live Demo

#!/usr/bin/tclsh

proc add {a b} {
   return [expr $a+$b]
}
puts [add 10 30]

Когда приведенный выше код выполняется, он дает следующий результат –

40

Процедуры с переменными аргументами

Пример для процедуры с аргументами показан ниже –

Live Demo

#!/usr/bin/tclsh

proc avg {numbers} {
   set sum 0
   foreach number $numbers {
      set sum  [expr $sum + $number]
   }
   set average [expr $sum/[llength $numbers]]
   return $average
}
puts [avg {70 80 50 60}]
puts [avg {70 80 50 }]

Когда приведенный выше код выполняется, он дает следующий результат –

65
66

Процедуры с аргументами по умолчанию

Аргументы по умолчанию используются для предоставления значений по умолчанию, которые можно использовать, если значение не указано. Пример процедуры с аргументами по умолчанию, которые иногда называют неявными аргументами, показан ниже –

Live Demo

#!/usr/bin/tclsh

proc add {a {b 100} } {
   return [expr $a+$b]
}
puts [add 10 30]
puts [add 10]

Когда приведенный выше код выполняется, он дает следующий результат –

40
110

Рекурсивные процедуры

Пример для рекурсивных процедур показан ниже –

Live Demo

#!/usr/bin/tclsh

proc factorial {number} {
   if {$number <= 1} {
      return 1
   } 
   return [expr $number * [factorial [expr $number - 1]]]

}
puts [factorial 3]
puts [factorial 5]

Когда приведенный выше код выполняется, он дает следующий результат –

6
120

Tcl – Пакеты

Пакеты используются для создания повторно используемых блоков кода. Пакет состоит из набора файлов, которые предоставляют определенные функции. Эта коллекция файлов идентифицируется по имени пакета и может иметь несколько версий одних и тех же файлов. Пакет может быть набором сценариев Tcl, двоичной библиотекой или их комбинацией.

Пакет использует концепцию пространства имен, чтобы избежать конфликта имен переменных и процедур. Узнайте больше в нашем следующем уроке «Пространство имен ».

Создание пакета

Пакет может быть создан с помощью минимум двух файлов. Один файл содержит код пакета. Другой файл содержит индексный файл пакета для объявления вашего пакета.

Список шагов для создания и использования пакета приведен ниже.

ШАГ 1: Создание кода

Создайте код для пакета внутри папки, скажем, HelloWorld. Пусть файл с именем HelloWorld.tcl с кодом, как показано ниже –

# /Users/rajkumar/Desktop/helloworld/HelloWorld.tcl 
# Create the namespace
namespace eval ::HelloWorld {
 
  # Export MyProcedure
  namespace export MyProcedure
 
  # My Variables
   set version 1.0
   set MyDescription "HelloWorld"
 
  # Variable for the path of the script
   variable home [file join [pwd] [file dirname [info script]]]
 
}
 
# Definition of the procedure MyProcedure
proc ::HelloWorld::MyProcedure {} {
   puts $HelloWorld::MyDescription
}

package provide HelloWorld $HelloWorld::version
package require Tcl 8.0

ШАГ 2: Создание индекса пакета

Откройте тцлш. Перейдите в каталог HelloWorld и используйте команду pkg_mkIndex, чтобы создать индексный файл, как показано ниже –

% cd /Users/rajkumar/Desktop/helloworld 
% pkg_mkIndex . *.tcl

ШАГ 3: Добавление каталога в Autopath

Используйте команду lappend, чтобы добавить пакет в глобальный список, как показано ниже –

% lappend auto_path "/Users/rajkumar/Desktop/helloworld"

ШАГ 4: Добавление пакета

Затем добавьте пакет в программу, используя выражение запроса пакета, как показано ниже –

% package require HelloWorld 1.0

ШАГ 5: Процедура вызова

Теперь, когда все настроено, мы можем вызвать нашу процедуру, как показано ниже –

% puts [HelloWorld::MyProcedure]

Вы получите следующий результат –

HelloWorld

Первые два шага создать пакет. После создания пакета вы можете использовать его в любом Tcl-файле, добавив три последних оператора, как показано ниже:

lappend auto_path "/Users/rajkumar/Desktop/helloworld"
package require HelloWorld 1.0
puts [HelloWorld::MyProcedure]

Вы получите следующий результат –

HelloWorld

Tcl – Пространства имен

Пространство имен – это контейнер для набора идентификаторов, который используется для группировки переменных и процедур. Пространства имен доступны из Tcl версии 8.0. До введения пространств имен существовала единая глобальная область. Теперь с пространствами имен у нас есть дополнительные разделы глобальной области видимости.

Создание пространства имен

Пространства имен создаются с помощью команды namespace . Простой пример создания пространства имен показан ниже –

Live Demo

#!/usr/bin/tclsh

namespace eval MyMath {
  # Create a variable inside the namespace
  variable myResult
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
  set ::MyMath::myResult [expr $a + $b]
}
MyMath::Add 10 23

puts $::MyMath::myResult

Когда приведенный выше код выполняется, он дает следующий результат –

33

В приведенной выше программе вы можете видеть, что есть пространство имен с переменной myResult и процедурой Add. Это позволяет создавать переменные и процедуры с одинаковыми именами в разных пространствах имен.

Вложенные пространства имен

Tcl позволяет вложить пространства имен. Простой пример для вложения пространств имен приведен ниже –

Live Demo

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
}

namespace eval extendedMath {
   # Create a variable inside the namespace
   namespace eval MyMath {
      # Create a variable inside the namespace
      variable myResult
   }
}
set ::MyMath::myResult "test1"
puts $::MyMath::myResult
set ::extendedMath::MyMath::myResult "test2"
puts $::extendedMath::MyMath::myResult

Когда приведенный выше код выполняется, он дает следующий результат –

test1
test2

Импорт и экспорт пространства имен

Вы можете видеть в предыдущих примерах пространства имен, мы используем много операторов разрешения области видимости, и это более сложный в использовании. Мы можем избежать этого, импортируя и экспортируя пространства имен. Пример приведен ниже –

Live Demo

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
   namespace export Add
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
   return [expr $a + $b]
}

namespace import MyMath::*
puts [Add 10 30]

Когда приведенный выше код выполняется, он дает следующий результат –

40

Забыть пространство имен

Вы можете удалить импортированное пространство имен, используя подкоманду Forgot. Простой пример показан ниже –

Live Demo

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
   namespace export Add
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
   return [expr $a + $b]
}
namespace import MyMath::*
puts [Add 10 30]
namespace forget MyMath::*

Когда приведенный выше код выполняется, он дает следующий результат –

40

Tcl – File I / O

Tcl поддерживает обработку файлов с помощью встроенных команд открывать, читать, ставить, получать и закрывать.

Файл представляет собой последовательность байтов, не имеет значения, является ли это текстовым файлом или двоичным файлом.

Открытие файлов

Tcl использует команду open для открытия файлов в Tcl. Синтаксис для открытия файла выглядит следующим образом:

open fileName accessMode

Здесь filename является строковым литералом, который вы будете использовать для именования вашего файла, и accessMode может иметь одно из следующих значений:

Sr.No. Режим и описание
1

р

Открывает существующий текстовый файл для чтения, и файл должен существовать. Этот режим используется по умолчанию, если не указан accessMode.

2

вес

Открывает текстовый файл для записи, если он не существует, то создается новый файл, иначе существующий файл усекается.

3

Открывает текстовый файл для записи в режиме добавления, и файл должен существовать. Здесь ваша программа начнет добавлять содержимое в существующий файл содержимого.

4

г & плюс;

Открывает текстовый файл для чтения и записи как. Файл должен существовать уже.

5

ж & плюс;

Открывает текстовый файл для чтения и записи как. Сначала он обрезает файл до нулевой длины, если он существует, в противном случае создайте файл, если он не существует.

6

плюс;

Открывает текстовый файл для чтения и записи как. Он создает файл, если он не существует. Чтение начнется с самого начала, но запись может быть только добавлена.

р

Открывает существующий текстовый файл для чтения, и файл должен существовать. Этот режим используется по умолчанию, если не указан accessMode.

вес

Открывает текстовый файл для записи, если он не существует, то создается новый файл, иначе существующий файл усекается.

Открывает текстовый файл для записи в режиме добавления, и файл должен существовать. Здесь ваша программа начнет добавлять содержимое в существующий файл содержимого.

г & плюс;

Открывает текстовый файл для чтения и записи как. Файл должен существовать уже.

ж & плюс;

Открывает текстовый файл для чтения и записи как. Сначала он обрезает файл до нулевой длины, если он существует, в противном случае создайте файл, если он не существует.

плюс;

Открывает текстовый файл для чтения и записи как. Он создает файл, если он не существует. Чтение начнется с самого начала, но запись может быть только добавлена.

Закрытие файла

Чтобы закрыть файл, используйте команду закрытия. Синтаксис для закрытия следующий –

close fileName 

Любой файл, который был открыт программой, должен быть закрыт, когда программа заканчивает использовать этот файл. В большинстве случаев файлы не нужно закрывать явно; они закрываются автоматически, когда объекты File автоматически завершаются.

Написание файла

Команда Puts используется для записи в открытый файл.

puts $filename "text to write"

Простой пример записи в файл показан ниже.

#!/usr/bin/tclsh

set fp [open "input.txt" w+]
puts $fp "test"
close $fp

Когда приведенный выше код компилируется и выполняется, он создает новый файл input.txt в каталоге, в котором он был запущен (в рабочем каталоге программы).

Чтение файла

Ниже приводится простая команда для чтения из файла –

set file_data [read $fp]

Полный пример чтения и записи показан ниже –

Live Demo

#!/usr/bin/tclsh

set fp [open "input.txt" w+]
puts $fp "test"
close $fp
set fp [open "input.txt" r]
set file_data [read $fp]
puts $file_data
close $fp

Когда приведенный выше код компилируется и выполняется, он читает файл, созданный в предыдущем разделе, и выдает следующий результат:

test

Вот еще один пример для чтения файла до конца файла строка за строкой –

Live Demo

#!/usr/bin/tclsh

set fp [open "input.txt" w+]
puts $fp "testntest"
close $fp
set fp [open "input.txt" r]

while { [gets $fp data] >= 0 } {
   puts $data
}
close $fp

Когда приведенный выше код компилируется и выполняется, он читает файл, созданный в предыдущем разделе, и выдает следующий результат:

test
test

Tcl – Обработка ошибок

Обработка ошибок в Tcl обеспечивается с помощью команд error и catch . Синтаксис каждой из этих команд показан ниже.

Синтаксис ошибки

error message info code

В приведенном выше синтаксисе команды error сообщение является сообщением об ошибке, информация задается в глобальной переменной errorInfo, а код задается в глобальной переменной errorCode.

Поймать синтаксис

catch script resultVarName

В приведенном выше синтаксисе команды catch сценарий – это код, который должен быть выполнен, а resultVarName – переменная, которая содержит ошибку или результат. Команда catch возвращает 0, если ошибки нет, и 1, если есть ошибка.

Пример простой обработки ошибок показан ниже –

Live Demo

#!/usr/bin/tclsh

proc Div {a b} {
   if {$b == 0} {
      error "Error generated by error" "Info String for error" 401
   } else {
      return [expr $a/$b]
   }
}

if {[catch {puts "Result = [Div 10 0]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:n$errorInfon"
}

if {[catch {puts "Result = [Div 10 2]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:n$errorInfon"
}

Когда приведенный выше код выполняется, он дает следующий результат –

ErrorMsg: Error generated by error
ErrorCode: 401
ErrorInfo:
Info String for error
   (procedure "Div" line 1)
   invoked from within
"Div 10 0"

Result = 5

Как вы можете видеть в приведенном выше примере, мы можем создавать наши собственные сообщения об ошибках. Точно так же можно отловить ошибку, сгенерированную Tcl. Пример показан ниже –

Live Demo

#!/usr/bin/tclsh

catch {set file [open myNonexistingfile.txt]} result
puts "ErrorMsg: $result"
puts "ErrorCode: $errorCode"
puts "ErrorInfo:n$errorInfon"

Когда приведенный выше код выполняется, он дает следующий результат –

ErrorMsg: couldn't open "myNonexistingfile.txt": no such file or directory
ErrorCode: POSIX ENOENT {no such file or directory}
ErrorInfo:
couldn't open "myNonexistingfile.txt": no such file or directory
   while executing
"open myNonexistingfile.txt"

Tcl – встроенные функции

Tcl предоставляет ряд встроенных функций (процедур) для различных операций. Это включает в себя –

  • Функции для обработки списка .

  • Функции для обработки строк .

  • Функции для обработки массива .

  • Функции для работы со словарем .

  • Функции для обработки файлового ввода-вывода .

  • Функции для создания пространств имен и пакетов.

  • Функции для математических операций.

  • Функции для работы системы.

Функции для обработки списка .

Функции для обработки строк .

Функции для обработки массива .

Функции для работы со словарем .

Функции для обработки файлового ввода-вывода .

Функции для создания пространств имен и пакетов.

Функции для математических операций.

Функции для работы системы.

Все вышеперечисленное, за исключением математических и системных функций, рассматривается в предыдущих главах. Математика и встроенные функции системы описаны ниже.

Математические функции

Математические функции, доступные в Tcl, перечислены в следующей таблице:

Sr.No. Метод и описание
1

абс арг

Рассчитывает абсолютное значение арг.

2

Acos Arg

Рассчитывает арккозин арг.

3

Асин Арг

Рассчитывает арксинус арг.

4

Атан Арг

Рассчитывает арктангенс арг.

5

atan2 yx

Вычисляет арктангенс фактора его аргументов (у / х).

6

Ceil Arg

Вычисляет наименьшее целое число, большее или равное числу.

7

потому что арг

Рассчитывает косинус арг.

8

Кош Арг

Рассчитывает гиперболический косинус арг.

9

двойной арг

Вычисляет, является ли arg значением с плавающей точкой, возвращает arg, в противном случае преобразует arg в число с плавающей точкой и возвращает преобразованное значение.

10

Exp Arg

Вычисляет экспоненциальную функцию (е возводится в степень аргумента).

11

пол арг

Вычисляет наибольшее целое число, меньшее или равное arg.

12

FMOD XY

Вычисляет остаток с плавающей точкой от деления x на y. Если y равно 0, возвращается ошибка.

13

гипотеза ху

Вычисляет длину гипотенузы прямоугольного треугольника sqrt (x * x + y * y).

14

Int Arg

Вычисляет, является ли arg целочисленным значением той же ширины, что и машинное слово, возвращает arg, в противном случае arg преобразуется в целое число.

15

лог арг

Рассчитывает натуральный логарифм арг.

16

log10 arg

Рассчитывает основание 10 логарифм аргумента.

17

Pow XY

Вычисляет значение x, возведенное в степень y. Если x отрицательно, y должно быть целочисленным значением.

18

рант

Вычисляет псевдослучайное число от 0 до 1.

19

круглый арг

Вычисляет значение arg, округленное до ближайшего целого числа.

20

грешник

Рассчитывает синус арг.

21

синх арг

Рассчитывает гиперболический синус арг.

22

sqrt arg

Рассчитывает квадратный корень из арг. аргумент должен быть положительным.

23

Srand Arg

Вычисляет псевдослучайное число между 0 и 1. Аргумент, который должен быть целым числом, используется для сброса начального числа для генератора случайных чисел rand.

24

Tan Arg

Рассчитывает тангенс арг.

25

Тан Арг

Вычисляет гиперболический тангенс аргумента arg.

26

широкий арг

Вычисляет целочисленное значение шириной не менее 64 бит (по расширению знака, если arg – 32-битное число) для аргумента arg, если оно еще не было.

абс арг

Рассчитывает абсолютное значение арг.

Acos Arg

Рассчитывает арккозин арг.

Асин Арг

Рассчитывает арксинус арг.

Атан Арг

Рассчитывает арктангенс арг.

atan2 yx

Вычисляет арктангенс фактора его аргументов (у / х).

Ceil Arg

Вычисляет наименьшее целое число, большее или равное числу.

потому что арг

Рассчитывает косинус арг.

Кош Арг

Рассчитывает гиперболический косинус арг.

двойной арг

Вычисляет, является ли arg значением с плавающей точкой, возвращает arg, в противном случае преобразует arg в число с плавающей точкой и возвращает преобразованное значение.

Exp Arg

Вычисляет экспоненциальную функцию (е возводится в степень аргумента).

пол арг

Вычисляет наибольшее целое число, меньшее или равное arg.

FMOD XY

Вычисляет остаток с плавающей точкой от деления x на y. Если y равно 0, возвращается ошибка.

гипотеза ху

Вычисляет длину гипотенузы прямоугольного треугольника sqrt (x * x + y * y).

Int Arg

Вычисляет, является ли arg целочисленным значением той же ширины, что и машинное слово, возвращает arg, в противном случае arg преобразуется в целое число.

лог арг

Рассчитывает натуральный логарифм арг.

log10 arg

Рассчитывает основание 10 логарифм аргумента.

Pow XY

Вычисляет значение x, возведенное в степень y. Если x отрицательно, y должно быть целочисленным значением.

рант

Вычисляет псевдослучайное число от 0 до 1.

круглый арг

Вычисляет значение arg, округленное до ближайшего целого числа.

грешник

Рассчитывает синус арг.

синх арг

Рассчитывает гиперболический синус арг.

sqrt arg

Рассчитывает квадратный корень из арг. аргумент должен быть положительным.

Srand Arg

Вычисляет псевдослучайное число между 0 и 1. Аргумент, который должен быть целым числом, используется для сброса начального числа для генератора случайных чисел rand.

Tan Arg

Рассчитывает тангенс арг.

Тан Арг

Вычисляет гиперболический тангенс аргумента arg.

широкий арг

Вычисляет целочисленное значение шириной не менее 64 бит (по расширению знака, если arg – 32-битное число) для аргумента arg, если оно еще не было.

Некоторые примеры использования математических функций приведены ниже –

Live Demo

#!/usr/bin/tclsh

namespace import ::tcl::mathfunc::*
puts [tan 10]
puts [pow 10 2]
puts [ceil 10.34]
puts [hypot 10 20]
puts [srand 45]
puts [log 10]
puts [srand 45]

Когда приведенный выше код выполняется, он дает следующий результат –

0.6483608274590866
100.0
11.0
22.360679774997898
0.0003521866166741525
2.302585092994046
0.0003521866166741525

Системные функции

Важные системные функции в Tcl включают в себя:

  • часы – функция секунд, которая возвращает текущее время в секундах.

  • часы – функция форматирования, которая форматирует секунды в дату и время.

  • clock – функция сканирования, которая сканирует входную строку и преобразует ее в секунды.

  • open – функция, которая используется для открытия файла.

  • exec – функция, которая используется для выполнения системной команды.

  • close – функция, которая используется для закрытия файла.

часы – функция секунд, которая возвращает текущее время в секундах.

часы – функция форматирования, которая форматирует секунды в дату и время.

clock – функция сканирования, которая сканирует входную строку и преобразует ее в секунды.

open – функция, которая используется для открытия файла.

exec – функция, которая используется для выполнения системной команды.

close – функция, которая используется для закрытия файла.

Некоторые примеры вышеуказанных функций перечислены ниже –

#!/usr/bin/tclsh

#get seconds
set currentTime [clock seconds]
puts $currentTime
#get format 
puts "The time is: [clock format $currentTime -format %H:%M:%S]"
puts "The date is: [clock format $currentTime -format %D]"

set date "Jun 15, 2014"
puts [clock scan $date -format {%b %d, %Y}]

puts [exec ls]
puts [exec dir]

set a  [open input.txt]
puts [read $a];
puts $a
close $a

Когда приведенный выше код выполняется, он дает следующий результат –

1402819756
The time is: 03:09:16
The date is: 06/15/2014
1402808400
input.txt
main.tcl
input.txt  main.tcl
This is the file you can use to provide input to your program and later on open
   it inside your program to process the input.

file3

В следующей таблице приведены строки списка, которые можно использовать для форматирования даты и времени.

Sr.No. Формат и описание
1

% в

День в короткой форме, например: Солнце.

2

% A

День в полной форме, например: воскресенье.

3

% б

Месяц в короткой форме.

4

% В

Месяц в полной форме.

5

% d

День месяца

6

% J

Юлианский день года.

7

% м

Месяц в номере.

8

% г

Год из двух цифр.

9

% Y

Год в четыре цифры.

10

%ЧАС

Час в 24 часах.

11

Час в 12 часовых часах.

12

% M

Протокол.

13

% S

Секунды.

14

%п

До или после полудня.

15

% D

Дата в номере, мм / дд / гг.

16

Время в 12 часовых часах.

17

Время в 24 часовых часах без секунд.

18

% Т

Время в 24 часовых часах с секундами.

19

% Z

Название часового пояса, как GMT, IST, EST и так далее.

% в

День в короткой форме, например: Солнце.

% A

День в полной форме, например: воскресенье.

% б

Месяц в короткой форме.

% В

Месяц в полной форме.

% d

День месяца

% J

Юлианский день года.

% м

Месяц в номере.

% г

Год из двух цифр.

% Y

Год в четыре цифры.

%ЧАС

Час в 24 часах.

Час в 12 часовых часах.

% M

Протокол.

% S

Секунды.

%п

До или после полудня.

% D

Дата в номере, мм / дд / гг.

Время в 12 часовых часах.

Время в 24 часовых часах без секунд.

% Т

Время в 24 часовых часах с секундами.

% Z

Название часового пояса, как GMT, IST, EST и так далее.

Tcl – регулярные выражения

Команда “regexp” используется для соответствия регулярному выражению в Tcl. Регулярное выражение – это последовательность символов, которая содержит шаблон поиска. Он состоит из нескольких правил, и следующая таблица объясняет эти правила и их соответствующее использование.

Sr.No. Правило и описание
1

Икс

Полное совпадение.

2

[AZ]

Любая строчная буква от аз.

3

,

Любой персонаж.

4

^

Начальная строка должна совпадать.

5

$

Конечная строка должна совпадать.

6

^

Последовательность люфта для соответствия специальному символу ^. Аналогично вы можете использовать для других символов.

7

()

Добавьте вышеуказанные последовательности в круглые скобки, чтобы сделать регулярное выражение.

8

Икс*

Должно совпадать с 0 или более вхождениями предыдущего x.

9

х & плюс;

Должно совпадать с 1 или более вхождениями предыдущего x.

10

[AZ]?

Должно совпадать с 0 или 1 вхождением предыдущего x.

11

{разряд}

Совпадает точно с цифрами вхождения предыдущего выражения регулярного выражения. Цифра, которая содержит 0-9.

12

{цифра}

Соответствует 3 или более разрядам предыдущего выражения регулярного выражения. Цифра, которая содержит 0-9.

13

{Digit1, digit2}

Вхождения соответствуют диапазону между цифрами 1 и 2 в предыдущем выражении регулярного выражения.

Икс

Полное совпадение.

[AZ]

Любая строчная буква от аз.

,

Любой персонаж.

^

Начальная строка должна совпадать.

$

Конечная строка должна совпадать.

^

Последовательность люфта для соответствия специальному символу ^. Аналогично вы можете использовать для других символов.

()

Добавьте вышеуказанные последовательности в круглые скобки, чтобы сделать регулярное выражение.

Икс*

Должно совпадать с 0 или более вхождениями предыдущего x.

х & плюс;

Должно совпадать с 1 или более вхождениями предыдущего x.

[AZ]?

Должно совпадать с 0 или 1 вхождением предыдущего x.

{разряд}

Совпадает точно с цифрами вхождения предыдущего выражения регулярного выражения. Цифра, которая содержит 0-9.

{цифра}

Соответствует 3 или более разрядам предыдущего выражения регулярного выражения. Цифра, которая содержит 0-9.

{Digit1, digit2}

Вхождения соответствуют диапазону между цифрами 1 и 2 в предыдущем выражении регулярного выражения.

Синтаксис

Синтаксис для регулярных выражений приведен ниже –

regexp optionalSwitches patterns searchString fullMatch subMatch1 ... subMatchn

Здесь регулярное выражение является командой. О дополнительных переключателях мы увидим позже. Шаблоны – это правила, упомянутые ранее. Строка поиска – это фактическая строка, в которой выполняется регулярное выражение. Полное совпадение – это любая переменная, в которой содержится результат сопоставленного результата регулярного выражения. Submatch1 to SubMatchn – это необязательная переменная subMatch, которая содержит результат шаблонов субсовпадений.

Давайте рассмотрим несколько простых примеров, прежде чем углубляться в сложные. Простой пример для строки с любыми алфавитами. При обнаружении любого другого символа в регулярном выражении поиск будет остановлен и возвращен.

Live Demo

#!/usr/bin/tclsh

regexp {([A-Z,a-z]*)} "Tcl Tutorial" a b 
puts "Full Match: $a"
puts "Sub Match1: $b"

Когда приведенный выше код выполняется, он дает следующий результат –

Full Match: Tcl
Sub Match1: Tcl

Несколько шаблонов

В следующем примере показано, как искать несколько шаблонов. Это пример шаблона для любых алфавитов, за которыми следует любой символ, за которым следуют любые алфавиты.

Live Demo

#!/usr/bin/tclsh

regexp {([A-Z,a-z]*).([A-Z,a-z]*)} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

Когда приведенный выше код выполняется, он дает следующий результат –

Full Match: Tcl Tutorial
Sub Match1: Tcl
Sub Match2: Tutorial

Ниже показана модифицированная версия приведенного выше кода, показывающая, что подшаблон может содержать несколько шаблонов.

Live Demo

#!/usr/bin/tclsh

regexp {([A-Z,a-z]*.([A-Z,a-z]*))} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

Когда приведенный выше код выполняется, он дает следующий результат –

Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial

Переключатели для Regex Command

Список переключателей, доступных в Tcl,

  • nocase – используется для игнорирования регистра

  • индексы – Храните расположение совпадающих подшаблонов вместо совпадающих символов.

  • line – Новая строка, чувствительная к совпадению. Игнорирует символы после новой строки.

  • начальный индекс – устанавливает смещение начала шаблона поиска.

  • Отмечает конец выключателей

nocase – используется для игнорирования регистра

индексы – Храните расположение совпадающих подшаблонов вместо совпадающих символов.

line – Новая строка, чувствительная к совпадению. Игнорирует символы после новой строки.

начальный индекс – устанавливает смещение начала шаблона поиска.

Отмечает конец выключателей

В приведенных выше примерах я намеренно использовал [AZ, az] для всех алфавитов, вы можете легко использовать -nocase вместо того, как показано ниже –

Live Demo

#!/usr/bin/tclsh

regexp -nocase {([A-Z]*.([A-Z]*))} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

Когда приведенный выше код выполняется, он дает следующий результат –

Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial

Другой пример использования переключателей показан ниже –

Live Demo

#!/usr/bin/tclsh

regexp -nocase -line -- {([A-Z]*.([A-Z]*))} "Tcl nTutorial" a b 
puts "Full Match: $a"
puts "Sub Match1: $b"
regexp -nocase -start 4 -line -- {([A-Z]*.([A-Z]*))} "Tcl nTutorial" a b  
puts "Full Match: $a"
puts "Sub Match1: $b"

Когда приведенный выше код выполняется, он дает следующий результат –

Full Match: Tcl 
Sub Match1: Tcl 
Full Match: Tutorial
Sub Match1: Tutorial

Тк – Обзор

Tk относится к Toolkit и предоставляет кроссплатформенные виджеты GUI, которые помогают вам в создании графического интерфейса пользователя. Он был разработан как расширение языка сценариев Tcl Джоном Оустерхаутом. Tk оставался в разработке независимо от Tcl, причем версии отличались друг от друга, до этого он был синхронизирован с Tcl в v8.0.

Особенности Тк

Это кроссплатформенный с поддержкой операционных систем Linux, Mac OS, Unix и Microsoft Windows.

  • Это открытый источник.
  • Это обеспечивает высокий уровень расширяемости.
  • Это настраиваемо.
  • Это настраивается.
  • Предоставляет большое количество виджетов.
  • Он может использоваться с другими динамическими языками, а не только с Tcl.
  • GUI выглядит одинаково на разных платформах.

Приложения, построенные в Tk

Большие успешные приложения были построены в Tcl / Tk.

  • Пользовательский интерфейс Dashboard Soft
  • Формы GUI для реляционных БД
  • Специальный графический интерфейс для реляционной БД
  • Программно-аппаратный дизайн системы
  • Xtask – Управление задачами
  • Музыковедение с Tcl и Tk
  • Календарное приложение
  • Тк почта
  • ТК Отладчик

Tk – Окружающая среда

Как правило, все Mac и Linux Mac поставляются с предустановленной Tk. В случае, если он недоступен или вам нужна последняя версия, возможно, вам придется установить ее. Windows не поставляется с Tcl / Tk, и вам может потребоваться использовать его конкретный двоичный файл для его установки.

ТЗ Переводчик

Это небольшая программа, которая позволяет вам вводить команды Tk и выполнять их построчно. Он останавливает выполнение файла tcl в случае, если он сталкивается с ошибкой, в отличие от компилятора, который выполняется полностью.

Давайте создадим файл helloWorld.tcl следующим образом. Мы будем использовать это в качестве первой программы, работающей на выбранной вами платформе.

#!/usr/bin/wish

grid [ttk::button .mybutton -text "Hello World"] 

В следующем разделе объясняется только, как установить Tcl / Tk на каждую из доступных платформ.

Установка на Windows

Загрузите последнюю версию для установщика Windows из списка доступных двоичных файлов Active Tcl / Tk. Активная версия сообщества Tcl / Tk бесплатна для личного использования.

Запустите загруженный исполняемый файл, чтобы установить Tcl и Tk, что можно сделать, следуя инструкциям на экране.

Теперь мы можем построить и запустить файл Tcl, скажем helloWorld.tcl, переключившись на папку, содержащую файл, используя cd, а затем выполнив следующий шаг –

C:Tcl> wish helloWorld.tcl

Нажмите ввод, и мы увидим вывод, как показано ниже –

Привет Мир Windows

Установка в Linux

Большинство операционных систем Linux поставляется со встроенным Tk, и вы можете сразу же начать работу в этих системах. В случае, если он недоступен, вы можете использовать следующую команду для загрузки и установки Tcl-Tk.

$ yum install tcl tk

Теперь мы можем создать и запустить файл Tcl, скажем helloWorld.tcl, переключившись на папку, содержащую файл, с помощью команды cd, а затем выполнив следующий шаг –

$ wish helloWorld.tcl

Нажмите ввод, и мы увидим вывод, похожий на следующий –

Привет, мир

Установка в системах на основе Debian

В случае, если он недоступен в вашей операционной системе, вы можете использовать следующую команду для загрузки и установки Tcl-Tk –

$ sudo apt-get install tcl tk

Теперь мы можем создать и запустить файл Tcl, скажем helloWorld.tcl, переключившись на папку, содержащую файл, с помощью команды cd, а затем выполнив следующие шаги:

$ wish helloWorld.tcl

Нажмите ввод, и мы увидим вывод, похожий на следующий –

Привет, мир

Установка в Mac OS X

Загрузите последнюю версию пакета для Mac OS X из списка доступных двоичных файлов Active Tcl / Tk. Active Tcl Community Edition является бесплатной для личного использования.

Запустите загруженный исполняемый файл, чтобы установить Active Tcl, что можно сделать, следуя инструкциям на экране.

Теперь мы можем создать и запустить файл Tcl, скажем helloWorld.tcl, переключившись на папку, содержащую файл, с помощью команды cd, а затем выполнив следующий шаг –

$ wish helloWorld.tcl

Нажмите ввод, и мы увидим вывод, как показано ниже –

Привет, мир

Установка из исходных файлов

Вы можете использовать опцию установки из исходных файлов, когда двоичный пакет недоступен. Обычно предпочтительно использовать двоичные файлы Tk для Windows и Mac OS X, поэтому ниже показана только компиляция исходных текстов в системе на основе Unix –

  • Загрузите исходные файлы.

  • Теперь используйте следующие команды для извлечения, компиляции и сборки после переключения в загруженную папку.

Загрузите исходные файлы.

Теперь используйте следующие команды для извлечения, компиляции и сборки после переключения в загруженную папку.

$ tar zxf tk8.6.1-src.tar.gz
$ cd tcl8.6.1
$ cd unix
$ ./configure with-tcl=../../tcl8.6.1/unix prefix=/opt enable-gcc
$ make
$ sudo make install

Примечание. Убедитесь, что вы изменили имя файла на версию, загруженную по командам 1 и 2, указанным выше.

Tk – специальные переменные

В Tk мы классифицируем некоторые переменные как специальные переменные, и они имеют предопределенное использование / функциональность. Список специальных переменных приведен ниже.

Sr.No. Специальная переменная и описание
1

tk_library

Используется для настройки расположения стандартных библиотек Tk.

2

tk_patchLevel

Относится к текущему уровню патча интерпретатора Tk.

3

tk_strictMotif

Когда он не равен нулю, Tk старается придерживаться стиля и стиля Motif как можно ближе.

4

tk_version

Отображает версию Tk.

tk_library

Используется для настройки расположения стандартных библиотек Tk.

tk_patchLevel

Относится к текущему уровню патча интерпретатора Tk.

tk_strictMotif

Когда он не равен нулю, Tk старается придерживаться стиля и стиля Motif как можно ближе.

tk_version

Отображает версию Tk.

Указанные выше специальные переменные имеют свои особые значения для интерпретатора Tk.

Примеры использования специальных переменных Tk

Давайте посмотрим примеры для специальных переменных.

ТК ВЕРСИЯ

#!/usr/bin/wish

puts $tk_version

Когда вы запустите программу, вы получите похожий вывод, как показано ниже.

8.5

TK БИБЛИОТЕКА ПУТЬ

#!/usr/bin/wish

puts $tk_library

Когда вы запустите программу, вы получите похожий вывод, как показано ниже.

/Library/Frameworks/Tk.framework/Versions/8.6/Resources/Scripts

TK PATCH LEVEL

#!/usr/bin/wish

puts $tk_patchLevel

Когда вы запустите программу, вы получите похожий вывод, как показано ниже.

8.6.1

ТК СТРИКТМОТИФ

#!/usr/bin/wish

puts $tk_strictMotif

Когда вы запустите программу, вы получите похожий вывод, как показано ниже.

0

Tk – Обзор виджетов

Основной компонент приложения на основе Tk называется виджетом. Компонент также иногда называют окном, поскольку в Tk «окно» и «виджет» часто используются взаимозаменяемо. Tk – это пакет, который предоставляет богатый набор графических компонентов для создания графических приложений с Tcl.

Tk предоставляет широкий спектр виджетов, начиная от основных графических виджетов, таких как кнопки и меню, и заканчивая виджетами отображения данных. Виджеты очень настраиваемы, так как имеют конфигурации по умолчанию, что делает их простыми в использовании.

Приложения Tk следуют иерархии виджетов, где любое количество виджетов может быть размещено в другом виджете, а эти виджеты – в другом виджете. Основной виджет в программе Tk называется корневым виджетом и может быть создан путем создания нового экземпляра класса TkRoot.

Создание виджета

Синтаксис для создания виджета приведен ниже.

type variableName arguments options

Тип здесь относится к типу виджета, такому как кнопка, метка и т. Д. Аргументы могут быть необязательными и обязательными в зависимости от индивидуального синтаксиса каждого виджета. Параметры варьируются от размера до форматирования каждого компонента.

Соглашение об именовании виджетов

Виджет использует структуру, аналогичную именованию пакетов. В Tk корневое окно именуется точкой (.) И элементом в окне, например кнопка называется .myButton1. Имя переменной должно начинаться со строчной буквы, цифры или знака пунктуации (кроме точки). После первого символа другие символы могут быть прописными или строчными буквами, цифрами или знаками препинания (кроме точек). Рекомендуется использовать строчную букву, чтобы начать метку.

Соглашение о присвоении цветов

Цвета могут быть объявлены с использованием имени, такого как красный, зеленый и т. Д. Он также может использовать шестнадцатеричное представление с #. Количество шестнадцатеричных цифр может быть 3, 6, 9 или 12.

Конвенция по измерениям

Единицей по умолчанию являются пиксели, и она используется, когда мы не указываем размер. Другие размеры: i для дюймов, m для миллиметров, c для сантиметров и p для точек.

Общие параметры

Существует так много общих параметров, доступных для всех виджетов, и они перечислены ниже в следующей таблице:

Sr.No. Синтаксис и описание
1

-фоновый цвет

Используется для установки цвета фона для виджета.

2

ширина полосы

Используется для рисования с рамкой в ​​3D-эффектах.

3

-font fontDescriptor

Используется для установки шрифта для виджета.

4

цвет переднего плана

Используется для установки цвета переднего плана для виджета.

5

высот

Используется для установки высоты для виджета.

6

-светлый фоновый цвет

Используется для установки цветного прямоугольника для рисования вокруг виджета, когда виджет не имеет фокуса ввода.

7

-светлый цвет

Используется для установки цветного прямоугольника для рисования вокруг виджета, когда виджет имеет фокус ввода.

8

-адрес номер

Устанавливает padx для виджета.

9

-падый номер

Устанавливает пади для виджета.

10

состояние

Устанавливает 3D рельеф для этого виджета. Условие может быть приподнятым, утопленным, плоским, ребристым, твердым или желобчатым.

11

текст

Устанавливает текст для виджета.

12

-textvariable varName

Переменная, связанная с виджетом. Когда текст виджета изменяется, переменная устанавливается с текстом виджета.

13

номер

Устанавливает ширину для виджета.

-фоновый цвет

Используется для установки цвета фона для виджета.

ширина полосы

Используется для рисования с рамкой в ​​3D-эффектах.

-font fontDescriptor

Используется для установки шрифта для виджета.

цвет переднего плана

Используется для установки цвета переднего плана для виджета.

высот

Используется для установки высоты для виджета.

-светлый фоновый цвет

Используется для установки цветного прямоугольника для рисования вокруг виджета, когда виджет не имеет фокуса ввода.

-светлый цвет

Используется для установки цветного прямоугольника для рисования вокруг виджета, когда виджет имеет фокус ввода.

-адрес номер

Устанавливает padx для виджета.

-падый номер

Устанавливает пади для виджета.

состояние

Устанавливает 3D рельеф для этого виджета. Условие может быть приподнятым, утопленным, плоским, ребристым, твердым или желобчатым.

текст

Устанавливает текст для виджета.

-textvariable varName

Переменная, связанная с виджетом. Когда текст виджета изменяется, переменная устанавливается с текстом виджета.

номер

Устанавливает ширину для виджета.

Простой пример для вариантов показан ниже.

#!/usr/bin/wish

grid [label .myLabel -background red -text "Hello World" -relief ridge -borderwidth 3]
   -padx 100 -pady 100

Когда мы запустим вышеуказанную программу, мы получим следующий вывод.

Hello World Options

Список доступных виджетов категоризирован ниже –

Основные виджеты

Sr.No. Виджет и описание
1

этикетка

Виджет для отображения одной строки текста.

2

кнопка

Виджет, который кликабелен и запускает действие.

3

запись

Виджет раньше принимал одну строку текста в качестве ввода.

4

Сообщение

Виджет для отображения нескольких строк текста.

5

Текст

Виджет для отображения и при необходимости редактирования нескольких строк текста.

6

Верхний уровень

Окно со всеми границами и украшениями, предоставляемыми менеджером окон.

этикетка

Виджет для отображения одной строки текста.

кнопка

Виджет, который кликабелен и запускает действие.

запись

Виджет раньше принимал одну строку текста в качестве ввода.

Сообщение

Виджет для отображения нескольких строк текста.

Текст

Виджет для отображения и при необходимости редактирования нескольких строк текста.

Верхний уровень

Окно со всеми границами и украшениями, предоставляемыми менеджером окон.

Виджеты макетов

Sr.No. Виджет и описание
1

Рамка

Контейнерный виджет для хранения других виджетов.

2

Место

Виджет для хранения других виджетов в определенном месте с координатами его происхождения и точного размера.

3

пак

Простой виджет для организации виджетов по блокам перед размещением их в родительском виджете.

4

сетка

Виджет для размещения упаковки виджетов в разных направлениях.

Рамка

Контейнерный виджет для хранения других виджетов.

Место

Виджет для хранения других виджетов в определенном месте с координатами его происхождения и точного размера.

пак

Простой виджет для организации виджетов по блокам перед размещением их в родительском виджете.

сетка

Виджет для размещения упаковки виджетов в разных направлениях.

Выбор виджетов

Sr.No. Виджет и описание
1

Переключатель

Виджет, который имеет набор кнопок включения / выключения и метки, одна из которых может быть выбрана.

2

Checkbutton

Виджет, который имеет набор кнопок включения / выключения и метки, многие из которых могут быть выбраны ..

3

Меню

Виджет, который выступает в качестве держателя для пунктов меню.

4

Listbox

Виджет, который отображает список ячеек, одну или несколько из которых можно выбрать.

Переключатель

Виджет, который имеет набор кнопок включения / выключения и метки, одна из которых может быть выбрана.

Checkbutton

Виджет, который имеет набор кнопок включения / выключения и метки, многие из которых могут быть выбраны ..

Меню

Виджет, который выступает в качестве держателя для пунктов меню.

Listbox

Виджет, который отображает список ячеек, одну или несколько из которых можно выбрать.

Мега Виджеты

Sr.No. Виджет и описание
1

диалог

Виджет для отображения диалоговых окон.

2

со счётчиком

Виджет, который позволяет пользователям выбирать номера.

3

Поле со списком

Виджет, который сочетает в себе запись со списком вариантов, доступных для использования.

4

Ноутбук

Виджет с вкладками, который помогает переключаться между одной из нескольких страниц, используя вкладку указателя.

5

Индикатор

Виджет для визуальной обратной связи с ходом длительной операции, такой как загрузка файла.

6

В виде дерева

Виджет для отображения и позволяет просматривать иерархию элементов более в виде дерева.

7

Полоса прокрутки

Прокрутка виджетов без текстовых или холст виджетов.

8

Масштаб

Масштабируйте виджет, чтобы выбрать числовое значение с помощью ползунков.

диалог

Виджет для отображения диалоговых окон.

со счётчиком

Виджет, который позволяет пользователям выбирать номера.

Поле со списком

Виджет, который сочетает в себе запись со списком вариантов, доступных для использования.

Ноутбук

Виджет с вкладками, который помогает переключаться между одной из нескольких страниц, используя вкладку указателя.

Индикатор

Виджет для визуальной обратной связи с ходом длительной операции, такой как загрузка файла.

В виде дерева

Виджет для отображения и позволяет просматривать иерархию элементов более в виде дерева.

Полоса прокрутки

Прокрутка виджетов без текстовых или холст виджетов.

Масштаб

Масштабируйте виджет, чтобы выбрать числовое значение с помощью ползунков.

Другие виджеты

Sr.No. Виджет и описание
1

холст

Рисование виджета для отображения графики и изображений.

холст

Рисование виджета для отображения графики и изображений.

Мы рассмотрим каждый из этих виджетов в следующих главах.

Tk – Основные виджеты

Базовые виджеты – это обычные виджеты, доступные практически во всех приложениях Tk. Список доступных основных виджетов приведен ниже –

Sr.No. Виджеты и описание
1 этикетка

Виджет для отображения одной строки текста.

2 кнопка

Виджет, который кликабелен и запускает действие.

3 запись

Виджет раньше принимал одну строку текста в качестве ввода.

4 Сообщение

Виджет для отображения нескольких строк текста.

5 Текст

Виджет для отображения и при необходимости редактирования нескольких строк текста.

6 Верхний уровень

Виджет используется для создания фрейма, который является новым окном верхнего уровня.

Виджет для отображения одной строки текста.

Виджет, который кликабелен и запускает действие.

Виджет раньше принимал одну строку текста в качестве ввода.

Виджет для отображения нескольких строк текста.

Виджет для отображения и при необходимости редактирования нескольких строк текста.

Виджет используется для создания фрейма, который является новым окном верхнего уровня.

Простой пример Tk показан ниже с использованием основных виджетов –

#!/usr/bin/wish

grid [label .myLabel -text "Label Widget" -textvariable labelText] 
grid [text .myText -width 20 -height 5]
.myText insert 1.0 "TextnWidgetn"
grid [entry .myEntry -text "Entry Widget"]
grid [message .myMessage -background red -foreground white -text "MessagenWidget"]
grid [button .myButton1  -text "Button" -command "set labelText clicked"]

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример базовых виджетов

Tk – Виджеты макета

Виджеты макетов используются для обработки макетов для приложения Tk. Виджет фрейма используется для группировки других виджетов, а менеджер мест, пакетов и сетки – это менеджер компоновки, чтобы дать вам полный контроль над добавлением в окна. Список доступных виджетов макета показан ниже:

Sr.No. Виджеты и описание
1 Рамка

Контейнерный виджет для хранения других виджетов.

2 Место

Виджет для хранения других виджетов в определенном месте с координатами его происхождения и точного размера.

3 пак

Простой виджет для организации виджетов по блокам перед размещением их в родительском виджете.

4 сетка

Виджет для размещения упаковки виджетов в разных направлениях.

Контейнерный виджет для хранения других виджетов.

Виджет для хранения других виджетов в определенном месте с координатами его происхождения и точного размера.

Простой виджет для организации виджетов по блокам перед размещением их в родительском виджете.

Виджет для размещения упаковки виджетов в разных направлениях.

Простой пример Tk показан ниже для виджетов макета –

#!/usr/bin/wish

frame .myFrame1 -background red  -relief ridge -borderwidth 8 -padx 10 -pady 10
   -height 100 -width 100
frame .myFrame2 -background blue  -relief ridge -borderwidth 8 -padx 10 -pady 10
   -height 100 -width 50
pack .myFrame1 
pack .myFrame2

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример виджета кадра

Tk – Выбор виджетов

Виджеты выбора используются для выбора различных параметров в приложении Tk. Список доступных виджетов выбора показан ниже.

Sr.No. Виджеты и описание
1 Переключатель

Виджет, который имеет набор кнопок включения / выключения и метки, одна из которых может быть выбрана.

2 Checkbutton

Виджет, который имеет набор кнопок включения / выключения и метки, многие из которых могут быть выбраны.

3 Меню

Виджет, который выступает в качестве держателя для пунктов меню.

4 Listbox

Виджет, который отображает список ячеек, одну или несколько из которых можно выбрать.

Виджет, который имеет набор кнопок включения / выключения и метки, одна из которых может быть выбрана.

Виджет, который имеет набор кнопок включения / выключения и метки, многие из которых могут быть выбраны.

Виджет, который выступает в качестве держателя для пунктов меню.

Виджет, который отображает список ячеек, одну или несколько из которых можно выбрать.

Простой пример Tk показан ниже с использованием виджетов выбора –

#!/usr/bin/wish

grid [frame .gender ]
grid [label .label1  -text "Male" -textvariable myLabel1 ] 
grid [radiobutton .gender.maleBtn -text "Male"   -variable gender -value "Male"
   -command "set  myLabel1 Male"] -row 1 -column 2
grid [radiobutton .gender.femaleBtn -text "Female" -variable gender -value "Female"
   -command "set  myLabel1 Female"] -row 1 -column 3
.gender.maleBtn select
grid [label .myLabel2  -text "Range 1 not selected" -textvariable myLabelValue2 ] 
grid [checkbutton .chk1 -text "Range 1" -variable occupied1 -command {if {$occupied1 } {
   set myLabelValue2 {Range 1 selected}
} else {
   set myLabelValue2 {Range 1 not selected}
} }]
proc setLabel {text} {
   .label configure -text $text 
}

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример виджета выбора

Tk – Canvas Widgets

Холст используется для предоставления областей рисования. Синтаксис для виджета Canvas показан ниже –

canvas canvasName options

Опции

Параметры, доступные для виджета Canvas, перечислены ниже в следующей таблице:

Sr.No. Синтаксис и описание
1

-фоновый цвет

Используется для установки цвета фона для виджета.

2

-близкое расстояние

Устанавливает близость курсора мыши к отображаемому элементу. По умолчанию 1,0 пиксель. Это значение может быть дробным и должно быть положительным.

3

-scrollregion boundingBox

Ограничительная рамка для общей площади этого холста.

4

высот

Используется для установки высоты для виджета.

5

номер

Устанавливает ширину для виджета.

6

-xscrollincrement размер

Количество для горизонтальной прокрутки при запросе прокрутки.

7

размер

Количество для вертикальной прокрутки при запросе прокрутки.

-фоновый цвет

Используется для установки цвета фона для виджета.

-близкое расстояние

Устанавливает близость курсора мыши к отображаемому элементу. По умолчанию 1,0 пиксель. Это значение может быть дробным и должно быть положительным.

-scrollregion boundingBox

Ограничительная рамка для общей площади этого холста.

высот

Используется для установки высоты для виджета.

номер

Устанавливает ширину для виджета.

-xscrollincrement размер

Количество для горизонтальной прокрутки при запросе прокрутки.

размер

Количество для вертикальной прокрутки при запросе прокрутки.

Простой пример для виджета Canvas показан ниже –

#!/usr/bin/wish

canvas .myCanvas -background red -width 100 -height 100 
pack .myCanvas

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример виджета Canvas

Виджеты для рисования на холсте

Список доступных виджетов для рисования на холсте приведен ниже –

Sr.No. Виджет и описание
1 Линия

Рисует линию.

2 дуга

Рисует дугу.

3 Прямоугольник

Рисует прямоугольник.

4 овальный

Рисует овал.

5 многоугольник

Рисует многоугольник.

6 Текст

Рисует текст.

7 Битовая карта

Рисует растровое изображение.

8 Образ

Рисует изображение.

Рисует линию.

Рисует дугу.

Рисует прямоугольник.

Рисует овал.

Рисует многоугольник.

Рисует текст.

Рисует растровое изображение.

Рисует изображение.

Пример использования различных виджетов Canvas показан ниже –

#!/usr/bin/wish

canvas .myCanvas -background red -width 200 -height 200 
pack .myCanvas
.myCanvas create arc 10 10 50 50 -fill yellow
.myCanvas create line 10 30 50 50 100 10 -arrow both -fill yellow -smooth true
   -splinesteps 2
.myCanvas create oval 50 50 100 80 -fill yellow
.myCanvas create polygon 50 150 100 80 120 120 100 190 -fill yellow -outline green
.myCanvas create rectangle 150 150 170 170  -fill yellow
.myCanvas create text 170 20 -fill yellow -text "Hello" -font {Helvetica -18 bold}
.myCanvas create bitmap 180 50 -bitmap info

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Canvas Widget Example2

Tk – Мега Виджеты

Мега виджеты включают в себя множество сложных виджетов, которые часто требуются в некоторых крупных приложениях Tk. Список доступных мега виджетов приведен ниже.

Sr.No. Виджет и описание
1 диалог

Виджет для отображения диалоговых окон.

2 со счётчиком

Виджет, который позволяет пользователям выбирать номера.

3 Поле со списком

Виджет, который сочетает в себе запись со списком вариантов, доступных для использования.

4 Ноутбук

Виджет с вкладками, который помогает переключаться между одной из нескольких страниц, используя вкладку указателя.

5 Индикатор

Виджет для визуальной обратной связи с ходом длительной операции, такой как загрузка файла.

6 В виде дерева

Виджет для отображения и позволяет просматривать иерархию элементов более в виде дерева.

7 Полоса прокрутки

Прокрутка виджетов без текстовых или холст виджетов.

8 Масштаб

Масштабируйте виджет, чтобы выбрать числовое значение с помощью ползунков.

Виджет для отображения диалоговых окон.

Виджет, который позволяет пользователям выбирать номера.

Виджет, который сочетает в себе запись со списком вариантов, доступных для использования.

Виджет с вкладками, который помогает переключаться между одной из нескольких страниц, используя вкладку указателя.

Виджет для визуальной обратной связи с ходом длительной операции, такой как загрузка файла.

Виджет для отображения и позволяет просматривать иерархию элементов более в виде дерева.

Прокрутка виджетов без текстовых или холст виджетов.

Масштабируйте виджет, чтобы выбрать числовое значение с помощью ползунков.

Простой пример Tk показан ниже с использованием нескольких мега-виджетов.

#!/usr/bin/wish

ttk::treeview .tree -columns "Creator Year" -displaycolumns "Year Creator" 
.tree heading Creator -text "Creator" -anchor center
.tree heading Year -text "Year" -anchor center
pack .tree
.tree insert {} end -id Languages -text "Languages"
.tree insert Languages end -text C -values [list "Dennis Ritchie" "1990"]
proc scaleMe {mywidget scaleValue} {
	$mywidget configure -length $scaleValue
} 
pack [scale .s2  -from 100.0 -to 200.0 -length 100 -background yellow -borderwidth 5
   -font{Helvetica -18 bold} -foreground red -width 40 -relief ridge -orien horizontal
   -variable a -command "scaleMe .s2" ]
pack [ttk::progressbar .p1 -orient horizontal -length 200 -mode indeterminate -value 90]
pack [ttk::progressbar .p2 -orient horizontal -length 200 -mode determinate -variable a
   -maximum 75 -value 20]

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример Mega Widget

Tk – Шрифты

Есть ряд виджетов, которые поддерживают отображение текста. Большинство из них предоставляет возможность атрибута шрифта. Синтаксис для создания шрифта показан ниже –

font create fontName options

Опции

Параметры, доступные для создания шрифта, перечислены ниже в следующей таблице:

Sr.No. Синтаксис и описание
1

Семейное имя

Название семейства шрифтов.

2

размер номера

Размер шрифта.

3

уровень веса

Вес для шрифта.

Семейное имя

Название семейства шрифтов.

размер номера

Размер шрифта.

уровень веса

Вес для шрифта.

Простой пример создания шрифта показан ниже –

#!/usr/bin/wish

font create myFont -family Helvetica -size 18 -weight bold 
pack [label .myLabel -font myFont -text "Hello World"]

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример шрифтов

Чтобы получить все доступные шрифты, мы можем использовать следующую команду –

#!/usr/bin/wish

puts [font families]

Когда мы запустим указанную выше команду, мы получим следующий вывод:

{Abadi MT Condensed Extra Bold} {Abadi MT Condensed Light} {Al Bayan} {Al Nile}
{Al Tarikh} {American Typewriter} {Andale Mono} Arial {Arial Black}
{Arial Hebrew} {Arial Narrow} {Arial Rounded MT Bold} {Arial Unicode MS}
Athelas Avenir {Avenir Next} {Avenir Next Condensed} Ayuthaya Baghdad {Bangla MN}
{Bangla Sangam MN} {Baoli SC} Baskerville {Baskerville Old Face} Batang {Bauhaus 93}
Beirut {Bell MT} {Bernard MT Condensed} BiauKai {Big Caslon} {Book Antiqua}
{Bookman Old Style} {Bookshelf Symbol 7} Braggadocio {Britannic Bold} {Brush Script MT}
Calibri {Calisto MT} Cambria {Cambria Math} Candara Century {Century Gothic}
{Century Schoolbook} Chalkboard {Chalkboard SE} Chalkduster {Charcoal CY} Charter
Cochin {Colonna MT} {Comic Sans MS} Consolas Constantia {Cooper Black} Copperplate
{Copperplate Gothic Bold} {Copperplate Gothic Light} Corbel {Corsiva Hebrew} Courier
{Courier New} {Curlz MT} Damascus {DecoType Naskh} Desdemona {Devanagari MT}
{Devanagari Sangam MN} Didot {DIN Alternate} {DIN Condensed} {Diwan Kufi} {Diwan Thuluth}
{Edwardian Script ITC} {Engravers MT} {Euphemia UCAS} Eurostile Farah Farisi
{Footlight MT Light} {Franklin Gothic Book} {Franklin Gothic Medium}
Futura Gabriola Garamond {GB18030 Bitmap} {Geeza Pro} Geneva {Geneva CY}
Georgia {Gill Sans} {Gill Sans MT} {Gloucester MT Extra Condensed}
{Goudy Old Style} {Gujarati MT} {Gujarati Sangam MN} Gulim GungSeo {Gurmukhi MN}
{Gurmukhi MT} {Gurmukhi Sangam MN} Haettenschweiler {Hannotate SC} {Hannotate TC}
{HanziPen SC} {HanziPen TC} Harrington HeadLineA Hei {Heiti SC} {Heiti TC}
Helvetica {Helvetica CY} {Helvetica Neue} Herculanum {Hiragino Kaku Gothic Pro}
{Hiragino Kaku Gothic ProN} {Hiragino Kaku Gothic Std} {Hiragino Kaku Gothic StdN}
{Hiragino Maru Gothic Pro} {Hiragino Maru Gothic ProN}
{Hiragino Mincho Pro} {Hiragino Mincho ProN} {Hiragino Sans GB}
{Hoefler Text} Impact {Imprint MT Shadow} InaiMathi {Iowan Old Style} Kai Kailasa
{Kaiti SC} {Kaiti TC} {Kannada MN} {Kannada Sangam MN} Kefa {Khmer MN} {Khmer Sangam MN}
{Kino MT} Kokonor Krungthep KufiStandardGK {Lantinghei SC} {Lantinghei TC} {Lao MN}
{Lao Sangam MN} {Libian SC} {LiHei Pro} {LiSong Pro} {Lucida Blackletter} {Lucida Bright}
{Lucida Calligraphy} {Lucida Console} {Lucida Fax} {Lucida Grande} {Lucida Handwriting}
{Lucida Sans} {Lucida Sans Typewriter} {Lucida Sans Unicode} {Malayalam MN}
{Malayalam Sangam MN} Marion {Marker Felt} Marlett {Matura MT Script Capitals}
Meiryo Menlo {Microsoft Sans Serif} Mishafi Mistral {Modern No. 20} Monaco {MS Gothic}
{MS Mincho} {MS PGothic} {MS PMincho} {MS Reference Sans Serif} {MS Reference Specialty}
Mshtakan {MT Extra} Muna {Myanmar MN} {Myanmar Sangam MN} Nadeem {Nanum Brush Script}
{Nanum Gothic} {Nanum Myeongjo} {Nanum Pen Script} {New Peninim MT} {News Gothic MT}
Noteworthy Onyx Optima {Oriya MN} {Oriya Sangam MN} Osaka Palatino {Palatino Linotype}
Papyrus PCMyungjo Perpetua {Perpetua Titling MT} PilGi {Plantagenet Cherokee}
Playbill PMingLiU {PT Mono} {PT Sans} {PT Sans Caption} {PT Sans Narrow} {PT Serif}
{PT Serif Caption} Raanana Rockwell {Rockwell Extra Bold} Sana Sathu {Savoye LET}
Seravek Silom SimSun {Sinhala MN} {Sinhala Sangam MN} Skia {Snell Roundhand} {Songti SC}
{Songti TC} Stencil STFangsong STHeiti STIXGeneral STIXIntegralsD STIXIntegralsSm
STIXIntegralsUp STIXIntegralsUpD STIXIntegralsUpSm STIXNonUnicode STIXSizeFiveSym
STIXSizeFourSym STIXSizeOneSym STIXSizeThreeSym STIXSizeTwoSym STIXVariants STKaiti
STSong Superclarendon Symbol Tahoma {Tamil MN} {Tamil Sangam MN} TeamViewer8 {Telugu MN}
{Telugu Sangam MN} Thonburi Times {Times New Roman} {Trebuchet MS} {Tw Cen MT} Verdana
Waseem {Wawati SC} {Wawati TC} Webdings {Weibei SC} {Weibei TC} {Wide Latin} Wingdings
{Wingdings 2} {Wingdings 3} {Xingkai SC} {Yuanti SC} YuGothic YuMincho {Yuppy SC}
{Yuppy TC} {Zapf Dingbats} Zapfino {Apple Braille} {Apple Chancery} {Apple Color Emoji}
{Apple LiGothic} {Apple LiSung} {Apple SD Gothic Neo} {Apple Symbols}
AppleGothic AppleMyungjo {Monotype Corsiva} {Monotype Sorts}

ТК – Изображения

Графический виджет используется для создания и управления изображениями. Синтаксис для создания изображения выглядит следующим образом –

image create type name options

В приведенном выше синтаксисе тип – это фото или растровое изображение, а имя – это идентификатор изображения.

Опции

Параметры, доступные для создания изображения, перечислены ниже в следующей таблице:

Sr.No. Синтаксис и описание
1

-file fileName

Имя имени файла изображения.

2

высот

Используется для установки высоты для виджета.

3

номер

Устанавливает ширину для виджета.

4

строка данных

Изображение в кодированной строке base 64.

-file fileName

Имя имени файла изображения.

высот

Используется для установки высоты для виджета.

номер

Устанавливает ширину для виджета.

строка данных

Изображение в кодированной строке base 64.

Простой пример для виджета изображения показан ниже –

#!/usr/bin/wish

image create photo imgobj -file "/Users/rajkumar/Desktop/F Drive/pictur/vb/Forests/
   680049.png" -width 400 -height 400 
pack [label .myLabel]
.myLabel configure -image imgobj 

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример изображения

Доступные функции для изображения перечислены ниже в следующей таблице –

Sr.No. Синтаксис и описание
1

изображение удалить imageName

Удаляет изображение из памяти и связанных виджетов визуально.

2

высота изображения imageName

Возвращает высоту для изображения.

3

ширина изображения

Возвращает ширину для изображения.

4

тип изображения imageName

Возвращает тип для изображения.

5

имена изображений

Возвращает список изображений, живущих в памяти.

изображение удалить imageName

Удаляет изображение из памяти и связанных виджетов визуально.

высота изображения imageName

Возвращает высоту для изображения.

ширина изображения

Возвращает ширину для изображения.

тип изображения imageName

Возвращает тип для изображения.

имена изображений

Возвращает список изображений, живущих в памяти.

Простой пример использования вышеуказанных команд графического виджета показан ниже –

#!/usr/bin/wish

image create photo imgobj -file "/Users/rajkumar/images/680049.png"
   -width 400 -height 400 
pack [label .myLabel]
.myLabel configure -image imgobj
puts [image height imgobj]
puts [image width imgobj]
puts [image type imgobj]
puts [image names]
image delete imgobj

Изображение будет удалено визуально и из памяти после выполнения команды «image delete imgobj». В консоли вывод будет выглядеть следующим образом:

400
400
photo
imgobj ::tk::icons::information ::tk::icons::error ::tk::icons::
warning ::tk::icons::question

Tk – События

События в простейшем виде обрабатываются с помощью команд. Простой пример обработки события – обработка события кнопкой и показан ниже:

#!/usr/bin/wish

proc myEvent { } {
   puts "Event triggered"
}
pack [button .myButton1  -text "Button 1"   -command myEvent]

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример события

Простая программа для отображения события задержки текстовой анимации показана ниже –

#!/usr/bin/wish

proc delay {} {
   for {set j 0} {$j < 100000} {incr j} {} 
}

label .myLabel -text "Hello................" -width 25
pack .myLabel
set str "Hello................"
for {set i [string length $str]} {$i > -2} {set i [expr $i-1]} {
   .myLabel configure -text [string range $str 0 $i]
   update
   delay
}

Когда мы запустим программу, мы получим следующий вывод в анимированном виде –

Пример события3

Событие после задержки

Синтаксис для события после задержки показан ниже –

after milliseconds number command

Простая программа для отображения после события задержки показана ниже –

#!/usr/bin/wish

proc addText {} {
   label .myLabel -text "Hello................" -width 25
   pack .myLabel
}
after 1000 addText

Когда мы запустим программу, через одну секунду мы получим следующий вывод:

Пример события2

Вы можете отменить событие, используя команду после отмены, как показано ниже –

#!/usr/bin/wish

proc addText {} {
   label .myLabel -text "Hello................" -width 25
   pack .myLabel
}
after 1000 addText
after cancel addText

Привязка событий

Синтаксис для привязки событий, как показано ниже –

bind arguments 

Пример событий клавиатуры

#!/usr/bin/wish

bind .  {puts "Key Pressed: %K "}

Когда мы запустим программу и нажмем букву X, мы получим следующий вывод:

Key Pressed: X 

Пример событий мыши

#!/usr/bin/wish

bind .  {puts "Button %b Pressed : %x %y "}

Когда мы запустим программу и нажмем левую кнопку мыши, мы получим вывод, подобный следующему:

Button 1 Pressed : 89 90 

Пример привязки событий с помощью кнопки

#!/usr/bin/wish

proc myEvent { } {
   puts "Event triggered"
}
pack [button .myButton1  -text "Button 1"   -command myEvent]
bind .  ".myButton1 invoke"

Когда мы запустим программу и нажмем ввод, мы получим следующий вывод:

Event triggered

Tk – Windows Manager

Диспетчер окон используется для обработки окна верхнего уровня. Это помогает в управлении размером, положением и другими атрибутами окна. В тк. используется для ссылки на главное окно. Синтаксис для оконной команды показан ниже –

wm option window arguments

Список параметров, доступных для команды Tk wm, показан в следующей таблице:

Sr.No. Синтаксис и описание
1

аспект windowName abcd

Пытается сохранить соотношение ширины / высоты между a / b и c / d.

2

Окно геометрииНаименование геометрииПарамы

Используйте, чтобы установить геометрию для окна.

3

имя окна сетки wh dx dy

Устанавливает размер сетки.

4

группа windowName leaderName

leaderName дает лидер группы связанных окон.

5

deiconify windowName

Приводит экран в нормальное состояние, если его свернуть.

6

iconify windowName

Минимизирует окно.

7

состояние windowName

Возвращает текущее состояние окна.

8

снять имя окна

Разбирает окно и удаляет его детали в памяти.

9

iconbitmap windowName изображение

Устанавливает или возвращает растровое изображение значка.

10

iconPhoto windowName image

Устанавливает или возвращает значок фото.

11

команда windowName commandString

Записывает команду запуска в свойстве WM_COMMAND.

12

аргументы протокола windowName

Зарегистрируйте команду для обработки имени запроса протокола, которое может быть WM_DELETE_WINDOW,

WM_SAVE_YOURSELF,

WM_TAKE_FOCUS. Например: протокол wm.

WM_DELETE_WINDOW Выход.

13

minsize windowName size

Определяет минимальный размер окна.

14

maxsize windowName size

Определяет максимальный размер окна.

15

title windowName titleText

Определяет заголовок окна.

16

Атрибуты subOptions

Доступно множество атрибутов, таких как альфа, полный экран и так далее.

аспект windowName abcd

Пытается сохранить соотношение ширины / высоты между a / b и c / d.

Окно геометрииНаименование геометрииПарамы

Используйте, чтобы установить геометрию для окна.

имя окна сетки wh dx dy

Устанавливает размер сетки.

группа windowName leaderName

leaderName дает лидер группы связанных окон.

deiconify windowName

Приводит экран в нормальное состояние, если его свернуть.

iconify windowName

Минимизирует окно.

состояние windowName

Возвращает текущее состояние окна.

снять имя окна

Разбирает окно и удаляет его детали в памяти.

iconbitmap windowName изображение

Устанавливает или возвращает растровое изображение значка.

iconPhoto windowName image

Устанавливает или возвращает значок фото.

команда windowName commandString

Записывает команду запуска в свойстве WM_COMMAND.

аргументы протокола windowName

Зарегистрируйте команду для обработки имени запроса протокола, которое может быть WM_DELETE_WINDOW,

WM_SAVE_YOURSELF,

WM_TAKE_FOCUS. Например: протокол wm.

WM_DELETE_WINDOW Выход.

minsize windowName size

Определяет минимальный размер окна.

maxsize windowName size

Определяет максимальный размер окна.

title windowName titleText

Определяет заголовок окна.

Атрибуты subOptions

Доступно множество атрибутов, таких как альфа, полный экран и так далее.

Некоторые из приведенных выше команд используются в следующем примере:

#!/usr/bin/wish

wm maxsize . 800 800
wm minsize . 300 300
wm title . "Hello"
wm attributes . -alpha ".90" 
wm geometry . 300x200+100+100

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Оконный менеджер

Как видите, альфа является одним из доступных атрибутов. Список часто используемых подкоманд приведен ниже –

Sr.No. Синтаксис и описание
1

альфа-число

Устанавливает альфа для окна.

2

-полный экран номер

Число может быть 0 для обычного экрана или 1 для полного экрана.

3

верхнее число

Устанавливает или возвращает, является ли окно самым верхним. Значение может быть 0 или 1.

альфа-число

Устанавливает альфа для окна.

-полный экран номер

Число может быть 0 для обычного экрана или 1 для полного экрана.

верхнее число

Устанавливает или возвращает, является ли окно самым верхним. Значение может быть 0 или 1.

Создание окна

Мы можем использовать команду toplevel для создания окна, и пример показан ниже –

#!/usr/bin/wish

toplevel .t

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Window Manager2

Разрушающее Окно

Мы можем использовать команду destroy, чтобы уничтожить окно, и пример показан ниже –

#!/usr/bin/wish

destroy .t

Приведенная выше команда уничтожит окно с именем .t .

ТК – менеджер по геометрии

Менеджер геометрии используется для управления геометрией окна и других фреймов. Мы можем использовать его для обработки положения и размера окна и фреймов. Виджеты макета используются для этой цели.

Расположение и размер

Синтаксис окна позиционирования и размеров показан ниже –

wm geometry . wxh+/-x+/-y

Здесь w относится к ширине, а h относится к высоте. За ним следует знак «+» или «-» с номером, следующим за позицией х на экране. Точно так же следующий знак «+» или «-» с номером относится к позиции y на экране.

Простой пример показан ниже для приведенного выше утверждения -.

#!/usr/bin/wish

wm geometry . 300x200+100+100

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Пример GeometryManager1

Сетка Геометрия

Синтаксис для геометрии сетки показан ниже –

grid gridName -column number -row number -columnspan number -rowspan number

Столбец, строка, столбец или строка строк помогает в обеспечении геометрии сетки.

Простой пример показан ниже для приведенного выше утверждения –

#!/usr/bin/wish

frame .myFrame1 -background red  -height 100 -width 100
frame .myFrame2 -background blue -height 100 -width 50
grid .myFrame1 -columnspan 10 -rowspan 10 -sticky w
grid .myFrame2 -column 10 -row 2

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод –

Понравилась статья? Поделить с друзьями:
  • Tbmux32 exe ошибка приложения
  • Tbm error wincor
  • Tbd ошибка ивеко стралис красным
  • Tbd error id 255 ecu address 92 h
  • Tazsia poemme vast error