2016-12-03 6 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() 

を、私はそれはdoesnの発見しましたまったく働きません。そして解決策を見つけようとしました。私が試した最初のことは次のとおりでした:

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の記事を参照してください。

(NB:私は実際に提案ソリューションのいずれかの自分自身をテストしていないので、私は任意のかどうかわかりませんPyQtで動作します)。

Linuxの基本的な問題は、クリップボードには、基礎となるデータへの参照だけが格納されることです。これは、クライアントプログラムが実際に要求したときにのみデータがコピーされるため、ストレージに関して非常に効率的です。もちろん、ソースアプリケーションが終了すると、参照は無効になり、クリップボードは空になります。