40166


Python3.5 と PyQt5 で複数の画像をドラッグ&ドロップドロップした時にそれらの画像を下図のように表示するGUIを作りたいです。

しかし、矢印を押しても画像が次の画像に移りません。Buttonクラス内でのimagelistの変更がExampleクラス内でのimagelistに反映されてないのが原因だと思うのですが、どう直せばいいのかが分かりません。

[![GUI](https://i.stack.imgur.com/bkZX8.png)](https://i.stack.imgur.com/bkZX8.png)

**現状のコード:**

[code]

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    from PyQt5 import QtGui,QtCore, QtWidgets
    
    myLabel = None
    
    class Button(QPushButton):
    
        def __init__(self, title, parent):
            super().__init__(title, parent)
            self.setAcceptDrops(True)
    
        def dragEnterEvent(self, e):
            mimeData = e.mimeData()
    
    
            # パスの有無で判定
            if mimeData.hasUrls():
                e.accept()
            else:
                e.ignore()
    
        def dropEvent(self, e):
            # ファイルから画像読込
            urls = e.mimeData().urls()
            path = urls[0].toLocalFile()
            urllength=len(urls)
            imagelist=[]
            for file in range(0,urllength):
                imagelist.append(urls[file].toLocalFile())    
            print(imagelist)
            
            myLabel.setIcon(QIcon(path))
    
    
    
    class Example(QWidget):
    
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.list1=["グリーングリーン.jpg"]
            global imagelist
            imagelist=self.list1
            
            self.listlength=len(imagelist)
            self.imagenumber=0
            iconimage=self.list1[self.imagenumber]
            self.button = Button("",self)
            self.button.resize(400,300)
            self.button.setIcon(QIcon(iconimage)) 
            self.button.setIconSize(QSize(400,300))
            self.button.move(50, 50)
    
            self.btnright=QPushButton(self)
            self.btnright.resize(40,40)
            self.btnright.setIcon(self.style().standardIcon(getattr(QStyle,"SP_ArrowRight")))
            self.btnright.setToolTip('次の画像')
            self.btnright.setIconSize(QSize(40, 40))
            self.btnright.move(460, 200)  
            self.btnright.clicked.connect(self.stepnext)        
            
            self.btnleft=QPushButton(self)
            self.btnleft.resize(40,40)
            self.btnleft.setIcon(self.style().standardIcon(getattr(QStyle,"SP_ArrowLeft")))
            self.btnleft.setToolTip('前の画像')
            self.btnleft.setIconSize(QSize(40, 40))
            self.btnleft.move(5, 200)  
            self.btnleft.clicked.connect(self.stepprev)
    
            global myLabel
            myLabel = self.button
    
    
    
            #global imnum
            #imnum=self.imagenumber
    
            self.setWindowTitle('Simple drag & drop')
            self.setGeometry(300, 300, 500, 500)
    
    
        def stepnext(self):
            print(imagelist)
            if self.imagenumber<self.listlength-1:
                print(imagelist)
                self.imagenumber=self.imagenumber+1
                myLabel.setIcon(QIcon(imagelist[self.imagenumber]))
                
            else:
                pass
    
        def stepprev(self):
            if self.imagenumber>0:
                self.imagenumber=self.imagenumber-1
                myLabel.setIcon(QIcon(imagelist[self.imagenumber]))
               
            else:
                pass
    
    
    
    if __name__ == '__main__':
    
        app = QApplication(sys.argv)
        ex = Example()
        ex.show()
        app.exec_()
    
[/code]


CC BY-SA 4.0
2017-12-10T07:39:04.203
40164
2021-03-09T04:56:18.903
2021-03-09T04:56:18.903
3060
26529
question
python python3 pyqt5
pyqt5での画像の表示が思うようにいかない


`Example`クラスの`listlength`メンバ変数を(`imagelist`更新時に)変更していないので、初期値の「1」のまま動作しているからのように見えます。  
(そのせいで「次の画像」ボタン操作(`stepnext`メソッド)内のif文が常にfalseになる)

ですので、`imagelist`更新時に`listlength`も合わせて更新するとよいと思います。


CC BY-SA 3.0
2017-12-10T08:32:43.163
40166
2017-12-10T08:32:43.163
20098
40164
answer