Insert Text into a TextBuffer via a Function - python

2.4k Views Asked by At

I have following problem:

How can i insert text in my textbuffer?

Interface.py

class MainWindow:
    def __init__(self):

        # Build our Interface from the XML/Glade file
        gladefile = "MainWindow.glade"
        try:
            self.builder = Gtk.Builder()
            self.builder.add_from_file(gladefile)
        except:
            print("Failed to load Glade file: %s" % gladefile)

        # Connect signals
        self.builder.connect_signals(self)

        # Get the widgets
        self.window = self.builder.get_object("MainWindow")

        ...

        # TextViews
        self.TextViewCommandInput = self.builder.get_object("TextViewCommandInput")
        self.TextViewCommandOutput = self.builder.get_object("TextViewCommandOutput")

        ...

def DrawCommandView(output):
    TextBufferCommandInput = MainWindow.TextViewCommandInput.get_buffer()
    TextBufferCommandInput.insert_at_cursor(output + "\n")

And import "DrawCommandView" in a file

Commands.py

from Interface import MainWindow, DrawCommandView

output = "Hello World"
DrawCommandView(output)

if __name__ == "__main__":
    StartMainWindow = MainWindow()
    StartMainWindow.main()

But I keep getting this error:

Traceback (most recent call last):
  File "/home/user/Dokumente/Workspace/project/Commands.py", line 5, in <module>
    DrawACommandView(output)
  File "/home/user/Dokumente/Workspace/project/Interface.py", line 182, in DrawCommandView

    TextBufferCommandInput = MainWindow.TextViewCommandInput.get_buffer()
AttributeError: class MainWindow has no attribute 'self'

Thanks for your help!

greetz

2

There are 2 best solutions below

2
Pierce On

When you say TextBufferCommandInput = MainWindow.TextViewCommandInput.get_buffer() You are asking for a class attribute in MainWindow named TextViewCommandInput. You don't have a class attribute TextViewCommandInput, you have an instance attribute TextViewCommandInput. You need to pass an instance of MainWindow into DrawCommandView in order to get to TextViewCommandInput.

1
Quentin Engles On

I believe you have to set_text() instead of get_buffer().

See the set_text() documentation.

Then later get_buffer() can retrieve the text inserted by set_text().

Here are some methods I've been using to have a generic way to use the buffer.

def GetTextBuffer(self):
    self.text_buffer = self.text_edit.get_buffer()
    # self.text_edit is a Gtk.TextView() instance
    # to get the text buffer from TextView
    # buffer.get_text( start iterator, end iterator, bool )
    # the third argument set to True = Include hidden characters
    # third argument set to False = Don't include hidden characters
    # hidden characters would be visual formatting markup and such
    return self.text_buffer.get_text(
        self.text_buffer.get_start_iter(),
        self.text_buffer.get_end_iter(), 
        False)

def SetTextBuffer(self, to_buffer):
    # to_buffer is user input from widgets, or default values set at run time.
    text_buffer = self.text_edit.get_buffer()
    text_buffer.set_text(to_buffer)