确定是否将textCtrl滚动到缓冲区的末尾

时间:2019-03-25 13:52:29

标签: python wxpython wxtextctrl

我有一个wxTextCtrl元素,我想确定它是否垂直滚动到文本缓冲区的底部。看来将函数GetScrollPosGetScrollRangeGetScrollThumb结合使用以获取显示的行数是可行的,但是GetScrollThumb为我返回了0无论如何。

如何确定textCtrl是否滚动到底部?还有其他方法吗?是GetScrollThumb返回0的错误还是我的平台不支持该错误?

我在Windows上,使用wxPython 4.0.4 msw(菲尼克斯)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()

0 个答案:

没有答案