wxpython文本控件行和列

2 投票
1 回答
1363 浏览
提问于 2025-04-17 22:41

我正在用wxpython写一个文本编辑器。我想在状态栏中显示行号和列号,这个数字是根据文本指针的位置来决定的(当用键盘或鼠标改变位置时)。

我尝试用下面的代码来实现:

import wx

class TextFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Text Editor', size=(300, 250))

        self.panel = wx.Panel(self, -1) 

        self.multiText = wx.TextCtrl(self.panel, -1,"",size=(200, 100), style=wx.TE_MULTILINE|wx.EXPAND)

        sizer = wx.BoxSizer()
        sizer.Add(self.multiText, proportion=1, flag=wx.CENTER|wx.EXPAND)
        self.panel.SetSizer(sizer)

        self.CreateStatusBar()

        self.multiText.Bind(wx.EVT_KEY_DOWN, self.updateLineCol)
        self.multiText.Bind(wx.EVT_LEFT_DOWN, self.updateLineCol)

    def updateLineCol(self, event):
        #lineNum = len(self.multiText.GetRange( 0, self.multiText.GetInsertionPoint() ).split("\n"))
        l,c = self.multiText.PositionToXY(self.multiText.GetInsertionPoint())

        self.StatusBar.SetStatusText(str(l)+","+str(c), number=0)

        event.Skip()

app = wx.App(False)
frame = TextFrame()
frame.Show()
app.MainLoop()

我尝试了下面两种方法来达到这个目的:

1.) lineNum = len(self.multiText.GetRange( 0, self.multiText.GetInsertionPoint() ).split("\n"))
2.) l,c = self.multiText.PositionToXY(self.multiText.GetInsertionPoint())

但是,这两种方法总是显示指针之前位置的行号和列号,而不是当前的位置。

有没有办法显示当前的行号和列号呢?

1 个回答

1

我觉得你只需要把事件绑定到 EVT_KEY_UP,而不是 EVT_KEY_DOWN。这样的话,事件处理程序就会在你打完字之后才被调用。我还更新了状态栏上显示的内容,让它更清楚地显示每个值代表的意思:

import wx

class TextFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Text Editor', size=(300, 250))

        self.panel = wx.Panel(self, -1) 

        self.multiText = wx.TextCtrl(self.panel, -1,"",size=(200, 100), style=wx.TE_MULTILINE|wx.EXPAND)

        sizer = wx.BoxSizer()
        sizer.Add(self.multiText, proportion=1, flag=wx.CENTER|wx.EXPAND)
        self.panel.SetSizer(sizer)

        self.CreateStatusBar()

        self.multiText.Bind(wx.EVT_KEY_UP, self.updateLineCol)
        self.multiText.Bind(wx.EVT_LEFT_DOWN, self.updateLineCol)

    def updateLineCol(self, event):
        #lineNum = len(self.multiText.GetRange( 0, self.multiText.GetInsertionPoint() ).split("\n"))
        l,c = self.multiText.PositionToXY(self.multiText.GetInsertionPoint())

        stat = "col=%s, row=%s" % (l,c)

        self.StatusBar.SetStatusText(stat, number=0)

        event.Skip()

app = wx.App(False)
frame = TextFrame()
frame.Show()
app.MainLoop()

撰写回答