Python GTK3 Evince 查看器 - 如何重新加载文档?

标签 python pdf gtk

这是 here 的后续内容。我正在尝试重新加载 pdf 文件。基本上我想观看 pdf 文件,并在其更改时将其重新加载到查看器中。我找不到 python+gtk3 和 evince 的任何文档。

#!/usr/bin/env python

from gi.repository import Gtk, Gdk
from gi.repository import EvinceDocument
from gi.repository import EvinceView
import os,sys

if (len(sys.argv) is not 2):
    print "Usage: "+sys.argv[0]+" file.ext"
    sys.exit(0)
else:
    docFile=os.path.abspath(sys.argv[1])

#==========================================================
# Evince viewer class
class EvinceViewer:

    #------------------------------------------------------
    # constructor to build GUI and hook up function
    def __init__(self):

        # create main window
        self.window = Gtk.Window()
        # set title, size, position
        self.window.set_title("Evince")
        self.window.set_default_size(800,600)
        # connect destroy and delete events to quit
        self.window.connect('destroy', Gtk.main_quit)
        self.window.connect('delete-event', 
                Gtk.main_quit)
        self.window.connect("key-press-event", 
                self.keypress)

        # scrolled window for the viewer
        scroll = Gtk.ScrolledWindow()
        self.window.add(scroll)

        # evince document
        EvinceDocument.init()
        doc = EvinceDocument.Document.factory_get_document(
                'file://'+docFile)
        # evince view
        self.view = EvinceView.View()
        # evince model
        self.model = EvinceView.DocumentModel()
        self.model.set_document(doc)
        self.view.set_model(self.model)

        # add to scroll window
        scroll.add(self.view)
        self.window.show_all()
        self.fullscreen=False

    #------------------------------------------------------
    # handling keyboard events
    def keypress(self,widget,event):
        keyname = Gdk.keyval_name(event.keyval)
        ctrl = event.state & \
                Gdk.ModifierType.CONTROL_MASK

        if ctrl:

            if keyname=='r':
                self.view.reload()

            elif keyname == 'Return':
                if self.fullscreen == False:
                    self.fullscreen=True
                    self.window.fullscreen()
                else:
                    self.fullscreen=False
                    self.window.unfullscreen()

            elif keyname=='q':
                Gtk.main_quit()

    def main(self):
        Gtk.main()

if __name__ == "__main__":
    evinceViewer = EvinceViewer()
    evinceViewer.main()

重新加载功能似乎不起作用。出了什么问题?调用它时,文档查看器会显示 pdf 文件的困惑版本。

最佳答案

根据http://git.gnome.org/browse/evince/tree/libview/ev-view.cev_view_reloadev_view_reload_page 仅重绘页面;他们没有完成重新阅读文档。在您的情况下,如果您在不让库知道的情况下更改文件,它将假定该文件没有更改,并尝试使用内存中的引用表来呈现文档,从而导致其行为不稳定。如果更改文档,则必须重新加载文档本身。

为此(第 63-64 行):

if keyname=='r':
    self.model.get_document().load('file://'+docFile) # <- ADD THIS LINE
    self.view.reload()

这实际上会导致库完全重新读取 PDF 文件的内容。

关于Python GTK3 Evince 查看器 - 如何重新加载文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10978447/

相关文章:

python - Django+Nginx+uWSGI = 504 网关超时

python - 选择多列并根据列表删除值

android - 使用 itext 在 pdf 单元格中的图像上方设置文本

php - FPDF 中的 html_entity_decode(使用 tFPDF 扩展)

treeview - Vala:我怎么知道编辑过的信号是从哪一列发出的?

javascript - 如何在不同的窗口中实现 oauth 进程,然后重新加载调用者窗口

python mysql 获取查询

ruby-on-rails - 每页的页脚在 rails 3.2 中不起作用( Prawn PDF)

c - gtk+ 以编程方式在包含 vte 终端的scrolled_window 中向后滚动一行

haskell - 无法让 gtk2 CellRendererCombo 显示任何内容