【发布时间】:2015-08-31 09:40:37
【问题描述】:
我正在使用 Opensuse 13.1 Linux 操作系统。我是 gtk2 和 c 的新手。我正在尝试创建一个应用程序,该应用程序可以在根据用户键入的值附加的表上放置一个按钮。我的程序代码如下
#include <stdlib.h>
#include <gtk/gtk.h>
typedef struct {
GtkWidget *value1, *value2, *value3, *value4;
} entrygrouped;
guint ival1, ival2, ival3, ival4;
void button_clicked(entrygrouped *widget)
{
const gchar *value1, *value2, *value3, *value4;
value1 = gtk_entry_get_text (GTK_ENTRY(widget->value1));
value2 = gtk_entry_get_text (GTK_ENTRY(widget->value2));
value3 = gtk_entry_get_text (GTK_ENTRY(widget->value3));
value4 = gtk_entry_get_text (GTK_ENTRY(widget->value4));
ival1 = (guint)atoi(value1);
ival2 = (guint)atoi(value2);
ival3 = (guint)atoi(value3);
ival4 = (guint)atoi(value4);
g_print("ENTRY VALUES = %s %s %s %s\n", value1, value2, value3, value4);
g_print("ENTRY NUMS = %d %d %d %d\n", ival1, ival2, ival3, ival4);
}
int main (int argc, char *args[])
{
GtkWidget *window, *vbox, *uptable, *downtable, *label;
GtkWidget *button, *button2;
gtk_init(&argc, &args);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_get_resizable(GTK_WINDOW(window));
entrygrouped *eg;
eg = g_slice_new(entrygrouped);
vbox = gtk_vbox_new(FALSE, 2);
uptable = gtk_table_new (3, 4, FALSE);
downtable = gtk_table_new (3, 3, TRUE);
label = gtk_label_new (" Enter the values to position the widget ");
eg->value1 = gtk_entry_new();
eg->value2 = gtk_entry_new();
eg->value3 = gtk_entry_new();
eg->value4 = gtk_entry_new();
button = gtk_button_new_with_label ("Submit");
button2 = gtk_button_new_with_label("BUTTON");
gtk_table_attach_defaults (GTK_TABLE(uptable), label, 0, 3, 0, 1);
gtk_table_attach_defaults (GTK_TABLE(uptable), eg->value1, 0, 1, 1, 2);
gtk_table_attach_defaults (GTK_TABLE(uptable), eg->value2, 1, 2, 1, 2);
gtk_table_attach_defaults (GTK_TABLE(uptable), eg->value3, 0, 1, 2, 3);
gtk_table_attach_defaults (GTK_TABLE(uptable), eg->value4, 1, 2, 2, 3);
gtk_table_attach_defaults (GTK_TABLE(uptable), button, 1, 2, 3, 4);
gtk_widget_queue_draw(GTK_WIDGET(window));
gtk_table_attach_defaults (GTK_TABLE(downtable), button2, ival1, ival2,
ival3, ival4);
gtk_box_pack_start(GTK_BOX(vbox), uptable, 0, 0, 0);
gtk_box_pack_start(GTK_BOX(vbox), downtable, 0, 0, 0);
g_signal_connect_swapped(G_OBJECT(button), "clicked",
G_CALLBACK(button_clicked), eg);
g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_container_add (GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
现在,每当我从终端打开我的应用程序并输入一些值并点击提交按钮时,值就会打印在终端上,但问题是窗口没有使用新分配的值绘制 button2。我不知道任何可以刷新或重绘整个窗口的功能,虽然我试过了
while (gtk_events_pending())
gtk_main_iteration();
在 button2 表格附件上方仍然我窗口什么都不做。 我需要另一个回调函数来调整窗口大小吗?请帮我解决这个问题。
编辑: 如果我的问题不清楚,我想以图形方式显示如下
----------------------------
| a.out _ [ ] x |
---------------------------- before entering the
| -------------------------- | values
|| | ||
| -------------------------- |
|| | ||
| -------------------------- |
| ________ |
| | Submit ||
| -------- |
----------------------------
----------------------------
| a.out _ [ ] x |
---------------------------- after entering the
| -------------------------- | values
|| 0 | 1 ||
| -------------------------- | button2 widget should be
|| 0 | 1 || redrawn according to the
| -------------------------- | values entered and window
| ________ | widget should be updated
| | Submit ||
| -------- |
| _________ |
| | Button | |
| --------- |
----------------------------
【问题讨论】:
-
你有很多问题尝试解决它们。使用“-Wall -Wextra -Werror -Wstrict-prototypes -Wconversion --std=c11 -Og
pkg-config --cflags gtk+-3.0”进行编译以查看它们。 -
感谢 Michi 的评论,但我目前正在 gtk2 上使用此应用程序。很抱歉 gtk3 标签。
-
你想做什么还不清楚。是否要根据在
eg中输入的数字 x、y、w、h 值调整button2的大小?请编辑您的问题以改进它。 -
为什么不使用 GTK3 编写新代码?已知改进了小部件布局代码...
-
您确实需要阅读更多关于 C 编程和 GTK 的内容。那将需要你几个星期的工作。不要指望我们为您的程序编写代码(您应该使用 GTK3)。
标签: c user-interface gtk gtk2