【问题标题】:Python Gtk3 - Scroll TextView inside of ScrolledWindow by mouse and courser positionPython Gtk3 - 通过鼠标和课程位置在 ScrolledWindow 内滚动 TextView
【发布时间】:2018-02-02 15:06:24
【问题描述】:

我在 Gtk.TextView 中有一些文本

当我用鼠标选择文本或将光标导航到底部边缘之外时,我无法看到我的选择,因为它不滚动。

所以我想我需要获取光标位置并将树视图设置到这个位置。 以及单击按钮时的鼠标位置并将树视图移动到该位置。

#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class ScrolledWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_default_size(200, 200)
        self.connect("destroy", Gtk.main_quit)

        self.scrolledwindow = Gtk.ScrolledWindow()

        self.add(self.scrolledwindow)

        box = Gtk.Box()
        self.scrolledwindow.add(box)

        textview = Gtk.TextView()
        box.pack_start(textview, True, True, 10)
        
        textview.connect("move-cursor", self.move_cursor_event) # arrow keys
        textview.connect("key-press-event", self.key_press_event) # keyboard input
        textview.connect("button-press-event", self.button_press_event) # mouse click 
        
        textbuffer = textview.get_buffer()
        
        text = 50*"Hello World\n"
        
        textbuffer.set_text(text, len(text))
        
    def move_cursor_event(self, tree_view, step, count, extend_selection):
        print "move_cursor_event", step, count, extend_selection
        
    def key_press_event(self, widget, event):
        print "key_press_event", event
        
    def button_press_event(self, widget, event):
        print "button_press_event", event.x, event.y
        position = self.scrolledwindow.get_vadjustment()
        position.set_value(350) 
        self.scrolledwindow.set_vadjustment(position)  #scroll to the middle of the scolled window
        

window = ScrolledWindow()
window.show_all()

Gtk.main()

谢谢

编辑1

这是我找到的一个非常基本的解决方案,用于将窗口滚动到由箭头键更改的光标位置:

def move_cursor_event(self, tree_view, step, count, extend_selection):
    rect = tree_view.get_cursor_locations()
    self.scroll_y(rect.strong.y)

def scroll_y(self, ypos):
    vadj = self.scrolled_window.get_vadjustment()
    vadj.set_value(ypos-80) 
    self.scrolled_window.set_vadjustment(vadj)

【问题讨论】:

    标签: python gtk


    【解决方案1】:

    这里的问题是textview 被放在一个盒子里,然后又被放在self.scrolledwindow 里。当TextViewBox 中时,它会阻止ScrolledWindow 识别TextView 需要滚动。将TextView 直接放在ScrolledWindow 中应该可以解决这个问题。下面是代码的样子:

    #!/usr/bin/env python
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk
    
    class ScrolledWindow(Gtk.Window):
        def __init__(self):
            Gtk.Window.__init__(self)
            self.set_default_size(200, 200)
            self.connect("destroy", Gtk.main_quit)
    
            self.scrolledwindow = Gtk.ScrolledWindow()
    
            self.add(self.scrolledwindow)
    
            textview = Gtk.TextView()
            self.scrolledwindow.add(textview)
            
            textbuffer = textview.get_buffer()
            
            text = 50*"Hello World\n"
            
            textbuffer.set_text(text, len(text))  #scroll to the middle of the scolled window
            
    window = ScrolledWindow()
    window.show_all()
    
    Gtk.main()
    

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多