1

我是 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()

谢谢 :)

4

3 回答 3

1

猜测人们可能会出于与我相同的原因点击此线程,即 wxPython (4.0.1) 的“新”版本将 write() 列为 wx.TextCtrl 类上的一个方法 - 但它没有定义。我需要一个写入函数才能使用 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)
于 2018-03-09T20:57:29.263 回答
0

这 3 种方法在功能上似乎是相同的。但是,我认为您将使用它AppendText来向文本控件添加额外的文本,以使您在代码本身中所做的事情非常清晰。大多数时候,您通常会使用SetValue. 我WriteText在重定向标准输出时使用过,仅此而已。您可以在此处阅读有关该用例的信息:

于 2014-10-28T17:50:59.160 回答
0

编辑

.AppendText()好的,而不是阅读我的整个答案,和之间的区别.WriteText()似乎是第一个将文本添加到文本控件的末尾,而第二个将文本添加到当前插入点,如此处所述

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

嗯..奇怪。我最终来到这里是因为使用.WriteText()wx.stc.StyledTextCtrl()的结果很奇怪。我现在将其更改为.write()并且可以正常工作。

我使用 mywx.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),一切正常。

于 2017-12-25T12:18:16.940 回答