tk 0.1.7

Rust bindings for Tk GUI library
This project provides safe and easy to use API bindings to Tcl/Tk commands.

# Features

1. Friendly API for both Rustaceans and Tk programers.

# Quickstart

## A quick glance

```rust
use tk::*;
use tk::cmd::*;

fn main() -> TkResult<()> {
    let tk = make_tk!()?;
    let root = tk.root();
    root.add_label( -text("constructs widgets and layout step by step") )?
        .pack(())?;
    let f = root
        .add_frame(())?
        .pack(())?;
    let _btn = f
        .add_button( "btn" -text("quit") -command("destroy .") )?
        .pack(())?;
    Ok( main_loop() )
}
```

## Another glance

```rust
use tk::*;
use tk::cmd::*;

fn main() -> TkResult<()> {
    let tk = make_tk!()?;
    tk.root().add_widgets(
        -pack( -label( -text("constructs widgets and layout in one expression") ))
        -pack( -frame( -pack( -button( "btn" -text("quit") -command("destroy .") ))))
    )?;
    Ok( main_loop() )
}
```

## The naming conventions in translating Tk commands to Rust bindings

1. Prefix Tk widget constructors with `add_` and put parentheses around option values.

    The Tk command to add a widget looks like `Constructor path -options_and_values`, e.g.

    ```tcl
    label .lb -text "lorem ipsum" -width 50 -height 20
    ```

    The equivalent Rust statement is as follows.

    ```rust_no_run
    let lb = root.add_label( /*".lb"*/ -text("lorem ipsum") -width(50) -height(20) )?;
    ```

2. Converts Tcl's imperative style to Rust's object style

    The Tk command is in the form of "verb noun options", e.g.

    ```tcl
    pack .lb -fill both
    ```

    The equivalent Rust statement is in th form of "object method options", as follows.

    ```rust_no_run
    lb.pack( -fill("both") )?; // use pack(()) without any option.
    ```

3. Converts Tk's space-separated commands to Rust's underscore-separated function names.

    Tk commands are space-separated, e.g.

    ```tcl
    tk fontchooser show
    ```

    The equivalent Rust statement is as follows.

    ```rust_no_run
    tk.fontchooser_show()?;
    ```

    Users can look into the Tk command reference and find the "fontchooser" page then search "show".

4. Distinguish between set and get via the `set_` prefix.

    In Tk, it is common to distinguish set and get by providing or omitting the value argument, e.g.

    `wm title window "Lorem ipsum"` means to set the window's title to "Lorem ipsum",
    while `wm title window` means to get the windows' title.

    The equivalent Rust statements are as follows.

    ```rust_no_run
    window.set_wm_title( "Lorem ipsum" )?;
    window.wm_title()?;
    ```

# Documents

1. [Tk tutorial]https://oooutlk.github.io/tk/

2. [Official Tk command references]https://www.tcl.tk/man/tcl/TkCmd/contents.html

# License

Under Apache License 2.0 or MIT License, at your will.