2013-02-08 19 views
6

के अंत तक स्क्रॉल करें I ने एक लॉग लागू किया। यह स्क्रॉल किए गए विन्डो में टेक्स्टबफर के साथ एक टेक्स्ट व्यू है। नियमित रूप से मैं इस लॉग में एक नई लाइन जोड़ता हूं। बाद में इसे अंतिम पंक्ति तक स्क्रॉल करना चाहिए।पाइथन I के साथ जीटीके 3 प्रोग्राम पर स्क्रॉल किए गए विन्डो/टेक्स्ट व्यू

def append_log(self, line): 
    self.textbuffer.insert(self.textbuffer.get_end_iter(), "\n"+line, -1) 
    # scrolling down 

यह इस तरह दिखना चाहिए: http://www.physik.tu-dresden.de/~s9472632/log_manual.png

लेकिन यह काम नहीं करता। मैंने निम्नलिखित कोड की कोशिश की है।

# nothing happens 
adj = self.scrolledwindow.get_vadjustment() 
adj.set_value(adj.get_upper()-adj.get_page_size()) # same without subtraction (only upper or page_size) 
self.scrolledwindow.set_vadjustment(adj)    # with and without this line 

# nothing happens 
self.textview.scroll_to_iter(self.textbuffer.get_end_iter(), 0.0, False, 0.5, 0.5) 

# works a bit but scroll bars cover the text (see picture below) 
self.textview.scroll_to_mark(self.textbuffer.get_insert(), 0.0, False, 0.5, 0.5) 

चित्र: http://www.physik.tu-dresden.de/~s9472632/log_scroll.png

यह scroll_to * (within_margin, use_align, xalign, yalign) के अंतिम चार तर्क लगता है परिणामों के प्रभाव नहीं है।

यह कैसे काम करता है?

अल मार्कस

+0

सुनिश्चित करें कि आप देशी स्क्रॉलिंग क्षमताओं वाले बच्चों के लिए ऐड विधि का उपयोग कर रहे हैं। यह सी एपीआई में 'कंटेनर_एड' है। – ergosys

उत्तर

5

तो मुझे लगता है कि मुझे समस्या पता है। मुझे लगता है कि आपने गलत सिग्नल कनेक्ट किया है ताकि TextView ने अभी तक एक नए आकार का अनुरोध नहीं किया है। नीचे दिया गया कोड TextView का संकेत देता है और यह एक आकर्षण की तरह काम करता है।

#!/usr/bin/env python 

from gi.repository import Gtk, GObject 


class W(Gtk.Window): 

    def __init__(self): 

     super(W, self).__init__() 
     self.connect("destroy", Gtk.main_quit) 
     self.set_default_size(200, 400) 

     self._msg_i = 0 
     self._sw = Gtk.ScrolledWindow() 
     self.add(self._sw) 

     self._tw = Gtk.TextView() 
     self._tb = self._tw.get_buffer() 

     self._sw.add_with_viewport(self._tw) 
     #The signal should at least be connected after the scrolled window 
     #is created, since the callback works on it. 
     self._tw.connect("size-allocate", self._autoscroll) 

     GObject.timeout_add(400, self.sim_log) # Invokes spamming 
     self.show_all() 

    def sim_log(self, *args): 
     """A simple spamming function to emulate some sort of logging""" 
     self._msg_i += 1 
     i = self._tb.get_end_iter() 
     self._tb.insert(i, "\n* Message {0} recieved!".format(self._msg_i), -1) 
     return True 

    def _autoscroll(self, *args): 
     """The actual scrolling method""" 
     adj = self._sw.get_vadjustment() 
     adj.set_value(adj.get_upper() - adj.get_page_size()) 


if __name__ == "__main__": 

    w = W() 
    Gtk.main() 
2

मैंने अभी यह किया है और scroll_to_mark लाइन का काम किया है। मेरा मानना ​​है कि आपकी समस्या 'use_align' को गलत पर सेट कर रही थी। लाइन पढ़ना चाहिए:

self.textview.scroll_to_mark (self.textbuffer.get_insert(), 0.0, यह सच है, 0.5, 0,5)

1

gtkmm 3.0 के लिए/सी ++ 11:

void append(std::string s) { 
    textbuffer->insert(textbuffer->end(), s.c_str()); 

    // Wait for Gui to Redraw with added line to buffer 
    while (gtk_events_pending()) 
    gtk_main_iteration_do(false); 

    // Scoll to end of Buffer 
    auto it = textbuffer->get_iter_at_line(textbuffer->get_line_count()); 
    TextView1.scroll_to(it); 
}