2013-01-20 2 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에서 가져와야한다는 것입니다. 프로그램 A는 해당 클립 보드 데이터를 프로그램 B에 제공하기 위해 콜백을 가지고 있어야합니다.

즉, 프로그램 A가 종료되면 프로그램 B는 프로그램 A의 콜백을 호출 할 수 없습니다. 그런 이유로 Gtk에는 gtk_clipboard_store 기능이 있습니다. 이 함수는 프로그램 C에서 클립 보드에 "소유권"을 부여하므로 프로그램 A가 끝나면 프로그램 A에서 설정 한 클립 보드 데이터를 프로그램 C의 프로그램 B에 계속 사용할 수 있습니다.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()