glade 编程问题:file chooser dialog 获取的文件名如何在窗口里的entry构件中显示

debian 開發版,這個版面主要是要討論 debian@taiwan or debian@chinese 相關開發議題,所謂開發如 debian 中文化問題、文件製作維護問題、程式開發問題...最終目的是能從這個版面的討論成立一個接一個的工作小組來幫助 debian@taiwan or debian@chinese 發展,讓 taiwan 或華人能更方便的使用 debian。

glade 编程问题:file chooser dialog 获取的文件名如何在窗口里的entry构件中显示

文章chinajz » 週五 1月 20, 2006 3:16 pm

问题:file chooser dialog 获取的文件名在控制台中能正常显示,但不能在文本框中设置和显示。因为file chooser dialog要重新建立窗口,用file chooser dialog的事件信号似乎不能用 lookup_widget 对原窗口的entry构件操作。提示如下:

your get filename is :/etc/dhcpd.conf

** (dhcpsetup:29427): WARNING **: Widget not found: entry1

(dhcpsetup:29427): Gtk-CRITICAL **: file gtkentry.c: line 3716 (gtk_entry_set_text): assertion `GTK_IS_ENTRY (entry)' failed


由于才做linux下编程,请教:有什么方法能在原窗口中记录file chooser dialog的文件名。或请推荐一个类似的C语言应用程式的源码。谢谢!

以下为简化说明:
新建窗口
window1
包含构件
button1(浏览)/*用于获取文件名*/
entry1 /*用于显示获取的文件名*/
建立一个文件选择对话框
filechooserdialog1
包含:cancel (button2)和 open(button3) 两个事件信号

callbacks.h 和callbacks.c如下:
callbacks.h

代碼: 選擇全部
#include <gnome.h>

gchar *filename; /*用于存放获取文件名*/

GtkWidget *window1;/*这里没有再定义一个新窗口,测试表明和定义新窗口效果一样*/
/*以下为自动生成*/
void
on_button1_clicked (GtkButton *button,
gpointer user_data);


void
on_button2_clicked (GtkButton *button,
gpointer user_data);
void
on_button3_clicked (GtkButton *button,
gpointer user_data);


callbacks.c :
代碼: 選擇全部
void
on_button1_clicked (GtkButton *button,
gpointer user_data)
{

window1 = create_filechooserdialog1 ();
gtk_widget_show (window1);

}

void
on_button2_clicked (GtkButton *button,
gpointer user_data)
{
gtk_widget_destroy (window1);
}

void
on_button3_clicked (GtkButton *button,
gpointer user_data)
{


filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER
(window1));
g_print ("your get filename is %s\n",filename);
GtkWidget *entry1 = lookup_widget (GTK_WIDGET(button), "entry1");
gtk_entry_set_text (GTK_ENTRY (entry1), filename);
gtk_widget_destroy (window1);

}
相识是缘
chinajz
可愛的小學生
可愛的小學生
 
文章: 20
註冊時間: 週四 3月 24, 2005 12:37 am
來自: 江苏,盐城

文章PCMan » 週五 1月 20, 2006 9:34 pm

請查詢 GTK+ 文件 GtkFileChooserDialog 一單元
有完整的範例可參考
這個直接用 gtk_file_chooser_dialog_new 來就好,不必用上 Glade
PCMan
榮譽學長
榮譽學長
 
文章: 217
註冊時間: 週六 7月 02, 2005 10:46 am

在回调函数中直接建file chooser dialog构件,实现对主窗口entry构件设置

文章chinajz » 週六 1月 21, 2006 1:18 pm

感谢PCMan朋友!使我的问题解决了。
很显然,lookup_widget ()函数只能对默认窗口中的构件操作,而不能对另一个窗口中的构件进行操作。我发贴的目的是想找出对另个窗口的构件操作方法。我试着在回调函数中写,果然就实现了这功能。
如果有对另个窗口的构件操作方法,恳请赐教!
代码如下:
callbacks.c
代碼: 選擇全部
void
on_button1_clicked                    (GtkButton       *button,
                                        gpointer         user_data)
{
   
   GtkWidget *dialog;
   GtkWidget *entry1 = lookup_widget (GTK_WIDGET(button), "entry1");
   dialog = gtk_file_chooser_dialog_new ("Open File",
                  window1,
                  GTK_FILE_CHOOSER_ACTION_OPEN,
                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                  GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
                  NULL);

if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
  {
   
   filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));

   gtk_entry_set_text (GTK_ENTRY (entry1), filename);
   
  }

   gtk_widget_destroy (dialog);

}
最後由 chinajz 於 週六 1月 21, 2006 4:23 pm 編輯,總共編輯了 2 次。
相识是缘
chinajz
可愛的小學生
可愛的小學生
 
文章: 20
註冊時間: 週四 3月 24, 2005 12:37 am
來自: 江苏,盐城

文章PCMan » 週六 1月 21, 2006 1:44 pm

lookup_widget 可以找出整個 Widget tree 中任何 widget
不管你傳入的是什麼 widget,他會從該 widget 所屬的 tree
最上層的 top window 開始找起
前提是:該 widget 是 Glade 產生
另一個作法:採用 libglade

而看你的需求,你要的東西或許 GtkFileChooserButton 也能做到
PCMan
榮譽學長
榮譽學長
 
文章: 217
註冊時間: 週六 7月 02, 2005 10:46 am

文章chinajz » 週六 1月 21, 2006 2:58 pm

在glade中作file chooser dialog,在直接调用file chooser dialog窗口时,可以对原窗口中的label,entry构件操作,但这时还没读出文件目录,但对file chooser dialog中的事件信号中用:
gtk_window_set_transient_for ()、gtk_window_activate_focus ()等函数我都未能实现。可能是我还不熟练。
但回调函数中写的file chooser dialog,其事件信号能对原窗口中的label,entry,memu等许多构件进行设置和操作。
我用的是anjuta+glade编程环境。
在回调函数中对原窗口中构件操作除了用lookup_widget(),还没学到其它方法。
由于才学gtk编程,请多指教,谢谢。
相识是缘
chinajz
可愛的小學生
可愛的小學生
 
文章: 20
註冊時間: 週四 3月 24, 2005 12:37 am
來自: 江苏,盐城

Re: 在回调函数中直接建file chooser dialog构件,实现对主窗口entry构件设置

文章訪客 » 週五 9月 08, 2006 4:07 am

[quote="chinajz"]感谢PCMan朋友!使我的问题解决了。
很显然,lookup_widget ()函数只能对默认窗口中的构件操作,而不能对另一个窗口中的构件进行操作。我发贴的目的是想找出对另个窗口的构件操作方法。我试着在回调函数中写,果然就实现了这功能。
如果有对另个窗口的构件操作方法,恳请赐教!
代码如下:
callbacks.c
[code]
void
on_button1_clicked (GtkButton *button,
gpointer user_data)
{

GtkWidget *dialog;
GtkWidget *entry1 = lookup_widget (GTK_WIDGET(button), "entry1");
dialog = gtk_file_chooser_dialog_new ("Open File",
window1,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
NULL);

if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{

filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));

gtk_entry_set_text (GTK_ENTRY (entry1), filename);

}

gtk_widget_destroy (dialog);

}
[/code][/quote]
訪客
 


回到 debian develop

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客