質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

483閲覧

pyqt5で画像の表示が思うようにいかない

uc200

総合スコア32

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/12/12 00:01

編集2017/12/12 00:10

###前提・実現したいこと
python3.5を使っています。pyqt5を用いて、複数の画像をドラッグ&ドロップした時にその画像を表示するGUIを作りたいです。イメージとしては次の画像の様なものを作ろうと思っています。
画像

発生ている問題・エラーメッセージ

諷数の画像をドラッグ&ドロップしても最初の1枚しか表示されません。上図の矢印を押しても次の画像に移り変わりません。

###該当のソースコード

python3

1import sys 2from PyQt5.QtWidgets import * 3from PyQt5.QtGui import * 4from PyQt5.QtCore import * 5from PyQt5 import QtGui,QtCore, QtWidgets 6 7myLabel = None 8 9class Button(QPushButton): 10 11 def __init__(self, title, parent): 12 super().__init__(title, parent) 13 self.setAcceptDrops(True) 14 15 def dragEnterEvent(self, e): 16 mimeData = e.mimeData() 17 18 19 # パスの有無で判定 20 if mimeData.hasUrls(): 21 e.accept() 22 else: 23 e.ignore() 24 25 def dropEvent(self, e): 26 # ファイルから画像読込 27 urls = e.mimeData().urls() 28 path = urls[0].toLocalFile() 29 urllength=len(urls) 30 imagelist=[] 31 for file in range(0,urllength): 32 imagelist.append(urls[file].toLocalFile()) 33 print(imagelist) 34 35 36 myLabel.setIcon(QIcon(path)) 37 38 39 40class Example(QWidget): 41 42 def __init__(self): 43 super().__init__() 44 self.initUI() 45 46 def initUI(self): 47 self.list1=["みちゆき.jpg"] 48 global imagelist 49 imagelist=self.list1 50 51 self.listlength=len(imagelist) 52 self.imagenumber=0 53 iconimage=self.list1[self.imagenumber] 54 self.button = Button("",self) 55 self.button.resize(400,300) 56 self.button.setIcon(QIcon(iconimage)) 57 self.button.setIconSize(QSize(400,300)) 58 self.button.move(50, 50) 59 60 self.btnright=QPushButton(self) 61 self.btnright.resize(40,40) 62 self.btnright.setIcon(self.style().standardIcon(getattr(QStyle,"SP_ArrowRight"))) 63 self.btnright.setToolTip('次の画像') 64 self.btnright.setIconSize(QSize(40, 40)) 65 self.btnright.move(460, 200) 66 self.btnright.clicked.connect(self.stepnext) 67 68 self.btnleft=QPushButton(self) 69 self.btnleft.resize(40,40) 70 self.btnleft.setIcon(self.style().standardIcon(getattr(QStyle,"SP_ArrowLeft"))) 71 self.btnleft.setToolTip('前の画像') 72 self.btnleft.setIconSize(QSize(40, 40)) 73 self.btnleft.move(5, 200) 74 self.btnleft.clicked.connect(self.stepprev) 75 76 global myLabel 77 myLabel = self.button 78 79 80 81 #global imnum 82 #imnum=self.imagenumber 83 84 self.setWindowTitle('Simple drag & drop') 85 self.setGeometry(300, 300, 500, 500) 86 87 88 def stepnext(self): 89 print(imagelist) 90 if self.imagenumber<self.listlength-1: 91 print(imagelist) 92 self.imagenumber=self.imagenumber+1 93 myLabel.setIcon(QIcon(imagelist[self.imagenumber])) 94 95 else: 96 pass 97 98 def stepprev(self): 99 if self.imagenumber>0: 100 self.imagenumber=self.imagenumber-1 101 myLabel.setIcon(QIcon(imagelist[self.imagenumber])) 102 103 else: 104 pass 105 106 107 108if __name__ == '__main__': 109 110 app = QApplication(sys.argv) 111 ex = Example() 112 ex.show() 113 app.exec_() 114

###試したこと
Exampleクラス内のstepnext関数内にprint(imagelist)を付け加えてみましたが、右矢印ボタンを押しても最初に設定したimagelistしか表示されません。どうもドラッグ&ドロップしてもExampleクラス内のimagelistに変化が起きて無いと思われます。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

urlsがURLのリストなので、以下のように修正することで複数パスを取得できます。
また、動作詳細は確認できていませんがdropEvent中のimagelistはローカル変数になっているので、意図した動作をさせるにはglobal宣言する必要があります。

Python

1def dropEvent(self, e): 2 # ファイルから画像読込 3 urls = e.mimeData().urls() 4 global imagelist 5 imagelist=[] 6 for url in urls: 7 path = url.toLocalFile() 8 imagelist.append(path) 9 print(imagelist)

投稿2017/12/12 00:12

編集2017/12/12 00:16
can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uc200

2017/12/12 00:53

回答ありがとうございます!無事に動作してくれました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問