在GTK中创建一个带菜单的窗口,可以通过使用`Gtk.MenuBar`、`Gtk.Menu和
Gtk.MenuItem`组件来构建菜单。以下是一个基本的例子,展示了如何使用Python的`PyGObject`库创建一个简单的带菜单栏的GTK窗口。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MenuExampleWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Menu Example")
self.set_default_size(200, 200)
# Create a vertical box to pack widgets into
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.add(vbox)
# Create a MenuBar and append items
menubar = Gtk.MenuBar()
filemenu = Gtk.Menu()
file_item = Gtk.MenuItem("File")
file_item.set_submenu(filemenu)
# File menu items
new_item = Gtk.MenuItem("New")
filemenu.append(new_item)
open_item = Gtk.MenuItem("Open")
filemenu.append(open_item)
quit_item = Gtk.MenuItem("Quit")
quit_item.connect("activate", Gtk.main_quit)
filemenu.append(quit_item)
# Append the rest of the items to the menubar
menubar.append(file_item)
vbox.pack_start(menubar, False, False, 0)
# Create a label to show the content area (for example purpose)
self.label = Gtk.Label("Hello, this is the content area!")
vbox.pack_start(self.label, True, True, 0)
# Initialize and run the application
win = MenuExampleWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
在这个例子中:
- 我们创建了一个窗口类`MenuExampleWindow`来包含菜单的逻辑。
- 使用`Gtk.MenuBar`, Gtk.Menu, 和 Gtk.MenuItem来创建菜单条和其子菜单项。
- 连接了"Quit"菜单项的"activate"信号到`Gtk.main_quit`函数以便退出程序。
要运行此代码,保证已经安装了Python和PyGObject。在Linux系统上,通常可以使用包管理器来安装PyGObject。例如,在Ubuntu上,可以使用以下命令安装:
sudo apt-get install python3-gi python3-gi-cairo gir1.2-gtk-3.0
在Windows上,可能需要使用MSYS2或其他方式来安装GTK和PyGObject,具体的安装步骤可能会比较复杂,需要下载GTK的编译版本或使用适当的包管理器来安装。
GTK+原本是用C语言开发的,它是一套用于创建图形用户界面(Graphical User Interface, GUI)的多平台工具集,最初由GIMP项目开发,后来成为GNOME桌面环境的一部分。由于GTK+的可移植性和开放性,它已经被绑定到许多其他编程语言中,包括Python、C++、Perl、Ruby等。
使用Python作为创建GTK+窗口的语言有几个好处:
1. 简洁性:Python语法简单明了,使得创建GUI变得更加直观和快速。
2. 开发效率:Python作为一种解释性语言,允许快速迭代和调试,有利于提高开发效率。
3. 广泛的应用:因为Python的普及,很多开发者更倾向于使用Python来快速搭建原型和实现应用程序。
4. 强大的社区支持:Python社区庞大,这意味着在开发过程中遇到问题时容易得到支持。
基于以上原因,许多开发者在开发GTK+应用时选择了Python。PyGObject是Python的一个库,它为GTK+提供了Python绑定,使得Python开发者能够使用纯Python代码创建和运行GTK+应用程序。
但如果需要或偏好在C语言中使用GTK+,完全可以使用C语言来实现。以下是C语言的例子,展示如何创建带有菜单的GTK+窗口:
#include <gtk/gtk.h>
static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *window;
GtkWidget *menubar;
GtkWidget *file_menu;
GtkWidget *file_menu_open;
GtkWidget *file_menu_quit;
GtkWidget *file_menu_item;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Menu Example");
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
// Create a MenuBar and a Menu
menubar = gtk_menu_bar_new();
file_menu = gtk_menu_new();
// Create a file menu and add it to the menubar
file_menu_item = gtk_menu_item_new_with_label("File");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_menu_item), file_menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file_menu_item);
// Add Open & Quit items to the file menu
file_menu_open = gtk_menu_item_new_with_label("Open");
gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), file_menu_open);
file_menu_quit = gtk_menu_item_new_with_label("Quit");
g_signal_connect_swapped(file_menu_quit, "activate", G_CALLBACK(g_application_quit), G_OBJECT(app));
gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), file_menu_quit);
// Assemble everything and show
gtk_container_add(GTK_CONTAINER(window), menubar);
gtk_widget_show_all(window);
}
int main(int argc, char **argv) {
GtkApplication *app;
int status;
app = gtk_application_new("org.example.menubar", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
编译:
gcc `pkg-config --cflags gtk+-3.0` -o gtk_win gtk_win.c `pkg-config --libs gtk+-3.0`
在这个C语言版本的例子中,我们创建一个`GtkApplication`,然后在`activate`回调中构建窗口和菜单。菜单项("Open"和"Quit")被添加到文件菜单中,"Quit"菜单项连接了一个`g_application_quit`信号,当该菜单项被激活时,应用程序将退出。
选择使用哪种语言创建GTK+程序取决于个人或项目需求,每种语言的绑定都提供了基本一致的GTK+功能。
#include <gtk/gtk.h>
// 事件处理函数
static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *window;
GtkWidget *menu_bar;
GtkWidget *menu_item;
GtkWidget *file_menu;
GtkWidget *file_menu_open;
// 创建窗口
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Window with Menu");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
// 创建菜单栏
menu_bar = gtk_menu_bar_new();
menu_item = gtk_menu_item_new_with_label("File");
gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), menu_item);
// 创建'File'菜单的内容
file_menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), file_menu);
// 添加'Open'菜单项
file_menu_open = gtk_menu_item_new_with_label("Open");
gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), file_menu_open);
// 创建盒子,将菜单栏放在上边,其余部分放下边
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 0);
// 添加盒子到窗口
gtk_container_add(GTK_CONTAINER(window), vbox);
// 显示所有窗口组件
gtk_widget_show_all(window);
}
int main(int argc, char **argv) {
GtkApplication *app;
int status;
// 创建GTK应用
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
// 运行应用
status = g_application_run(G_APPLICATION(app), argc, argv);
// 退出应用
g_object_unref(app);
return status;
}
编译:
gcc `pkg-config --cflags gtk+-3.0` -o gtk_menu_app gtk_menu_app.c `pkg-config --libs gtk+-3.0`
pkg-config
?工具用于获取GTK+ 3库的C标志和链接标志。
这将启动GTK窗体程序,显示一个菜单栏位于窗口上方的窗口。其中“File”菜单包含一个“Open”子菜单项。请注意,示例代码中的菜单并没有绑定实际的功能。如果需要让菜单项响应动作,您需要实现相应的回调函数并将其与菜单项的信号关联起来。
https://blog.csdn.net/eidolon_foot/article/details/135330336?spm=1001.2014.3001.5502