wx.TextCtrl .write、.WriteText 和 .AppendText 的区别

1 投票
3 回答
2560 浏览
提问于 2025-04-30 05:02

我刚开始学习Python,所以对wxPython也很陌生。我想知道这些wx.TextCtrl函数之间有没有什么区别。这段小代码显示了三次相同的输出。如果没有区别,那这些函数存在的历史原因是什么呢?

import wx

class testUI(wx.Panel):
    textCtrl = ''

    def __init__(self, parent, name):
        super(testUI, self).__init__(parent, name=name)
        self.buildUI()
        self.Show(True)
        self.textCtrl.write('bli\n')
        self.textCtrl.WriteText('bla\n')
        self.textCtrl.AppendText('blub\n')

    def buildUI(self):
        self.textCtrl = wx.TextCtrl(self, style=wx.TE_MULTILINE|wx.TE_READONLY)
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(self.textCtrl, proportion=1, flag=wx.EXPAND)

def main():
    app = wx.App(False)
    root = wx.Frame(parent=None, title='testUI')
    testUI(parent=root, name='testUI')
    root.Show(True)
    app.MainLoop()

# Standard boilerplate to call the main() function.
if __name__ == '__main__':
    main()

谢谢 :)

暂无标签

3 个回答

0

编辑:

好的,简单说一下,.AppendText().WriteText()的区别在于,前者是把文本加到文本控件的末尾,而后者是把文本加到当前光标所在的位置,具体可以参考这里

旧回答(可能仍然有用作为示例):

嗯……奇怪。我之所以来到这里,是因为在我的wx.stc.StyledTextCtrl()上使用.WriteText()时出现了奇怪的结果。现在我把它改成.write(),结果就正常了。

我把wx.stc.StyledTextCtrl()当作一个可以拖放的窗口,用来列出拖放的文件路径。不过,由于这个窗口也是可以编辑的(我需要它可编辑),所以光标的位置可以在任何地方。

因此,每当有人把新的文件路径(或者多个文件路径)拖到我的wx.stc.StyledTextCtrl()上时,我需要检查当前的InsertionPoint(光标位置)在哪里。如果InsertionPoint在一行已经有文本的地方,就需要把光标移动到那一行的末尾。然后再打印一个换行符和接收到的文件路径。

我的代码是这样的:

def write_interactive(self, text):

        curPos = self.interactivewindow.GetInsertionPoint()
        lineVal,curCol,curRow = self.interactivewindow.PositionToXY(curPos)
        lineNum = curRow
        lineText = self.interactivewindow.GetLineText(lineNum)

        if len(lineText) > 0:

            endOfLine = self.interactivewindow.XYToPosition(len(lineText), curRow)
            self.interactivewindow.SetInsertionPoint(endOfLine)
            self.interactivewindow.write('\n' + text)

        else:

            self.interactivewindow.write(text)

至于你的问题,我注意到当使用self.interactivewindow.WriteText(text)时,位于初始InsertionPoint和那一行末尾之间的文本会消失,而新文本会覆盖在上面。但是,当使用self.interactivewindow.write(text)时,一切都正常。

1

我猜很多人可能会因为和我一样的原因来到这个讨论串,那就是“新”的wxPython版本(4.0.1)在wx.TextCtrl类中列出了一个叫write()的方法,但这个方法并没有被定义。我需要一个write函数来使用logging.StreamHandler类;因为这些方法应该都能做同样的事情,所以我自己重新创建了这个缺失的write方法,并通过赋值的方式实现了——这样就可以用了:

import wx

import logging
lgr = logging.getLogger(__name__)
lgr.setLevel(logging.DEBUG)
fmt = logging.Formatter('%(asctime)s: %(name)s [%(levelname)s] %(message)s')
debug = lgr.debug

class LogTab(wx.Panel):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.text_log = wx.TextCtrl(self, wx.ID_ANY, "",
                                    style=wx.TE_MULTILINE | wx.TE_READONLY)

        self.text_log.write = self.text_log.WriteText

        self.__set_properties()
        self.__do_layout()
        self.log_handler = logging.StreamHandler(self.text_log) 
        self.log_handler.setFormatter(fmt) 

        lgr.addHandler(self.log_handler)
0

这三种方法看起来功能上是一样的。不过,我想说的是,使用 AppendText 来往文本控件里添加额外的文本,这样在代码中能让你做的事情更加清晰。大多数情况下,你通常会使用 SetValue。我用过 WriteText 是在重定向标准输出的时候,但就只有这个情况。你可以在这里了解这个用法:

撰写回答