2013-01-20 55 views
2

我想獲得一個最小的實現Python3/GTK3的剪貼板工作。它會工作,當且僅當我運行Gtk.main()。我甚至嘗試過:最低實現Gtk.Clipboard不起作用

While Gtk.event_pending(): 
    Gtk.main_iteration() 

沒有它的工作。

如果我運行Gtk.main()它的行爲與預期讓我文成測試GUI編輯器粘貼腳本。該腳本將一個文本字符串t放入剪貼板。當且僅當調用Gtk.main()時,字符串文本將在那裏。如果它沒有被調用,但是剪貼板緩衝區被清除,但是是空的。我真的很感謝在這方面的幫助。任何想法如何讓它工作,而不致電Gtk.main()

#! /usr/bin/env python3 
# -*- coding: utf-8 -*- 

from gi.repository import Gtk 
from gi.repository import Gdk 
import signal 

class Chars(Gtk.Window): 
    def __init__(self): 
     super().__init__() 
     self.connect('destroy', Gtk.main_quit) 
     self.show_all() 
     self.cb = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) 
     t='Some text' 
     self.cb.set_text(t, -1) 
     while Gtk.events_pending(): 
      Gtk.main_iteration() 




def main(): 
    chars = Chars() 
    signal.signal(signal.SIGINT, signal.SIG_DFL) 
    # Gtk.main() # works if this is uncommented 

if __name__ == "__main__": 
    main() 

問候, Narnie

回答

1

你必須調用gtk_clipboard_store存儲其他程序使用剪貼板的內容。

剪貼板的工作方式是,當程序B想在剪貼板中的內容,它必須從已成立的剪貼板數據的程序的得到它。程序A必須有一些回調才能將該剪貼板數據提供給程序B.

這意味着當程序A結束時,程序B將無法調用程序A的回調。出於這個原因,Gtk具有gtk_clipboard_store函數。該功能確實將剪貼板「所有權」賦予程序C,因此程序A結束後程序A設置的剪貼板數據仍可用於程序C中的程序B.

如果使用clipboard_set_data函數系列,當主Gtk循環結束時,Gtk庫負責處理這個問題。既然你不想啓動Gtk主循環,你將不得不自己撥打gtk_clipboard_store

TL; DR簡單的剪貼板片段:

#!/usr/bin/python3 
from gi.repository import Gtk, Gdk 

clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) 
clipboard.set_text("Does a text of all texts contain itself?", -1) 
clipboard.store()