GTK+プログラミング
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+ バインディングでおすすめある? gtkmmはgtk4に向けてc++14対応もしてるっぽいし結構期待してる >>827 >>828 ありがとうございます。GNOME のリポジトリはついぞ覗いていませんでした。これで安心して使えます。 しかしパッケージマネージャで入手できる gtkmm が 2.4 と 3.0 というのはちょっと心許ないですね……。 誰か PR 投げてくれないかなぁ〜 (他力本願) >>831 2.4とか3.0とかはgtkmmの互換性での番号だと思うけどどうして心許ないの? >>831 ためしに手元のUbunut 17.04 でバージョン見たら Version: 3.22.0-1 ってなっとるでな gtk4が出たらJD書き直そうや いつまでもgtk2じゃ駄目でしょ 最近のgtkはカラー絵文字にも対応してるようだし >>820 はGTK+3でBITMAPを表示する方法がわからなかったので ネットで調べてとりあえず作ってみたものです それとgtk_widget_queue_draw()をスレッド側で使う場合 下記のようにしないとダメなようです gdk_threads_enter(); gtk_widget_queue_draw(darea); gdk_threads_leave(); デモとして違うのも作ってみました >>820-825 のプログラムのthread_func()関数を下のものに差し替えてみてください static gpointer thread_func( gpointer data){ int i, j, col, i1, depth; double xgap, ygap, xx, yy, a1, b1, x1, y1, tmp1, x2, y2; double xcorner, ycorner, length; cairo_t *ic; int count01; struct { double xcorner; double ycorner; double length; } param[8]; param[0].xcorner = -1.785666666666666e+000; param[0].ycorner = -2.508333333333312e-002; param[0].length = 5.000000000000000e-002; param[1].xcorner = -1.759984700520832e+000; param[1].ycorner = -1.518603515624978e-002; param[1].length = 9.765625000000001e-005; param[2].xcorner = -1.759906697591145e+000; param[2].ycorner = -1.515360514322895e-002; param[2].length = 6.103515625000000e-006; param[3].xcorner = -1.759901244004566e+000; param[3].ycorner = -1.515219028790770e-002; param[3].length = 4.768371582031250e-008; param[4].xcorner = -1.759901209723814e+000; param[4].ycorner = -1.515217680089193e-002; param[4].length = 5.820766091346741e-012; param[5].xcorner = -2.112213541666665e-001; param[5].ycorner = -7.939140624999994e-001; param[5].length = 1.562500000000000e-003; 続き param[6].xcorner = -2.238124999999996e-001; param[6].ycorner = -6.581041666666665e-001; param[6].length = 1.250000000000000e-002; param[7].xcorner = -2.137343749999995e-001; param[7].ycorner = -6.554270833333333e-001; param[7].length = 3.906250000000000e-004; ic = cairo_create (glob.image); for (count01 = 0; count01 < 8; count01++) { 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); xcorner = param[count01].xcorner; ycorner = param[count01].ycorner; length = param[count01].length; depth = 1000; xgap = length / BITMAP_WIDTH; ygap = length / BITMAP_HEIGHT; xx = xcorner; yy = ycorner; for(j = 0; j < BITMAP_WIDTH; j++) { ic = cairo_create (glob.image); for(i = 0; i < BITMAP_HEIGHT; i++) { a1 = xx; b1 = yy; i1 = 0; x1 = 0; y1 = 0; x2 = x1 * x1; y2 = y1 * y1; 終わり while ((i1 < depth) && (x2+y2 <=4)) { tmp1 = x2 - y2 + a1; y1 = 2 * x1 * y1 + b1; x1 = tmp1; x2 = x1 * x1; y2 = y1 * y1; i1++; } if (i1 == depth) i1 = 0; else i1++; col = i1; gdk_threads_enter(); cairo_set_source_rgb(ic, (col % 256) / 256.0, 0.0, 0.0); cairo_rectangle(ic, (double)i, (double)j, 1.0, 1.0); cairo_stroke(ic); gdk_threads_leave(); xx = xx + xgap; } yy = yy + ygap; xx = xcorner; if (j % 5 == 0) { gdk_threads_enter(); gtk_widget_queue_draw(darea); gdk_threads_leave(); } usleep(1000); } gdk_threads_enter(); gtk_widget_queue_draw(darea); gdk_threads_leave(); usleep(50000); } cairo_destroy (ic); execflag01 = 0; } 2chでコード貼ると権利関係の問題が生じるから 普通は貼らない。 これ常識。 GTK+4から>>801-802 の方針らしいので今GTK+使うなら3系が無難だと思う 本来なら、ソフトウェア板のGEditスレで聞くはずなんだろうけど、あまりにあっちのスレは心許ないので、こちらで聞かせて。 まず、GEditでAlt+n(nは1とか2とか3とかの番号)のショートカットキーを入力すると 現在開いてるタブの中から該当する番号のエディタタブをアクティブにしてくれるんだけど。。 https://help.gnome.org/users/gedit/stable/gedit-shortcut-keys.html.en GEditのWordCompletionっていうプラグイン使ってるんだけど、 これはオートコンプリートみたいに単語を入力候補の中から選んで入力支援作業をしてくれるプラグインなんだけど、 数ある候補の内から番号を選択して入力しようと思うとCtrl+Alt+n(nは番号)なんだけど、 GEditの公式ページにはAlt+nで良いって書いてある。 https://help.gnome.org/users/gedit/3.4/gedit-plugins-word-completion.html.en 自分としては使う機会が明らかにWordCompletionの方が多いから、逆の方がスゴイ都合いいんだけど、 現在GEditのショートカットキーを変更するのはスゴイ難しいっぽい(昔はプラグインとかあったみたい)。 ググッて出てくる~/.config/gedit/accel の変更もスゴイ難しい・・・。誰か分かる人がいたら教えて。よろしく。 >>845 スレ違いと分かってて書くし使ってるディストリやバージョンは書かないし… Fedora25の gedit3.22だとAlt+番号で 候補が出ているときはword選択、出てないときはタブ切り替えになる >>846 すみません。まず、スレ違いの点ですが、 ソフトウェア板にLinuxユーザ(GEditはほとんどがLinuxユーザでしょう)がどれだけいるか甚だ疑問ですし(WindowsユーザでGEdit使ってる人はほとんど詳しくないでしょうし、 Linux使いよりも多分詳しくないと思われます)、そういう理由でこちらに質問させてもらいました。 環境によっても違うんですね・・。それは知りませんでした、すみません。 自分はUbuntu16.04LTS、GEditのバージョンは3.18です。 >>846 様のFedora25、GEdit3.22の場合はスゴイ良い動き方をしますね。スゴイ羨ましいです!その様な動作の仕方が理想ですね。。マジで大変うらやましいです。 ご回答ありがとうございました。 UbuntuSoftwareにあったGEditを3.22だったので、インストールしてみたら 日本語対応まだしてなかったみたいです。 プラグイン選択とかファイル選択ダイアログは全部文字化けです・・。 Web ブラウザとかの「名前を付けて保存する」みたいな機能を使用した時に出る, ファイルの名称と保存先を決定できるポップアップダイアログって,どこが出しているか分かりますか? GTK+ のテーマを継承していたり「最近開いた項目」があったりするので GVfs あたりかなと予想しているのですが。 そしてあのダイアログを自分の好きなプログラムに置き換えることは可能でしょうか。 Ubuntu特有のHUDやらAltでウィンドウメニューをアクティブにする動作のショートカットキーがどうも影響してるみたいです。ショートカットキーを変更してみましたが、時々反映されるまで時間とタイミングがかかるので、もうちょっと待ってみます。ありがとう。 http://mao.5ch.net/test/read.cgi/linux/1188968326/820-825 のプログラムをPython3のGTK+3で書いてみた 注)半角空白をすべて全角空白にしてあるのでコピペする場合は全角空白を半角空白にしてください import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib from gi.repository import GObject import cairo import threading import time class Window01(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) self.set_title('Cairo Test') self.set_position(Gtk.WindowPosition.CENTER) self.set_property("width-request", 600) self.set_property("height-request", 630) self.count = 0 self.load_image() self.vbox = Gtk.Box() self.vbox.set_orientation(Gtk.Orientation.VERTICAL) self.add(self.vbox) self.darea = Gtk.DrawingArea() self.darea.set_property("width-request", 600) self.darea.set_property("height-request", 600) self.vbox.pack_start(self.darea, False, False, 0) self.button01 = Gtk.Button() self.button01.set_label('Button01') self.vbox.pack_start(self.button01, False, False, 0) self.button01.connect('clicked', self.button01_clicked) self.darea.connect('draw', self.on_draw_event) self.connect('delete-event', Gtk.main_quit) def on_draw_event(self, drawingarea, cr): self.do_drawing(drawingarea, cr) def do_drawing(self, drawingarea, cr): screen_width = Gdk.Screen.get_width(Gdk.Screen.get_default()) screen_height = Gdk.Screen.get_height(Gdk.Screen.get_default()) image_width = self.image.get_width() image_height = self.image.get_height() x_scaling = 1.0; y_scaling = 1.0; cr.scale(x_scaling, y_scaling); cr.set_source_surface (self.image, 0, 0); cr.paint (); def load_image(self): self.image = cairo.ImageSurface(cairo.FORMAT_ARGB32, 600, 600) ic = cairo.Context(self.image) #色の指定(外枠:Red,Green,Blue) ic.set_source_rgb(0.0, 0.0, 1.0) #長方形(x,y,width,height)を描画 ic.rectangle(0.0, 0.0, self.image.get_width(), self.image.get_height()) #長方形の外枠を作る ic.stroke_preserve() #色を指定(塗りつぶし:Red,Green,Blue) ic.set_source_rgb(0.0, 0.0, 1.0) #長方形を塗りつぶす ic.fill() ic.stroke() def button01_clicked(self, button01): self.thread = threading.Thread(target=self.thread_func) self.thread.start() def thread_func(self): ic = cairo.Context(self.image) for i in range(0, self.image.get_height()): Gdk.threads_enter() ic.set_source_rgb((i % 256) / 256.0, 0.0, (i % 256) / 256.0) ic.rectangle(0.0, i, self.image.get_width(), 1.0) ic.stroke() Gdk.threads_leave() Gdk.threads_enter() self.darea.queue_draw() Gdk.threads_leave() time.sleep(0.001) GObject.threads_init() Gdk.threads_init() Gdk.threads_enter() window = Window01() window.show_all() Gtk.main() Gdk.threads_leave() >>852 2chにコードを貼ると権利が2ch側に譲渡されるのでpastebinなどを使いましょう。 初歩的な質問ですみません。 glade3.18、C言語(初級の本を読んだ程度の知識です)を使用しています。 起動したgladeの右側のプロパティ画面で、 window1 GtkWindow □|__scrolledwindow1 GtkScrolledWindow □□|__viewport1 GtkViewport □□|____image2 GtkImage のように配置し、scrolledwindow1の全般タブのminimum content width と minimum content height に整数値を入れる事で、window1はマウスでの画像拡大縮小(ドラッグで)が出来る事は確認出来ました。 次に、 window1 GtkWindow □|__box1 GtkBox □□|__scrolledwindow1 GtkScrolledWindow □□□|__viewport1 GtkViewport □□□|____image2 GtkImage □□□|button1 GtkButton と変更すると、画像部分のスクロールは可能なものの、button1を含めたwindowの拡大縮小(ドラッグ)が上手くいきません。 ファイルダイアログの様に、OKボタンやキャンセルボタンをドラッグする事で、ボタンも一緒に下に動く様にするには、どうしたらいいのか悩んでいます。 box1の設定で見逃している部分があると思い調べているのですが見つかりませんでした。 どうすれば解決するのか教えてください。 858です。ソースは以下のものです。 #include <gtk/gtk.h> #include <stdlib.h> static void cb_button_clicked ( GtkWidget *Button1 , gpointer user_data ) { gtk_main_quit (); } int main(int argc, char *argv[]) { GtkBuilder *builder; GObject *window1; // GtkWidget *Button1; gtk_init(&argc,&argv); builder = gtk_builder_new(); GError* error = NULL; if ( !gtk_builder_add_from_file(builder, "test17.ui", &error) ) { g_warning("Couldn't load builder file: %s", error->message); g_error_free(error); exit(1); } gtk_builder_add_from_file(builder, "test17.ui", NULL); gtk_builder_connect_signals(builder, NULL); window1 = gtk_builder_get_object(builder, "window1"); gtk_widget_show_all(GTK_WIDGET(window1)); gtk_main(); return 0; } 858です。 window1 GtkBox |__box1 GtkBox |____textview1 GtkTextView |____viewport1 GtkViewport |______button1 GtkButton textview1のパッキングタブで、展張をONで試したら上手くいきました。 画像ファイルが失敗した理由は分かりませんでしたが、他のwidgetでは成功しました。 ×…window1 GtkBox ○…window1 GtkWindow Gtkmmってあんなに良いのに、なんで全然流行ってないの・・?VisualC++はおろか、Qtなんかよりよっぽど良いじゃん。 もっとはやってクレヨン!!他のC++GUIライブラリがあるか知らんが、VC#、VC++、Qtより俺は断然遥かに好きだな。 簡易言語は面白くないので、無しで。VB6くらいやっててワクワクするぜ! 誰でも簡単にパソコン1台で稼げる方法など 参考までに、 ⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。 グーグル検索⇒『宮本のゴウリエセレレ』 L23RPOWZ2H >>864 一つ目の方なら頑張れば使えそうな気がするけど2つ目は無理ゲー ミュートできないじゃん >>793-794 2015年書き込み 0 >>795 2016年書き込み 1 2017年 68 何故か2017年はGTK+大躍進の年だった!!!! あの、すごく素人な質問なんだけど、 GTK+3ってGNOMEが主に採用してるツールキットだよね。 ということは、ウィンドウの装飾がGNOMEデスクトップのそれになるってことかな。 上下に幅が広いウィンドウタイトルは嫌なんだけど、どうなんだろう。あの高さって調整できるんだろうか。 TextViewのテスト用に作ってみました ソースコードはpastebinに貼り付けてみました エラトステネスのふるい Python版 https://pastebin.com/7T8BThMJ エラトステネスのふるい C言語版 https://pastebin.com/egnHWyCJ >>857 にTextViewを追加してみました マンデルブロート集合 Python版 https://pastebin.com/gnfUsgtJ マンデルブロート集合 C言語版 https://pastebin.com/EDZcmy53 read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる