【问题标题】:Difference between wx.TextCtrl .write / .WriteText / .AppendTextwx.TextCtrl .write / .WriteText / .AppendText 之间的区别
【发布时间】:2014-12-24 04:52:42
【问题描述】:

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

谢谢:)

【问题讨论】:

  • 我什至不知道这些功能,我经常使用 wx ...我只是使用SetValue

标签: python wxpython textctrl wxtextctrl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    编辑

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

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

    嗯..奇怪。我来到这里是因为在我的wx.stc.StyledTextCtrl() 上使用.WriteText() 会产生奇怪的结果。我现在将其更改为 .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) 时,一切正常。

    【讨论】:

      【解决方案3】:

      猜测人们可能会出于与我相同的原因点击此线程,即 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-02
        • 2015-04-21
        • 2010-12-19
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多