2012-06-11 29 views
2

這是從here的後續行動。我正在嘗試重新加載一個PDF文件。基本上我想看pdf文件,當它改變時,將其重新加載到查看器中。我無法找到python + gtk3和evince的任何文檔。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文件的混亂版本。

回答

4

根據http://git.gnome.org/browse/evince/tree/libview/ev-view.c,ev_view_reloadev_view_reload_page只重繪頁面;他們沒有完成重新閱讀文件。在你的情況下,如果你改變文件而不讓庫知道,它會假定文件沒有改變,並嘗試使用內存中的引用表來呈現文檔,導致文檔行爲不正常。如果您更改文檔,您將不得不重新加載文檔本身。

要做到這一點(63-64行):

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

這實際上將導致庫完全重新讀取PDF文件的內容。