3

メイン表示ウィンドウの横に行番号を表示する PyGTK を使用してテキスト ビューアー ウィジェットを作成しようとしています。もちろん、行番号とメイン ウィンドウが同期してスクロールするようにします。ただし、これを機能させる方法がわかりません。今、私はこれをやっています。TextViewer は HBox のサブクラスで、2 つの TextView を作成し、属性名 linenums および mainview の下にそれらをパックします。

self.textviewer = TextViewer.TextViewer(self.toplevel)

sw = gtk.ScrolledWindow()
sw.set_vadjustment(self.textviewer.mainview.get_vadjustment())
sw.set_hadjustment(self.textviewer.mainview.get_hadjustment())

sw.add_with_viewport(self.textviewer)

sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)

2 つの set_Xadjustment 行を削除すると、埋め込まれた TextViews の scroll_to_mark 関数が機能せず、これは私のアプリケーションでは受け入れられません。それらを使用すると、メイン テキスト ウィンドウは行番号ウィンドウの 2 倍の速さでスクロールし、ScrolledWindow の調整を self.textviewer.linenums の調整に設定すると、その逆になります。これはバグであると強く疑っています。また、自分でビューポートを設定し、その調整を TextViews の 1 つに設定しようとしましたが、やはり scroll_to_mark 関数が機能しなくなりました。両方の TextView を同期して 1 つとしてスクロールし、一方のスクロールの変更が他方に等しく影響するようにするにはどうすればよいですか?

編集: これは、ウィジェットを設定するメイン アプリケーションのコードです。

self.textviewer = TextViewer.TextViewer(self.toplevel)

sw = gtk.ScrolledWindow()
#These are the lines that toggle between the two problems when (un)commented
sw.set_vadjustment(self.textviewer.mainview.get_vadjustment())
sw.set_hadjustment(self.textviewer.mainview.get_hadjustment())

sw.add_with_viewport(self.textviewer)

sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
4

2 に答える 2

1

Meld での実装方法を確認することをお勧めします。特に、filediff コード(そこで sync を検索します)。

于 2012-06-21T18:14:05.910 に答える
1

gtk.TextViewに 2 つの s がどのように詰め込まれているのか、正確に理解するのが困難ですHBox。それらは両方とも別々gtk.ScrolledWindowに梱包され、次にHBox別のものに梱包さgtk.ScrolledWindowれます(あなたの投稿で言及されているもの)? 私が思うに、これらの s はどちらもラッパー ウィジェット内にgtk.TextView独自にパックされています。gtk.ScrolledWindowTextViewer

この場合、問題の簡単な解決策として、2 つgtk.TextViewの s が同じ高さである (したがって、行番号がメイン ビューと一列に並んでいる) ことを前提として、 sHboxなしでそれらを単純にパックすることをお勧めしますScrolledWindow。次に、上記のコードを使用してそれらを追加するScrolledWindowと、ビューポートは 2 つを 1 つのウィジェットのようにまとめて移動します。

これが問題でない場合は、TextViewer ラッパーに関する詳細情報とサンプル コードを提供していただけますか?

また、gtksourceviewに興味があるかもしれません。gtksourceview2 パ​​ッケージを使用すると、View ウィジェットのインスタンスを取得できます。

import gtksourceview2
view = gtksourceview2.View()
于 2012-06-21T18:00:07.833 に答える