Определите, прокручивается ли textCtrl до конца буфера - PullRequest
1 голос
/ 25 марта 2019

У меня есть элемент wxTextCtrl, и я хочу определить, прокручивается ли он вертикально до нижней части текстового буфера. Может показаться, что функции GetScrollPos и GetScrollRange в сочетании с GetScrollThumb для получения количества отображаемых строк будут работать, но GetScrollThumb возвращает мне 0, несмотря ни на что.

Как я могу определить, прокручивается ли textCtrl вниз? Есть ли другой метод? GetScrollThumb возвращает 0 ошибку или просто не поддерживается на моей платформе?

Я в Windows, использую wxPython 4.0.4 msw (phoenix), wxWidgets 3.0.5.

Вот минимальный (не) рабочий пример:

#!/usr/bin/python
import wx


print(wx.version())


class TextWindow(wx.Frame):
    def __init__(self, parent):

        wx.Frame.__init__(
            self,
            parent,
            id=wx.ID_ANY,
            title=u"Window Title",
            pos=wx.DefaultPosition,
            size=(400, 200),
            style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL,
        )

        bSizer3 = wx.BoxSizer(wx.VERTICAL)

        starting_text = '\n'.join('Line %d' % x for x in range(1, 101))

        self.m_textCtrl3 = wx.TextCtrl(
            self,
            wx.ID_ANY,
            starting_text,
            wx.DefaultPosition,
            wx.DefaultSize,
            wx.TE_DONTWRAP | wx.TE_MULTILINE | wx.TE_READONLY,
        )

        self.m_textCtrl3.SetFont(
            wx.Font(
                9,
                wx.FONTFAMILY_MODERN,
                wx.FONTSTYLE_NORMAL,
                wx.FONTWEIGHT_NORMAL,
                False,
                "Consolas",
            )
        )

        self.m_textCtrl3.HideNativeCaret()

        bSizer3.Add(self.m_textCtrl3, 1, wx.ALL | wx.EXPAND, 0)

        self.m_staticText1 = wx.StaticText(
            self,
            wx.ID_ANY,
            '',
            wx.DefaultPosition,
            wx.DefaultSize,
            wx.ST_ELLIPSIZE_END,
        )
        self.m_staticText1.Wrap(-1)

        bSizer3.Add(self.m_staticText1, 0, wx.LEFT | wx.EXPAND, 5)

        self.SetSizer(bSizer3)
        self.Layout()

        # Connect Events
        self.m_textCtrl3.Bind(wx.EVT_PAINT, self.check_scroll_bar)

    def __del__(self):
        pass

    def check_scroll_bar(self, event):
        top_line = self.m_textCtrl3.GetScrollPos(wx.VERTICAL)
        line_count = self.m_textCtrl3.GetScrollRange(wx.VERTICAL)
        displayed_lines = self.m_textCtrl3.GetScrollThumb(wx.VERTICAL)
        scrolled_to_end = top_line + displayed_lines >= line_count
        print('%d/%d/%d' % (top_line, displayed_lines, line_count))
        self.m_staticText1.SetLabel(
            'NOT at the end' if not scrolled_to_end else 'at end')
        pass


def main():
    app = wx.App()
    tw = TextWindow(None)
    tw.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
...