2016-12-03 78 views
1

我試圖將圖像保存到系統剪貼板不工作,所以我寫了一些像這樣的代碼:複製到系統剪貼板中的圖像上的Linux

#!/usr/bin/python3 

from PyQt5.Qt import QApplication 
from PyQt5.QtWidgets import QWidget, QPushButton 
from PyQt5.Qt import QImage 

import sys 

class MyWidget(QWidget): 
    def __init__(self): 
     super(MyWidget, self).__init__() 
     self.button = QPushButton(self) 
     self.button.clicked.connect(self.copyPicToClip) 

    def copyPicToClip(self): 
     image = QImage('./test.jpg') 
     QApplication.clipboard().setImage(image) 
     self.close() 

if __name__ == '__main__': 
    a = QApplication(sys.argv) 

    myW = MyWidget() 
    myW.show() 

    a.exec() 

可悲的是,我發現它不」根本不工作。然後我試圖找到解決方案。我嘗試的第一件事是:

def copyPicToClip(self): 
    image = QImage('./test.jpg') 
    QApplication.clipboard().setImage(image) 
    # self.close() 

在此之後,我只是發現它的工作,但窗口不會自動關閉。

然後我試圖與複製文本:

#!/usr/bin/python3 

from PyQt5.Qt import QApplication, QClipboard 
from PyQt5.QtWidgets import QWidget, QPushButton 
from PyQt5.Qt import QImage 

import sys 

class MyWidget(QWidget): 
    def __init__(self): 
     super(MyWidget, self).__init__() 
     self.button = QPushButton(self) 
     self.button.clicked.connect(self.copyPicToClip) 
     QApplication.clipboard().dataChanged.connect(self.testFunc) 

    def copyPicToClip(self): 
     image = QImage('./test.jpg') 
     QApplication.clipboard().setImage(image) 

    def testFunc(self): 
     print('Here') 
     self.close() 

if __name__ == '__main__': 
    a = QApplication(sys.argv) 

    myW = MyWidget() 
    myW.show() 

    a.exec() 

可悲的是,它再次失敗。

因此,如果我早關閉應用程序,圖像將不會保存到剪貼板。但是我想在將圖像複製到剪貼板後關閉它。

有什麼建議嗎?

(PyQt5的,Ubuntu 16.10,如果幫助)。

回答

1

不幸的是你,這是在Linux上「正常」的行爲。默認情況下,剪貼板數據在應用程序關閉時不會持久。解決此問題的通常解決方法是安裝剪貼板管理器。對於Ubuntu的,詳細信息請參閱該wiki文章:

(注:我沒有實際測試過的任何建議的解決方案我自己,所以我不知道是否有任何他們將與PyQt合作)。

基本問題是,在Linux上,剪貼板只存儲對底層數據的引用。這在存儲方面非常高效,因爲數據僅在客戶端程序實際請求時才被複制。但是當然,如​​果源應用程序關閉,則引用將失效,並且剪貼板將變空。