# PHP GTK 中的小部件

> 原文： [http://zetcode.com/gui/phpgtktutorial/widgets/](http://zetcode.com/gui/phpgtktutorial/widgets/)

在 PHP GTK 编程教程的这一部分中，我们将介绍一些小部件。

小部件是 GUI 应用的基本构建块。 多年来，几个小部件已成为所有 OS 平台上所有工具包中的标准。 例如，按钮，复选框或滚动条。 GTK 工具箱的理念是将小部件的数量保持在最低水平。 将创建更多专门的窗口小部件作为定制 GTK 窗口小部件。

## `GtkCheckButton`

`GtkCheckButton`是具有两种状态的窗口小部件：开和关。 接通状态通过复选标记显示。 它用来表示一些布尔属性。

```php
<?php

/* 
ZetCode PHP GTK tutorial

This program toggles the title of the
window with the GtkCheckButton widget.

author: Jan Bodnar
website: www.zetcode.com
last modified: August 2011
*/

class Example extends GtkWindow { 

    public function __construct() { 

        parent::__construct(); 

        $this->init_ui();

    } 

    private function init_ui() {

        $this->set_title('Check button');         
        $this->connect_simple('destroy', array('gtk', 'main_quit')); 

        $fixed = new GtkFixed();
        $this->add($fixed);

        $cb = new GtkCheckButton("Show title");
        $cb->set_active(true);
        $cb->connect('clicked', array($this, 'on_clicked'));
        $fixed->put($cb, 50, 50);     

        $this->set_default_size(250, 200); 
        $this->set_position(GTK::WIN_POS_CENTER);
        $this->show_all();         
    }

    public function on_clicked($sender) {

        if ($sender->get_active()) {
            $this->set_title("Check button");
        } else {
            $this->set_title("");
        }         
    }
} 

new Example(); 
Gtk::main();

?>

```

根据`GtkCheckButton`的状态，我们将在窗口的标题栏中显示标题。

```php
$cb = new GtkCheckButton("Show title");

```

`GtkCheckButton`小部件已创建。 小部件的构造函数采用一个参数，即标签。 标签显示在复选框旁边。

```php
$cb->set_active(true);

```

默认情况下标题是可见的，因此我们默认情况下选中复选按钮。

```php
$cb->connect('clicked', array($this, 'on_clicked'));

```

如果我们单击复选框小部件，则会发出单击的信号。 我们将`on_clicked()`方法挂接到信号上。

```php
if ($sender->get_active()) {
    $this->set_title("Check button");
} else {
    $this->set_title("");
}     

```

如果选中该按钮，我们将显示标题。 `get_active()`方法用于确定检查按钮的状态。 `set_title()`方法用于设置窗口的标题。 为了清除窗口的标题，我们使用一个空字符串。

![GtkCheckButton](img/78f8f2ff027cfbf7c1b06a54c183c5ae.jpg)

图：`GtkCheckButton`

## `GtkLabel`

`GtkLabel`小部件显示文本。 此小部件不支持用户交互。

```php
<?php

/* 
ZetCode PHP GTK tutorial

In this example, we show a text on the
window. For this, we use the GtkLabel widget.

author: Jan Bodnar
website: www.zetcode.com
last modified: August 2011
*/

class Example extends GtkWindow { 

    public function __construct() { 

        parent::__construct(); 

        $this->init_ui();
    } 

    private function init_ui() {

        // no trailing white space!
        $lyrics = <<<LYRICS
Meet you downstairs in the bar and heard
your rolled up sleeves and your skull t-shirt
You say why did you do it with him today?
and sniff me out like I was Tanqueray

cause you're my fella, my guy
hand me your stella and fly
by the time I'm out the door
you tear men down like Roger Moore

I cheated myself
like I knew I would
I told ya, I was trouble
you know that I'm no good
LYRICS;

        $this->set_title('GtkLabel');         
        $this->connect_simple('destroy', array('gtk', 'main_quit')); 

        $this->set_border_width(10);
        $label = new GtkLabel($lyrics);
        $this->add($label);

        $this->set_default_size(250, 200); 
        $this->set_position(GTK::WIN_POS_CENTER);
        $this->show_all();         
    }
} 

new Example(); 
Gtk::main();

?>

```

该代码示例在窗口上显示了一些歌词。

```php
    // no trailing white space!
    $lyrics = <<<LYRICS
Meet you downstairs in the bar and heard
your rolled up sleeves and your skull t-shirt

```

我们创建多行文本。 在 PHP 中，可以使用 Heredoc 语法创建多行文本。

```php
$this->set_border_width(10);

```

`GtkLabel`周围有一些空白。

```php
$label = new GtkLabel($lyrics);
$this->add($label);

```

`GtkLabel`小部件已创建并添加到窗口。

![GtkLabel Widget](img/0ce0c65d72752c68077599b97c33979a.jpg)

图：`GtkLabel`小部件

## `GtkEntry`

`GtkEntry`是单行文本输入字段。 该小部件用于输入文本数据。

```php
<?php

/* 
ZetCode PHP GTK tutorial

This example demonstrates the GtkEntry widget.

author: Jan Bodnar
website: www.zetcode.com
last modified: August 2011
*/

class Example extends GtkWindow { 

    private $label;

    public function __construct() { 

        parent::__construct(); 

        $this->init_ui();

    } 

    private function init_ui() {

        $this->set_title('GtkEntry');         
        $this->connect_simple('destroy', array('gtk', 'main_quit')); 

        $fixed = new GtkFixed();              

        $this->label = new GtkLabel("...");
        $fixed->put($this->label, 60, 40);

        $entry = new GtkEntry();
        $fixed->put($entry, 60, 100);
        $entry->connect('key_release_event', array($this, 'on_key_release'));

        $this->add($fixed); 

        $this->set_default_size(250, 200); 
        $this->set_position(GTK::WIN_POS_CENTER);
        $this->show_all();         
    }

    public function on_key_release($sender, $event) {

        $this->label->set_text($sender->get_text());
    }
} 

new Example(); 
Gtk::main();

?>

```

此示例显示了条目小部件和标签。 我们输入的文本将立即显示在标签小部件中。

```php
$entry = new GtkEntry();

```

`GtkEntry`小部件已创建。

```php
$entry->connect('key_release_event', array($this, 'on_key_release'));

```

我们将`on_key_release()`方法插入`GtkEntry`小部件的`key_release_event`。

```php
public function on_key_release($sender, $event) {

    $this->label->set_text($sender->get_text());
}

```

在该方法内部，我们通过`get_text()`方法从`GtkEntry`小部件中获取文本，并使用标签的`set_text()`方法将其设置为标签。

![GtkEntry Widget](img/29331b161d6e51f0dd1da5b58d77585c.jpg)

图：`GtkEntry`小部件

## `GtkImage`

`GtkImage`小部件显示图像。

```php
<?php

/* 
ZetCode PHP GTK tutorial

This example demonstrates the GtkImage widget.

author: Jan Bodnar
website: www.zetcode.com
last modified: August 2011
*/

class Example extends GtkWindow { 

    public function __construct() { 

        parent::__construct(); 

        $this->init_ui();

    } 

    private function init_ui() {

        $this->set_title('Red Rock');         
        $this->connect_simple('destroy', array('gtk', 'main_quit')); 

        $this->set_border_width(2);
        $image = GtkImage::new_from_file("redrock.png");                        
        $this->add($image);

        $this->set_default_size(250, 200); 
        $this->set_position(GTK::WIN_POS_CENTER);
        $this->show_all();         
    }
} 

new Example(); 
Gtk::main();

?>

```

在我们的示例中，我们在窗口上显示图像。

```php
$this->set_border_width(2);

```

我们在图像周围放置了一些空边框。

```php
$image = GtkImage::new_from_file("redrock.png");

```

`GtkImage`小部件已创建。 我们使用静态`new_from_file()`方法从文件加载图像。 如果找不到或无法加载文件，则生成的`GtkImage`将显示损坏的图像图标。

```php
$this->add($image);

```

窗口小部件已添加到容器中。

## `GtkComboBox`

`ComboBox`是一个小部件，允许用户从选项列表中进行选择。

```php

<?php

/* 
ZetCode PHP GTK tutorial

This example demonstrates the GtkComboBox widget

author: Jan Bodnar
website: www.zetcode.com
last modified: August 2011
*/

class Example extends GtkWindow { 

    private $label;

    public function __construct() { 

        parent::__construct(); 

        $this->init_ui();

    } 

    private function init_ui() {

        $this->set_title('GtkComboBox');         
        $this->connect_simple('destroy', array('gtk', 'main_quit')); 

        $fixed = new GtkFixed();
        $this->label = new GtkLabel('-');
        $fixed->put($this->label, 50, 140);

        $cb = GtkComboBox::new_text();
        $cb->connect('changed', array($this, 'on_changed'));

        $cb->append_text('Ubuntu');
        $cb->append_text('Mandriva');
        $cb->append_text('Redhat');
        $cb->append_text('Gentoo');
        $cb->append_text('Mint');

        $fixed->put($cb, 50, 30);

        $this->add($fixed);

        $this->set_default_size(250, 200); 
        $this->set_position(GTK::WIN_POS_CENTER);
        $this->show_all();         
    }

    public function on_changed($sender) {
        $this->label->set_label($sender->get_active_text());
    }
} 

new Example(); 
Gtk::main();

?>

```

该示例显示了一个组合框和一个标签。 组合框具有五个选项的列表。 这些是 Linux 发行版的名称。 标签窗口小部件显示了从组合框中选择的选项。

```php
$cb = GtkComboBox::new_text();

```

`GtkComboBox`小部件已创建。 `new_text()`是创建仅显示字符串的`GtkComboBox`的方法。

```php
$cb->append_text('Ubuntu');
$cb->append_text('Mandriva');
$cb->append_text('Redhat');
$cb->append_text('Gentoo');
$cb->append_text('Mint');

```

它充满了数据。

```php
public function on_changed($sender) {
    $this->label->set_label($sender->get_active_text());
}

```

在`on_changed()`方法内部，我们从组合框中获取选定的文本并将其设置为标签。

![GtkComboBox](img/6e0701c2c59c3f70ea195e493c9c12d6.jpg)

图：`GtkComboBox`

在 PHP GTK 教程的这一章中，我们展示了一些基本的小部件。