wx.TextCtrl .write / .WriteText / .AppendText之间的区别

时间:2014-10-28 17:01:13

标签: python wxpython textctrl wxtextctrl

我是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 :(得分:1)

猜测人们可能会因为我做的原因而打这个帖子,这就是" new" wxPython(4.0.1)的版本将write()列为wx.TextCtrl类的一个方法 - 但它没有定义。我需要一个write函数才能使用logging.StreamHandler类;因为这些方法都应该做同样的事情,我用赋值重新创建了缺少的写方法 - 这有效:

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)

答案 1 :(得分:0)

这三种方法在功能上似乎相同。但是,我认为您可以使用AppendText向文本控件添加其他文本,以使您在代码本身中做得非常清楚。大多数情况下,您通常会使用SetValue。我在重定向stdout时使用了WriteText,但就是这样。您可以在此处阅读该用例:

答案 2 :(得分:0)

修改

好的,.AppendText().WriteText()之间的区别似乎是第一个将文本添加到文本控件的末尾而第二个将其添加到当前插入时,而不是阅读我的整个答案。点here解释。

旧答案(可能仍然有用)

嗯......很奇怪。我最终在这里,因为在.WriteText()上使用wx.stc.StyledTextCtrl()给出了奇怪的结果。我现在将其更改为.write()并且它有效。

我使用我的wx.stc.StyledTextCtrl()作为拖放窗口,列出了删除的文件路径。但是,由于窗口也是可编辑的(我需要它),InsertionPoint可以位于任何地方。

因此,每当有人将新的文件路径(或多个文件路径)放到我的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)时,一切正常。