GTK+プログラミング
threadやmutex関係もgtk_の方は廃止になって、g_の方のみになった。3。0あたりから 基本的な関数はglibに集約して、ツールキット的な関数のみgtk 3で担当するように住み分けされた コンパイルの最中に廃止された関数と表示がでるソースは、いずれソースを書き換えないとビルド不能になる ちなみに最も基本的なlibcでも現在開発ラインの最新版だとgetsが本当にソースから廃止されてるので、getsが使われてるソースをビルドできなくなってる フォントサイズって10.5ptとか小数点で設定できる? フォントサイズの指定方法がわかってて 小数点の指定ができるかって疑問なら やってみて自分で確認すりゃいいのに。 Gtk.TreeView.Selection.Mode = Gtk.SelectionMode.Multiple; に変更すると得られるGtk.TreeIterがおかしくなってしまう のですが、Multipleの時はSelection.GetSelectedは使えない のでしょうか? Gtk.Label page_label = new Gtk.Label (title); page_label.KeyReleaseEvent += delegate { Console.WriteLine("!"); //←呼び出されない理由を説明してほしい! }; GTKは親切ではないなーと楽をしてきただけに思いますw >>735 ありがとうございます しかし、それらしいのが見つかりません GTKのGUIは更新をサボる癖があるようですが 無理やり更新させる方法はないでしょうか? Gtk-CRITICAL **: IA__gtk_main_quit: assertion `main_loops != NULL' failed メインループ内でGtk.Application.Quit ();を呼ぶなって事だろうけど 終了させる方法はないのでしょうか? gtk_main_quit()のソースコードを読めば解決。 >>739 launcher みたいの作ろうとしてるんだろうか… いまいちどういうことなのか判らないんだけど logメッセージを抑制したいなら glib 2.32から http://www.mail-archive.com/geany-devel@uvena.de/msg06039.html G_LOG_LEVEL_CRITICAL log level for critical messages, see g_critical(). This level is also used for messages produced by g_return_if_fail() and g_return_val_if_fail(). ある程度デフォルトだと出力されなくなるみたい onにするときは環境変数G_MESSAGES_DEBUG=allで以前と同じ動作になるらしい from gi.repository import Gtk このスレ的にはGTKのものをそのまま叩くっていうのは危険なこと? え?ラッパーライブラリを介さず直接コールするって意味じゃないの? UbuntuでPyGTKを利用してアプリケーションを作っているのですが、一部パーミッションが与えられていないファイルへの書き込みを行いたいと考えております。 Ubuntu Software Centerからアプリケーションをインストールしようとすると、Authenticateというポップアップが出てきてパスワードを入力するとsudoの様にアプリケーションのインストールができますが、これはどのように実現しているのでしょうか? 自分でも書き込めるようにパーミッションを変更していることを前提にしているのですが、変更方法を知らない人や、一々変更した後にアプリケーションを起動するのが煩わしい人向けに、アプリケーションからsudoのようなことができないかと考えております。 >>751 pyは使えないのですが、この話はGTKのスレの質問でしょうかね? Cだったらstatとchmod使うところじゃないかと。 >>751 もしかして:gksu $ sudo command のかわりに $ gksu command ってやると GUIでパスワード聞かれる 口下手な>>753 は、gksuを参考にlibgksuを使えと言いたいんだな? libgksuのpythonバインディングもあるから安心だって言いたいんだよな? 質問させてください。 gtkmm2.4ベースでプログラムをいじっているのですが、画面操作せずにGtk::Dialogを閉じる方法が分かりません Dialog作成→threadで特定の処理を開始→処理終了→※Dialogを閉じる(画面操作せずに) と言う流れをプログレス表示などをして処理したいのですがrunした後にresponseをしてもhideしてもDialogが消えません 根本的に分かっていないのでしょうが・・・上記のような処理をするにはどうしたら良いのでしょうか? こう書く方法ないかな? public class Window :Gtk.Window{ } vala優秀そうだね でもwindowsでも使いまわしたいのでmonoから外れたくない >>760 valaはwindowsでも普通に使える。 Gtk::Dialogはon_delete_eventを呼ばないのですか? 処理が途中の場合とかにダイアログを閉じるのを中止したいのですが、何処で中止させたらいいのやら ちょっとチャレンジしてみることにしました FreeBasic導入したら、GTK+とCairoが入っていたので。 ネットとサンプルを参考にしながら、 ちょこちょこと弄ってみます。 お手軽に描写の綺麗なプログラムが書けるってことは素晴らしい。 結局add_buttonで追加したボタンを使うのではなく、アクションエリアに普通のボタンを追加し、 connectしたメソッドで処理チェックを行なった後にresponseでIDを投げる事で一応動きは出来たみたいです。 もっと簡単な方法はないですか? ちょっとスレチになるかもなんですけど、GTK使われたアプリをWindowsで自動操作したいのですが WM_LBUTTONDOWNなどで座標を直接指定でやってるんですけどMenuBar以外が反応してくれないです どうすればいいでしょうか? Macで日本語入力が可能になりそう!Windows爆死www Linux憤死wwwwwwwwwwwwwwwww http://engawa.2ch.net/test/read.cgi/poverty/1368116873/ FreeWnn スレッドより: http://toro.2ch.net/test/read.cgi/unix/1084551838/l50 457 :名無しさん@お腹いっぱい。:2012/07/05(木) NY:AN:NY.AN gtk2アプリにkinput2で入力する場合に、kinput2のステータス表示の「[あ]」が 真っ黒になってしまう問題の解決法の俺様メモ。 gtk2のソースの、modules/input/gtkimcontextxim.cの on_status_window_expose_event()関数が変更されたのが原因。 これを、gtk+-2.21.5(以前)のソースのgtkimcontextxim.cに戻せば桶。 modules/input以下のサブディレクトリだけmakeして、 できたim-xim.soだけ置き換えればよい。 ソースにバグありとみた。 http://www.tarnyko.net/en/ ここでWindows版のBroadway実行環境を配布してたから試してみたけど 遅くて使いものにならん… asm.jsは良い感じなんで、GTK+アプリをそのままasm.jsにコンパイルして ブラウザで実行出来るようにしてくれたら最高だがな。 同一アプリ上で、IconViewからFrameとかImageへDrag & Dropって 可能なんでしょうか・・・。 そんな感じのサンプルをご存知でしたら教えてくださいm(_ _)m すみません、>>769 は出来るようになりました。 drop側の設定に問題がありました。 ところで、Imageから別のImageへのDrag & Dropは可能なんでしょうか。 Dragしても、IconViewの時のようにカーソルが変化しません・・・。 gtkmmでProgressBarの描画更新はどうやったらええねん set_fractionしても途中を描画してくれない >>772 それアクティビティモードというのと違う? ナイトライダーをしたいわけではないんよ・・・ >>771 ,773 set_fraction() で、その都度増分を変えて、すぐ更新したいってこと? queue_draw() で、PrograssBar の on_draw イベントを呼んでみたら? >>774 はい、その通りです。お付き合い頂き有り難う御座います。 queue_draw()を試してみましたが、表示のされ方は変わりませんでした。 試したコードを貼り付けようとしたのですが、行数の制限で書けませんでしたので、部分的に書き込みます。 ググって見ているのですが・・・何かお気づきの点がありましたらよろしくお願い致します。 プログレスバーとボタンを配置し、ボタンが押された時に動くようにしました。 drawBtn.signal_clicked().connect( sigc::mem_fun( *this, &ProgressWindow::on_draw_prog ) ); void ProgressWindow::on_draw_prog() { progBar.set_fraction( 0.0 ); for( int i=0; i<100; i++ ) { progBar.set_fraction( (double)i/100.0 ); // progBar.queue_draw(); sleep( 1 ); } progBar.set_fraction( progBar.get_fraction() + 0.01 ); } おそくなってゴメン、こんな感じでどうでしょう? ttp://www.dotup.org/uploda/www.dotup.org5080741.gz.html >>772 であげたチュートリアルのコードをいじったものです。 SpinButton の値を 0 から 100 (%)までの任意の値に変更して "Update" ボタンを押すと ProgressBar の状態が変化します。 examplewindow.cc の on_button_update を見れば分かるかと思います。 >>776 コードまで書いて頂き有り難う御座います。 コンパイルして動作を見ましたら、進捗状況の変化を確認できました。 しかしながらon_button_update内で下記コードのようなループを回しset_fractionするようにしてみましたら 相変わらず最後の表示だけするようです。実際の処理ではループを回して進捗状況をset_fractionします。 む〜もう少しネットをあさってみます。 void ExampleWindow::on_button_update() { m_ProgressBar.set_fraction( 0.0 ); for( int i=0; i<100; i++ ) { m_ProgressBar.set_fraction( (double)i/100.0 ); m_ProgressBar.queue_draw(); sleep( 1 ); } } なんかそれっぽい動きになったけどこれでいいのかね・・・イベント強制執行みたいな [変更前] m_ProgressBar.queue_draw(); sleep( 1 ); [変更後] usleep( 50000 ); while( Gtk::Main::events_pending() ) Gtk::Main::iteration( true ); タイマーか〜処理がスパゲッティーになりかけているから使いづらいんだよね アクティビティモードの時は使いやすそう。 今少し弄っているんだけど、set_pulse_stepでステップ量設定しても反映されないな ComboBoxでドロップダウンアイテムを選択した時に発生する イベントってなに? 本当は先にこっちへ書くべきだった。 gtk_mode gtk_fashion gtk_style gtk_pattern みなさん、人工言語の 高級低級の長所短所のチンチンはご存知? 技術系スレには自分で人口無能を作っちゃう人もいるからな。 >>786 が人間とは限らないよ すみませんが質問させてください gtkmmでボタンを作りボタンを押された時にソケットで通信しようとしたのですが select関数をした時に「リソースが一時的に利用できません」と出てしまい動きません コンストラクタでselect関数を使うと動くのですが・・・ gtkmmに通信を阻害する要因とか有るのでしょうか? 学校の課題でシューティングゲーム作ってるんですが、cairoで表示した複数の画像の手前、奥の位置関係を変えることってできますか? 昨日からC+GTKでプログラム作ってるんだけど質問。treeviewでリスト表示してる状態で、キー入力すると、 なんか入力ボックスが開いて入力させるんだけど、これを止めさせる方法がわからない 表示だけさせたいんで、編集できるかも?って感触を持たせたくない エラー表示させる積りはないけど、無視したい 多分、単純な事なんだろうけど... >>794 既に解決してるかもしれないけど GtkTreeViewのプロパティにある「検索可能」フラグをOffにすればよいみたい g++ (GCC) 6.3.1 20170109、gtkmm 3.22.0でフォントの描画画像を取得するテストプログラムを 作っているのだけど Gdk::Pixbuf::create( get_window(), 0, 0, get_width(), get_height() ); で取得した画像がon_drawで描く前の状態を取ってきているみたいで一つ前の表示になってしまいます on_drawで描画した後の画像を取得するにはどうしたら良いでしょうか? (set_double_bufferedも疑ったのですがこちらは関係ないような気がします) 提示する情報が分からず情報不足かも知れませんが宜しくお願いします コールバック関数内で描画に関わる関数を呼んで、その次にPixbufを取り出す関数を読んでたのですが どうもコールバック関数が終わるまでイベントが処理されないようでした 強制的にイベントを処理する下記コードを追加して上手く動く様になりました while( Gtk::Main::events_pending() ) { Gtk::Main::iteration( true ); usleep( 1000 ); } 出来ればDrawingAreaに描画しなくてもPixbufを取り出せると良いのですが・・・ (Pango::Layoutあたりから直接画像イメージを作れないでしょうか) GTKってどうなの? GTKかQtkかなんやんでQtにしたんだけど(当時kdevelopってQtの開発環境があったんだよね、今もあるけど)。 今からやるならQtのほうがいいんでね? これからGTK+4で阿鼻叫喚になるのと対照的に、Qt5へ移行したばっかだし >>798 ウインドウ内でうねうね動かせて視覚効果高いのがのがQt。Qtならゲームも作れる。 そうゆうの全く無理で地味でも、ちょうど良いコンパクトサイズのボタン等が充実しててツール作ったりするのに適してるのがGTK。 GTK+4以降では、「安定なAPI体系はハナから持たない」って認識でいいの? ffmpegのように絶え間なくAPIが変化し続けることになる? で、バージョン番号もブラウザのようにうなぎ上りになるのか https://blogs.gnome.org/desrt/2016/06/13/gtk-4-0-is-not-gtk-4/ 2年ごとにメジャーバージョン更新 最新のメジャーバージョンは開発中につき不安定 各メジャーバージョンの最終版=安定版としたいらしい なるほど ffmpegほどキ○ガイな方針ではないのね java の JList みたいなことはできる? どういうのかというと、参考画像 https://docs.oracle.com/javase/tutorial/figures/uiswing/components/NameChooserMetal.png リストのアイテムがテーブル上に並んでいて、 上下左右にカーソル移動できる。 GTK だとないかな? IconViewをラベルだけで使うみたいなもんかね Pythonですまんが from gi.repository import Gtk from gi.repository import GObject bname = ["Arlo", "Cosmo", "Elmo", "Hugo", "Jethro", "Laszlo", "Milo", "Nemo", "Otto", "Ringo", "Rocco", "Rollo"] model = Gtk.ListStore(GObject.TYPE_STRING) for n in bname: t = model.append() model.set(t, 0, n) view = Gtk.IconView(model) view.set_text_column(0) win = Gtk.Window() win.add(view) win.show_all() win.connect("delete-event", Gtk.main_quit) Gtk.main() >>805 なるほど、IconView でテキストか。 できたできた、 どうもありがとう! gtk勉強しようかと思うんだけどもうオワコン? でもQtバインディングよりgtkバインディングのほうが多いしなぁ... gtk4で大幅に進化したりしないかな 両方やってみればいい 考えてるほど時間も労力も掛からないよ window のサイズをいい感じ?にできる関数があるか、 お知恵を拝借。 (1) やったこと GtkWindow に対して、GtkToolbar しか置いてない。 toolbar に、gtk_toolbar_insert() でボタンを4つ横並びに置く。 window のサイズは未指定。 (2) 動作確認 右の方のボタンが矢印でまとめられて? メニューみたいに表示される。 (横幅を広げると、横並びに表示される) (3) 所感 相当前に gtk_toolbar_append_element() (deprecated) 等で 配置したときは、横並びに表示されて、 window のサイズはちょうどいい具合に表示されていた(ように思う)。 ボタンが、矢印でまとめられないで、横並びに表示されるように window のサイズをいい感じ?にできる関数がある? (意味わかんなかったらゴメンw) gtk_widget_set_size_request() でざっくりで指定しないとダメかなあ。 >>809 直接の答えは分からないけど、何の工夫もせずにやったらボタンが4つ並ぶ状態で起動すると思う public class ToolbarTest : Gtk.Window { public ToolbarTest () { destroy.connect (Gtk.main_quit); var tb = new Gtk.Toolbar (); foreach (var n in new int[] {1,2,3,4}){ tb.add (new Gtk.ToolButton (null,@"Button$n")); } add (tb); show_all (); } public static int main (string[] args) { Gtk.init (ref args); new ToolbarTest (); Gtk.main (); return 0; } } toolbar に付いている「つまみ」 (アプリでよくある「toolbar を固定する」みたい感じなのをオフにすると現れる、持つ部分?) あれは GTK+ では、どうやって出すのでしょうか? GtkHandleBoxならdeprecatedだぞ VTEのspawnなんとかのAPIはいつになったらファイナライズされるのかね(怒 gtk4が気になってgtkの勉強始めようと思うんだけど初心者は何から始めるのがおすすめでしょうか? python3+gtk3で作るに際し IDE (統合環境)みたいなのってある? そう大げさなものでなくてよくて コード補完(gtkのメソッドの)が 出来ればいいかなぐらいの感じなんだけど もしくは大抵何が使われているのか あるいはvscodeにpythonプラグイン入れれば出来るかな 補足だけどpycharmでgtkの補完を行うにはちょっとした作業が必要みたい https://stackoverflow.com/a/33646560 vscodeのほう(というかjediという補完ツール)も何かしら方法はあるっぽい? #include <gtk/gtk.h> #include <gdk/gdk.h> #include <cairo.h> #define BITMAP_WIDTH (600) #define BITMAP_HEIGHT (600) GtkWidget *window; GtkWidget *darea; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *button01; GThread* thread; volatile int execflag01; int count; int time_count; static void do_drawing (cairo_t *, GtkWidget * widget); struct { cairo_surface_t *image; } glob; static gboolean on_draw_event (GtkWidget * widget, cairo_t * cr, gpointer user_data) { cr = gdk_cairo_create (gtk_widget_get_window (widget)); do_drawing (cr, widget); cairo_destroy (cr); return FALSE; } 続き static void do_drawing (cairo_t * cr, GtkWidget * widget) { gfloat screen_width; gfloat screen_height; gfloat image_width; gfloat image_height; gfloat x_scaling; gfloat y_scaling; /* ディスプレイの全画面の大きさを取得 */ screen_width = gdk_screen_get_width (gdk_screen_get_default ()); screen_height = gdk_screen_get_height (gdk_screen_get_default ()); /* イメージの大きさを取得 */ image_width = cairo_image_surface_get_width (glob.image); image_height = cairo_image_surface_get_height (glob.image); x_scaling = 1.0; y_scaling = 1.0; cairo_scale (cr, x_scaling, y_scaling); cairo_set_source_surface (cr, glob.image, 0, 0); cairo_paint (cr); } 続き static void load_image () { cairo_t *ic; glob.image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, BITMAP_WIDTH, BITMAP_HEIGHT); ic = cairo_create (glob.image); //長方形の描画 { //色の指定(外枠:Red,Green,Blue) cairo_set_source_rgb(ic, 0.0, 0.0, 1.0); //長方形(x,y,width,height)を描画 cairo_rectangle(ic, 0.0, 0.0, BITMAP_WIDTH, BITMAP_HEIGHT); //長方形の外枠を作る cairo_stroke_preserve(ic); //色を指定(塗りつぶし:Red,Green,Blue) cairo_set_source_rgb(ic, 0.0, 0.0, 1.0); //長方形を塗りつぶす cairo_fill(ic); cairo_stroke (ic); } cairo_destroy (ic); } 続き static gpointer thread_func( gpointer data){ cairo_t *ic; int i; ic = cairo_create (glob.image); { cairo_set_source_rgb(ic, 0.0, 0.0, 1.0); cairo_rectangle(ic, 0.0, 0.0, BITMAP_WIDTH, BITMAP_HEIGHT); cairo_stroke_preserve(ic); cairo_set_source_rgb(ic, 0.0, 0.0, 1.0); cairo_fill(ic); } cairo_stroke (ic); for (i = 0; i < count; i++) { gdk_threads_enter(); { cairo_set_source_rgb(ic, (i % 256) / 256.0, 0.0, (i % 256) / 256.0); cairo_rectangle(ic, 0.0, (double)i, (double)BITMAP_WIDTH, 1.0); cairo_stroke (ic); } gdk_threads_leave(); gtk_widget_queue_draw(darea); usleep(time_count); } cairo_destroy (ic); execflag01 = 0; } 続き static void on_button01_clicked(GtkWidget *button, gpointer user_data){ GError *error; if (execflag01 == 0) { execflag01 = 1; count = BITMAP_HEIGHT; time_count = 1000; thread = g_thread_create( thread_func, (gpointer)darea, FALSE, &error); } } 最後 int main (int argc, char *argv[]) { load_image (); execflag01 = 0; gtk_init (&argc, &argv); gdk_threads_init(); gdk_threads_enter(); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width(GTK_CONTAINER(window), 5); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_add(GTK_CONTAINER(window), vbox); darea = gtk_drawing_area_new (); gtk_box_pack_start(GTK_BOX(vbox), darea, FALSE, FALSE, 0); gtk_widget_set_size_request(darea, BITMAP_WIDTH, BITMAP_HEIGHT); button01 = gtk_button_new_with_label("Button01"); gtk_box_pack_start(GTK_BOX(vbox), button01, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button01), "clicked", G_CALLBACK(on_button01_clicked), NULL); g_signal_connect (G_OBJECT (darea), "draw", G_CALLBACK (on_draw_event), NULL); g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER); gtk_window_set_title (GTK_WINDOW (window), "Cairo Test"); gtk_window_set_decorated (GTK_WINDOW (window), TRUE); gtk_widget_set_size_request(window, 600, 630); gtk_widget_show_all (window); gtk_main (); gdk_threads_leave(); cairo_surface_destroy (glob.image); return 0; } gtkmm っていう C++ のバインディングがあるんだけど,2011 年で 3.0 が出たきり更新の音沙汰がない。 C++ 向けの GTK+ バインディングでおすすめある? read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる