一、GtkBox及C语言示例
GtkBox是一个容器部件,用于在GTK(GIMP Toolkit)应用程序中水平或垂直地排列多个子部件。以下是一个简单的例子,展示了如何在一个基本的GTK应用程序中使用`GtkBox`来垂直排列两个按钮:
首先,确保你安装了GTK(对于GTK 3或GTK 4,视你所使用的版本而定)。下面的例子将使用GTK 3。
在系统上创建一个名为`gtk_box_example.c`的新文件,并粘贴以下代码作为示例:
#include <gtk/gtk.h>
static void on_activate(GtkApplication* app, gpointer user_data) {
// 创建一个新的窗口
GtkWidget *window = gtk_application_window_new(app);
// 设置窗口标题、边框宽度和默认大小
gtk_window_set_title(GTK_WINDOW(window), "GtkBox Example");
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
// 创建一个垂直箱(GtkBox)
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
// 增加一个展开的盒子,使得按钮可以在底部对齐
GtkWidget *expander = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(vbox), expander, TRUE, TRUE, 0);
// 创建两个按钮
GtkWidget *button1 = gtk_button_new_with_label("Button 1");
GtkWidget *button2 = gtk_button_new_with_label("Button 2");
// 设置两个按钮的大小请求(为窗体的1/10以下)
gtk_widget_set_size_request(button1, 80, 60);
gtk_widget_set_size_request(button2, 80, 60);
// 设置按钮的边缘空间(margin)
gtk_widget_set_margin_end(button1, 20); // 右边距
gtk_widget_set_margin_bottom(button1, 20); // 底边距
gtk_widget_set_margin_end(button2, 20); // 右边距
gtk_widget_set_margin_bottom(button2, 20); // 底边距
// 设置按钮的水平和垂直对齐方式(左下角)
gtk_widget_set_halign(button1, GTK_ALIGN_END);
gtk_widget_set_valign(button1, GTK_ALIGN_END);
gtk_widget_set_halign(button2, GTK_ALIGN_END);
gtk_widget_set_valign(button2, GTK_ALIGN_END);
// 不要让按钮填充箱子剩余的空间,设置expand为FALSE
gtk_box_pack_end(GTK_BOX(vbox), button1, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(vbox), button2, FALSE, FALSE, 0);
// 将垂直箱添加到窗口中
gtk_container_add(GTK_CONTAINER(window), vbox);
// 显示所有部件
gtk_widget_show_all(window);
}
int main(int argc, char *argv[]) {
// 创建一个新的GtkApplication
GtkApplication *app = gtk_application_new("org.example.myapp", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);
// 运行应用程序,将命令行参数传给它
int status = g_application_run(G_APPLICATION(app), argc, argv);
// 清理
g_object_unref(app);
return status;
}
现在,编译这个程序。在终端中,使用以下命令(如果使用的是GTK 4,请替换所有`gtk+-3.0`为`gtk4`):
gcc `pkg-config --cflags gtk+-3.0` -o gtk_box_example gtk_box_example.c `pkg-config --libs gtk+-3.0`
编译成功后,可以直接运行编译出的可执行文件:
./gtk_box_example
当运行这个程序时,应该看到一个窗口出现,窗口中有两个垂直排列的按钮。这段代码创建了一个`GtkApplication`,在激活时设置了一个窗口,并添加了一个`GtkBox`作为容器将两个按钮垂直排列。
`gtk_window_set_default_size()`来设置窗口大小,以及利用`gtk_widget_set_halign()`和`gtk_widget_set_valign()`来设置按钮在`GtkBox`中的对齐方式,并使用`gtk_widget_set_size_request()`来设置按钮的请求大小。
使用了一个分隔器部件(expander)来将按钮推到窗口的底部,并使用`gtk_widget_set_margin_*`函数设置按钮的边距来取消按钮和窗口边缘之间的贴合。在按钮和窗口的右侧以及底部分别设置了20像素的边距。`gtk_widget_set_margin_end`和`gtk_widget_set_margin_bottom`函数分别为按钮设置了右侧和底部的边距,这样按钮就不会直接贴在窗口的边缘上了。另外,使用了`GTK_ALIGN_END`来使按钮靠近窗口的右侧和底部。
创建一个空白的"占位"容器`expander`,它会填充大部分的垂直空间,将按钮定位在窗口的左下角。同时,也调整了两个按钮的大小请求,这样即使窗口再大,按钮的最大大小也不会超过80x60像素。填充部件`expander`添加到`vbox`的开始处。然后创建按钮,并使用`gtk_box_pack_end`加到vbox的末尾。`expander`部件将占据所有剩余的垂直空间,并推动按钮到窗口的底部。窗口大小应该是800x600像素,两个按钮将位于窗口的左下角,并且与窗口边界有一些空间。
每次点击按钮,都会增加到箱子里,因为在这个例子中没有连接任何信号处理函数,所以按钮不会执行任何操作。
请注意,GTK 4中的某些函数和方法可能已经发生了更改,而且本例是基于GTK 3的。如果你使用的是GTK 4,请相应地调整API调用。
二、GtkBox的python示例
下面是将C语言 GTK 示例转换为Python版本,使用PyGObject绑定。这个例子假设已经安装了`PyGObject`和正确版本的GTK+库。
首先,确保安装了`PyGObject`。如果还没有安装,请参考PyGObject的文档了解如何安装。一旦完成安装,可以创建一个名为`gtk_box_example.py`的文件,并粘贴以下代码:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MyApplication(Gtk.Application):
def do_activate(self):
# 创建一个新的窗口
window = Gtk.ApplicationWindow(application=self)
# 设置窗口标题、边框宽度和默认大小
window.set_title("GtkBox Example")
window.set_border_width(10)
window.set_default_size(800, 600)
# 创建一个垂直箱(GtkBox)
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
# 增加一个展开的盒子,使得按钮可以在底部对齐
expander = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
vbox.pack_start(expander, True, True, 0)
# 创建两个按钮
button1 = Gtk.Button(label="Button 1")
button2 = Gtk.Button(label="Button 2")
# 设置两个按钮的大小请求(为窗体的1/10以下)
button1.set_size_request(80, 60)
button2.set_size_request(80, 60)
# 设置按钮的边缘空间(margin)
button1.set_margin_end(20)
button1.set_margin_bottom(20)
button2.set_margin_end(20)
button2.set_margin_bottom(20)
# 设置按钮的水平和垂直对齐方式(右下角)
button1.set_halign(Gtk.Align.END)
button1.set_valign(Gtk.Align.END)
button2.set_halign(Gtk.Align.END)
button2.set_valign(Gtk.Align.END)
# 将按钮放置在箱子的底部,不让它们展开或填充
vbox.pack_end(button1, False, False, 0)
vbox.pack_end(button2, False, False, 0)
# 将垂直箱添加到窗口中
window.add(vbox)
# 显示所有部件
window.show_all()
if __name__ == "__main__":
# 创建一个新的GtkApplication
app = MyApplication()
app.run(None)
确保已经安装了`python3-gi`和`python3-gi-cairo`包以及GTK 3。如果在Gtk.Application.run()中没有特定的命令行参数传递,可以简单地用`None`替代。
要运行这个Python脚本,只需在终端中运行以下命令:
python3 gtk_box_example.py
应该会看到一个包含两个按钮的窗口,这些按钮被放置在窗口的底部右侧,并且它们不会填满窗口的剩余空间。