wx.TextCtrl .write、.WriteText 和 .AppendText 的区别
我刚开始学习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 个回答
编辑:
好的,简单说一下,.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)
时,一切都正常。
我猜很多人可能会因为和我一样的原因来到这个讨论串,那就是“新”的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)
这三种方法看起来功能上是一样的。不过,我想说的是,使用 AppendText
来往文本控件里添加额外的文本,这样在代码中能让你做的事情更加清晰。大多数情况下,你通常会使用 SetValue
。我用过 WriteText
是在重定向标准输出的时候,但就只有这个情况。你可以在这里了解这个用法: