如何使用 Python 和 gtk 将文本缓冲区保存到文件?

如何使用 Python 和 gtk 将文本缓冲区保存到文件?

我正在尝试使用 gtk2 和 python 为 Ubuntu 创建一个文本编辑器(打算试一试!)。到目前为止,我已经能够实现 open 函数。但是,我只是不知道如何获取 TextView 的内容并将其写入文件(用户将命名并决定将其保存在哪个目录中)。

以下是 gtk.FileChooserDialog 保存函数的代码:

def on_saveButton_clicked(widget):
        print 'saveButton clicked'
        savechooser = gtk.FileChooserDialog(title='Save File', action=gtk.FILE_CHOOSER_ACTION_SAVE, 
                                                        buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                                        gtk.STOCK_SAVE, gtk.RESPONSE_OK))
        filter = gtk.FileFilter()
        filter.set_name('All files')
        filter.add_pattern('*')
        savechooser.add_filter(filter)

        pyFilter = gtk.FileFilter()
        pyFilter.set_name('Python source file')
        pyFilter.add_pattern('*.py')
        savechooser.add_filter(pyFilter)

        rbFilter = gtk.FileFilter()
        rbFilter.set_name('Ruby source file')
        rbFilter.add_pattern('*.rb')
        savechooser.add_filter(rbFilter)

        cppFilter = gtk.FileFilter()
        cppFilter.set_name('C++ source file')
        cppFilter.add_pattern('*.cpp')
        savechooser.add_filter(cppFilter)

        response = savechooser.run()
        if response == gtk.RESPONSE_OK:
            filename = savechooser.get_filename()
            print filename, 'selected.'
        elif response == gtk.RESPONSE_CANCEL:
            print 'Closed, file not saved.'
        savechooser.destroy()

有人有什么想法吗?

答案1

首先,请考虑按照@SylvainPineau 的建议将代码更新为 Python 3 和 Gtk+3 (PyGObject)。然后,您需要将 GtkTextView 设为实例属性/成员,以便可以从内部访问它on_saveButton_clicked。最后,要实际保存 GtkTextBuffer 的内容,您可以使用 Python 内置函数或 GIO。

使用 Python 内置函数(假设您将 GtkTextView 保存在self.view):

if response == gtk.RESPONSE_OK:
    filename = savechooser.get_filename()
    print(filename, 'selected.')

    buf = self.view.get_buffer()
    text = buf.get_text(buf.get_start_iter(),
                        buf.get_end_iter(),
                        True)
    try:
        open(filename, 'w').write(text)
    except SomeError as err:
        print('Could not save %s: %s' % (filename, err))

附言:我注意到您没有使用类,因为您的on_saveButton_clicked函数没有参数self。如果是这样,为了测试您当前的代码,您可以将其设为self.view全局TEXT_VIEW变量。

相关内容