【问题标题】:wxpython textctrl line and columnwxpython textctrl 行列
【发布时间】:2014-03-17 15:32:52
【问题描述】:

我正在使用 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())

但是,两者总是给出指针先前位置的行和列值而不是当前位置。

有没有办法显示当前行列值?

【问题讨论】:

    标签: python wxpython line textctrl


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 2013-09-14
      • 2011-10-28
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2010-11-17
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多