21

の中にtreeview-widgetがありScrolledWindow、実行時に入力されます。ScrolledWindowリストの最後まで自動スクロールしたい。ツリービューに行が挿入されるたびに、vadjustmentのを調整することで、問題を「解決」しました。ScrolledWindow例えば:

if new_line_in_row:
   adj = self.scrolled_window.get_vadjustment()
   adj.set_value( adj.upper - adj.page_size )

インタラクティブなipythonセッションでコードを実行し、自分で値を設定すると、すべてが期待どおりに機能します。

デフォルトのPythonインタープリターを使用してコードを実行すると、自動スクロールが常に機能するわけではありません。コードをデバッグしましたが、問題は、調整値にある種の「ラグ」があり、一定期間後にのみ変更されることであるようです。

私の質問は、どうすれば確実に最大位置までスクロールできScrolledWindowますか?使用できる特別な信号が生成されますか?または、?を設定するためのより良い方法はありadjustment-valueますか?

4

6 に答える 6

29

検索範囲を広げた後、ルビー関連の答えを見つけました。問題はgtkに関連しているため、次のような任意の言語で解決できるはずです。

変更するウィジェット(私の場合はツリービュー)をgtk.widget's' size-allocate'シグナルで接続し、gtk.scrolledwindow値を "upper--page_size"に設定します。例:

self.treeview.connect('size-allocate', self.treeview_changed)

..。

def treeview_changed(self, widget, event, data=None):
    adj = self.scrolled_window.get_vadjustment()
    adj.set_value( adj.upper - adj.page_size )

ruby-forum.comの元の投稿へのリンク:

ヒントヒント

于 2011-03-08T16:34:13.063 に答える
8

fookatchuの回答を改善して、コールバックを複数のウィジェットで使用できるようにすることができます。

def treeview_changed( self, widget, event, data=None ):
    adj = widget.get_vadjustment()
    adj.set_value( adj.upper - adj.pagesize )
于 2012-01-15T06:52:55.820 に答える
8

Python Gtk 3バージョン:

adj.set_value(adj.get_upper() - adj.get_page_size())

于 2014-12-16T01:10:24.337 に答える
1

受け入れられた答えは、コンテンツの問題を終了するための自動スクロールに対するgtk-rsのRustソリューションを理解するのに役立ちました。

他の人に役立つ可能性のあるRustスニペットは次のとおりです。

// Imports used for reference
use gtk::{TextBuffer, TextView, TextBufferBuilder, ScrolledWindow, ScrolledWindowBuilder};

// The text buffer where the text is appended later
let text_buffer: TextBuffer = TextBufferBuilder::new().build();

// The containing text view that holds the text buffer
let text_view: TextView = TextView::new_with_buffer(&text_buffer);

// The scrolled window container with fixed height/width that holds the text view
let scrolled_window: ScrolledWindow = ScrolledWindowBuilder::new()
        .min_content_height(400)
        .min_content_width(600)
        .child(&text_view)
        .build();

// Have the text view connect to signal "size-allocate"
text_view.connect_size_allocate(clone!(@weak scrolled_window => move |_,_| {
   let adj = scrolled_window.get_vadjustment().unwrap();
   adj.set_value(adj.get_upper() - adj.get_page_size());
}));

// ...
// Later on, fill buffer with some text.
text_buffer.insert(&mut text_buffer.get_end_iter(), "This is my text I'm adding");
于 2020-06-20T20:17:07.820 に答える
0

まだコールバックが必要です(私はtreeViewではなくtextViewを使用しました):

textView = Gtk.TextView()
scrolledWindow = Gtk.ScrolledWindow()

def textViewChanged( self, widget ):
    adjustment = scrolledWindow.get_vadjustment()
    adjustment.set_value( adjustment.get_upper() - adjustment.get_page_size() )

textView.connect( "size-allocate", textViewChanged )
于 2020-04-25T12:16:44.570 に答える
0

提案された解決策はどれも私にはうまくいきませんでしたが、これを行うことで目的の動作を得ることができました( GoのGTk4バインディングを使用):

adj := scrolledWindow.VAdjustment()
adj.SetUpper(adj.Upper() + adj.PageSize())
adj.SetValue(adj.Upper())

他の解決策では、スクロールされたウィンドウ(リストボックスが含まれている)を最後から2番目のアイテムに移動しますが、最後のアイテムは表示しません。動作の仕方で上限を上げる必要があると思ったので、ページサイズを増やしてスクロール値を新しい上限に設定してみました。

于 2022-02-18T20:45:27.990 に答える