お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2009-05-12 09:31:34

glade
新しいメンバ
登録日: 2009-05-08

gtkプログラミング

こんにちは

ubuntuで簡単なgtkプログラムを作成する方法を探しています。

菅谷さんの「GTK+/GNOMEによるGUIアプリケーションプログラミング」
を参考にしてgtk/gnome環境でGUIアプリを作成しようと思っています。

しかしredhat系での開発を行っている参考書籍ですので
ubuntuで完全に同じようにできるとはそれほど思っていませんでしたが、
最初のhallo worldのプログラムですら動かすことができませんでした。

テキストファイルに以下のソースのプログラムを打ち込み、hallo_world.cというcソースファイルで保存しました。
#include <gtk/gtk.h>

static void cb_button (GtkWidget *widget , gpointer data) {
g_print ("HelloÃWorld\n");
}

int main (int argc , char *argv[]) {
GtkWidget *window;
GtkWidget *button;

gtk_init (&argc , &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(window) , "HelloÃWorld");
gtk_widget_set_size_request (window , 250 , 80);
gtk_container_set_border_width (GTK_CONTAINER(window) , 10);

button = gtk_button_new_with_label ("HelloÃWorld");
gtk_container_add (GTK_CONTAINER(window) , button);

g_signal_connect (G_OBJECT(window) ,
"destroy" , G_CALLBACK(gtk_main_quit) , NULL);
g_signal_connect (G_OBJECT(button) ,
"clicked" , G_CALLBACK(cb_button) , NULL);

gtk_widget_show_all (window);
gtk_main ();

return 0;
}

このファイルをgccでコンパイルしました。コマンドは、
gcc 'ディレクトリ/hallo_world.c' -o hallo_world 'pgk-config gtk+-2.x --cflags --libs'
です。しかし、コンパイルがまったく通らず困っています。

ubuntuでgtkの簡単なプログラムを作成する方法はないでしょうか?よろしくお願いします。:)

オフライン

 

#2 2009-05-12 11:46:25

avidya
ゲスト

Re: gtkプログラミング

 すいません。参考にされている本ですがいくらなんでも古すぎませんか?他のディストリビューションでも、さらに現在でもその本に書かれたサンプルはコンパイル可能ですか?その本を以前所有していましたが、兵庫県南部地震で失いました。

 

#3 2009-05-12 12:33:28

funatogawa
メンバ
From: 関東
登録日: 2009-02-01

Re: gtkプログラミング

こんにちは

菅谷さんの「GTK+/GNOMEによるGUIアプリケーションプログラミング」
を参考にしてgtk/gnome環境でGUIアプリを作成しようと思っています。

私自身はgtk/GNOME 関係のプログラミングはやったことはありませんが、この本の題名そのもので検索するとたくさんヒットしますね。その中で、http://dolphin2005.blog.so-net.ne.jp/2008-02-12 というURLがありました。参考になればと思います。

オフライン

 

#4 2009-05-12 13:13:40

ack
メンバ
登録日: 2007-06-01

Re: gtkプログラミング

端末からgccという形ではありませんが、IDE環境一式の導入と動作確認が出来る
パターンをご紹介します。

Ubuntu9.04 Japanese Remix CDからインストールしたばかり、の環境で動作を確認しました。

0.
念のためシステム全体のアップデートをしておきます。

1.
anjutaとglade3のインストール

Synapticから anjuta と glade-gnome-3 をインストールします。
もしくは

コード:

sudo apt-get install --install-recommends anjuta glade-gnome-3

とします。
※9.04をインストールしてすぐ、なら依存関係解決時に推奨パッケージが一緒に入るはずですが、万が一のために上記コマンドラインは推奨パッケージ導入を明示しています。

2.
メニューより
アプリケーション>プログラミング>Anjuta IDE
として、Anjutaを起動します。

3.
起動した画面で、プロジェクト をクリックします。次の画面に移ります。

4.
基本的な情報 ダイアログが出ます。
C のタブ(になっていると思います)の中から gtk+ を選択して、進むをクリックします。

5.
プロジェクトのオプション ダイアログが出ます。
今回はプロジェクト名も初期設定の gtk-foobar で、他もそのまま、進むをクリックします。

6.
Summary ダイアログが出ます。適用をクリックします。プロジェクトが生成され3ペインの画面に移ります。

7.
メニューより
実行>プログラムの引数...
として、プログラムの引数ダイアログを出します。

作業フォルダ が gtk-foobar になっている事を確認して 適用 をクリックします。
※本当はやらなくても良いように思えるのですが、これをやっておかないと実行時のパスが指定されないのか実行時に.gladeファイルを見つけてくれません。

8.
ソースを確認します。
3ペインの左上のディレクトリ一覧から src を開いて main.c を探し、ダブルクリックします。
ソースコードエディタに何を使うかダイアログが出ますので、今回は GtkSourceviewエディタ を選んでみます。
この選択内容を記憶する にチェックを入れておくとこの選択がデフォルトになります。
※変更するには 編集>設定>お気に入りのプラグイン タブ

3ペイン右側で、Anjutaが用意したサンプルソースコードが表示されます。

9.
ツールバーの プロジェクトのビルド をクリックします。
プロジェクトの構成 が出ますので、今回は何も変えず 実行 をクリックします。

10.
3ペインの下側にメッセージが流れビルドが進みます。
Completed Successfully
所要時間: ※※秒
と出ればビルドに成功しています。

11.
ツールバーの 実行 をクリックします。
先ほどビルドされた gtk-foobar が実行され、window というタイトルのウィンドウが出ます。
Xボタンでウィンドウを閉じ、プログラムを終了します。
3ペインの下側(gtk-foobar実行用端末になってます)に
Press Enter Key to close this terminal ...
と出ていると思いますので、Enterを押して端末を終了します。


以上です。

追記しました:勘違いしてた1行を削除と文章修正。

最後の編集者: ack (2009-05-12 16:13:40)

オフライン

 

#5 2009-05-12 13:29:53

ack
メンバ
登録日: 2007-06-01

Re: gtkプログラミング

https://forums.ubuntulinux.jp/viewtopic.php?pid=30905#p30905
の続きで、ソースパッケージの tar.gz を作る方法もついでに紹介します。

12.
メニューより
ビルド>Tarballの生成
を行います。

Completed Successfully
所要時間: ※※秒

と出れば、gtk-foobar フォルダの中に gtk-foobar-0.1.tar.gz が出来ています。

これで、*nixソフトウェアで良く見かける形式のソースとMakefile一式のアーカイブが出来ています。
これを展開し、その中に cd して ./configure && make で ビルドされ、./src/gtk-foobar でその場で実行できます。
sudo make install すると /usr/local/bin/gtk-foobar にインストールされ、sudo make uninstall が可能でした。

オフライン

 

#6 2009-05-12 16:42:37

jackalope
メンバ
登録日: 2009-01-01

Re: gtkプログラミング

このファイルをgccでコンパイルしました。コマンドは、
gcc 'ディレクトリ/hallo_world.c' -o hallo_world 'pgk-config gtk+-2.x --cflags --libs'
です。しかし、コンパイルがまったく通らず困っています。

(誤)gcc 'ディレクトリ/hallo_world.c' -o hallo_world 'pgk-config gtk+-2.x --cflags --libs'
                                                               ^ ^^                   ^                   ^ <--ここが原因
(正)`pkg-config gtk+-2.0 --cflags --libs`

オフライン

 

#7 2009-05-12 17:03:12

ack
メンバ
登録日: 2007-06-01

Re: gtkプログラミング

https://forums.ubuntulinux.jp/viewtopic.php?pid=30908#p30908
の続きです。押すと終了する巨大なボタンを1つ作ってみます。

13.
3ペインの左上、ディレクトリ一覧から src を開いて callbacks.c を探し、ダブルクリックします。
右上ペインで callbacks.c が開くのでそのままにしておきます。

14.
ディレクトリ一覧から gtk_foobar.glade を探し、ダブルクリックします。
Open With ダイアログが出ますので Glade インタフェース・デザイナ を選びます。
この選択内容を記憶する にチェックしておくと良いと思います。
Anjutaに組み込まれた形でGladeが動作し、GUI編集画面になり、またメニューバーに Glade の項目が出ます。

15.
メニューバーより、Glade>Associations dialog... を選びます。
エディタ に callbacks.c
Designer に gtk_foobar.glade
が表示されているのを確認して、Associate を押すと Manage associations に登録されます。
念のため 保存 を押して、閉じる を押します。

16.
ウィンドウにボタンを貼り付ける作業を行います。
左上ペインの下部の パレット を押します。
コンテナ の右から2番目、垂直ボックス(マウスカーソル合わせて待つと名前がポップアップします)を
クリックします。
右上ペインへカーソルを持って行き(カーソルが垂直ボックスになります)、クリックすると アイテムの数 をたずねる
ダイアログが出るので、今回は 1 とします。垂直ボックスが貼りつきます。

パレット 内の コントロールと表示 の左上、標準のボタン をクリックします。
右上ペインへカーソルを持って行きクリックするとボタンが貼りつきます。

17.
ボタンが貼りつき、選択されたままになっていると思いますので、
プロパティ を押します(パレットの右隣)。標準ボタンのプロパティ を編集する状態になります。
シグナル タブを出します。
GtkButton の clicked の 行をクリックしてハイライトした後、<ここに入力して下さい> の文字付近をクリックすると
プルダウンメニューが出るので、on_button1_clickedを選びます。
先ほど 15. で callbacks.c と gtk_foobar.glade を結び付けてあるので、自動的に callbacks.c に

コード:

void
on_button1_clicked (GtkButton *self, gpointer user_data)
{

}

と書き込まれます。

18.
押すと終了するボタンにするため、関数内に終了処理を書きます。

コード:

void
on_button1_clicked (GtkButton *self, gpointer user_data)
{
    gtk_main_quit ();
}

と gtk_main_quit (); を書き足します。
※少し上に自動生成された destroy 関数があるので、そこからコピペしました。

19.
プロジェクトをビルドし、実行します。
gtk_foobar が、ボタンを押すと終了するプログラムになったと思います。


gtkでなくlibgladeを使ってしまっておりますが、簡単なプログラムを作成する方法ということで、AnjutaとGladeの基本的な使い方の参考になれば幸いです。

追記しました:誤字修正。

最後の編集者: ack (2009-05-12 17:04:12)

オフライン

 

#8 2009-05-12 20:02:24

hir0
メンバ
登録日: 2008-09-28

Re: gtkプログラミング

コンパイルがまったく通らず困っています。

コード:

$ gcc `pkg-config --cflags gtk+-2.0`   -c -o hello_world.o hello_world.c

$ gcc hello_world.o `pkg-config --libs-only-L gtk+-2.0` `pkg-config --libs-only-l gtk+-2.0` -o hello_world

ubuntuでgtkの簡単なプログラムを作成する方法はないでしょうか?

funatogawaさんの参考URLの情報がavidyaさんとackさんの情報にも通じているのでメジャーで判り易いみたいですね。

オフライン

 

#9 2009-05-12 20:33:04

glade
新しいメンバ
登録日: 2009-05-08

Re: gtkプログラミング

みなさんありがとうございます。おかげさまでアプリを作ることができました。:)

オフライン

 

#10 2009-05-13 13:09:32

ack
メンバ
登録日: 2007-06-01

Re: gtkプログラミング

本題は解決しておりますが、せっかくですのでもう一つ追記します。

Anjuta+Gladeは、他のIDEで見かける「ウィジェットをドロップ可能にするチェックボックス」相当が
見当たらないので、ファイルをドロップ可能にする方法を紹介します。
今回はウィンドウ全体をドロップ対象にします。

1.
https://forums.ubuntulinux.jp/viewtopic.php?pid=30905#p30905
の手順でウィンドウが1枚出てくるだけのプログラムをまずは作ります。

2.
今回はNautilusからのファイルドロップでファイル名リストを取得できるようにします。
main.c の

コード:

〜略〜
#include "callbacks.h"

/* For testing propose use the local (not installed) glade file */
/* #define GLADE_FILE PACKAGE_DATA_DIR"/gtk_foobar/glade/gtk_foobar.glade" */
#define GLADE_FILE "src/gtk_foobar.glade"

GtkWidget*
create_window (void)
{
〜略〜


コード:

#include "callbacks.h"

/* For testing propose use the local (not installed) glade file */
/* #define GLADE_FILE PACKAGE_DATA_DIR"/gtk_foobar/glade/gtk_foobar.glade" */
#define GLADE_FILE "src/gtk_foobar.glade"

static GtkTargetEntry targets[] = {
    { "text/uri-list", 0, 0 },
};
    
GtkWidget*
create_window (void)
{
    GtkWidget *window;
    GladeXML *gxml;

と3行書き足します。URI形式ファイル名リストを入れる targets を作りました。

3.
同じくmain.c

コード:

    window = create_window ();
    gtk_widget_show (window);

    gtk_main ();


コード:

    window = create_window ();
    gtk_widget_show (window);

    gtk_drag_dest_set (window, GTK_DEST_DEFAULT_ALL, targets, 1, GDK_ACTION_COPY);

    gtk_main ();

と、gtk_drag_dest_set を使ってウィジェット(今回はウィンドウ丸ごと全体の window)をドロップ対象にします。

4.
https://forums.ubuntulinux.jp/viewtopic.php?pid=30911#p30911
を参考に main.c と callbacks.cを結んでおき、window のシグナルに on_window_drag_data_received を設定、
callbacks.cに自動的に書き足された on_window_drag_data_received に処理を書きます。
今回はfunatogawaさんご紹介サイトの
http://dolphin2005.blog.so-net.ne.jp/archive/20080309
を参考に、端末にドロップしたファイル名を出力します。

コード:

void
on_window_drag_data_received (GtkWindow *self, GdkDragContext *arg0, gint arg1, gint arg2, GtkSelectionData *arg3, guint arg4, guint arg5, gpointer user_data)
{
    gchar **filenames, **top;
    gchar *fname;
    guint i;
    
    filenames = g_uri_list_extract_uris(arg3->data);
    top = filenames;

    for (i=0, top=filenames; *top; i++, top++) {
        fname = g_filename_from_uri (*top, NULL, NULL);
        g_print ("%s\n", fname);
        g_free(fname);
    }

    g_strfreev(filenames);
}

5.
ビルドして実行、Nautilusからウィンドウにファイルをドロップし、Anjutaの下ペイン端末にファイルやディレクトリ名が出力されていくのを確認します。


こうして得られたファイル名を、system()などを使って各種コマンドに渡し、そのファイルを処理してもらうことで
例えばffmpegに渡せば、Windowsの「携帯動画変換君」の10歩手前のようなアプリにする事が出来ます。
※上記例に加えて最低限ドロップされるファイルの種別判定などはしたいところですし、そもそもコマンドのラッパーを作るのにCでなくとも構わないとは思いますが。

追記しました:文章の細かな修正。

最後の編集者: ack (2009-05-13 13:20:25)

オフライン

 

#11 2010-04-19 19:26:28

のんき
メンバ
登録日: 2007-03-04

Re: gtkプログラミング

先日より GTK2 の勉強を始めまいた。
anjuta + glade3 をメインに頑張っていこうと考えております。

anjutaの使用説明がなかなかないのでここのこのフォーラムは多いに参考になります。

ackさん による投稿:

Synapticから anjuta と glade-gnome-3 をインストールします。

ackさんの説明文を参考にanjutaを使い始めたのですが早くも(14)でつまづいてしまいました。
(14)の説明ではfoobar.gladeがディレクトリ内に存在していることになっていますが手元のPCでは
見当たりません。glade3の使用方法を検索して理解した範囲ではfoobar.uiがこれにあたり、
これを取り扱うことにより出来るようだということでした。
具体的にfoobar.gladeとfoobar.uiの違いがわからず(14)以降を同じようにやれば出来るのかが
分かりません。
お手数ですがご指導よろしくお願いします。

オフライン

 

#12 2010-04-19 20:43:02

ack
メンバ
登録日: 2007-06-01

Re: gtkプログラミング

とりあえずfoobar.gladeをfoobar.uiに読み替えて同じように進められます。
※今日の時点での10.04で確認しました。

foobar.glade の時は libglade、foobar.ui では GtkBuilderと、それぞれ使われる仕組み(ライブラリ?フレームワーク?もっとも適切な表現がわかりません)が
違うのですが、両方ともgladeの出力したファイルを元にGUIを組み立てます(その処理はmain.cに書かれています)。

オフライン

 

#13 2010-04-19 21:43:54

のんき
メンバ
登録日: 2007-03-04

Re: gtkプログラミング

ackさん、お手数をお掛けしました。
私でもなんとか動作せることが出来ました。 
頑張って勉強に励みます。 ありがとうございました。

オフライン

 

Board footer

Powered by FluxBB