PyQt5 ile Arayüzde Birden Fazla Resim Nasıl Açılırken Yanıt vermiyor Hatası (While Döngüsü İçerir)

Merhaba herkese.
Önceki konumda belirttiğim kodları PyQt5 e Uyarlamak için işe koyuldum. (bu arada yeni yeni öğreniyorum PyQt5’i)
Hiçbir problemim yok internetten bakıyorum neler nasıl kullanılmış diye. Neysee…
Tkinterde yapıp PyQt5’e uyarlarken tek aldığım hata şu:

while döngüsü ile oluşturduğum ve içinde dosya var mı yok mu koşuluyla varsa döngü boyunca farklı resimleri açan kod bloğu yazdım…
Bütün kodları aşağı bırakıyorum.
Bahsettiğim bölüm Commands sınıfının command_3 methodu.
Uzatmadan…
İşte Kodlar:

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets
from getpass import getuser
import os
from PyQt5.QtGui import QPixmap

class Ui_searchWindow(object):
    def setupUi(self, searchWindow):
        searchWindow.setObjectName("searchWindow")
        searchWindow.resize(591, 551)
        searchWindow.setMinimumSize(QtCore.QSize(591, 551))
        searchWindow.setMaximumSize(QtCore.QSize(591, 551))
        searchWindow.setWindowOpacity(1.0)
        searchWindow.setLayoutDirection(QtCore.Qt.LeftToRight)
        searchWindow.setAutoFillBackground(False)
        searchWindow.setStyleSheet("")
        self.searchButton = QtWidgets.QPushButton(searchWindow)
        self.searchButton.setGeometry(QtCore.QRect(390, 20, 111, 31))
        self.searchButton.setObjectName("searchButton")
        self.lineEdit = QtWidgets.QLineEdit(searchWindow)
        self.lineEdit.setGeometry(QtCore.QRect(140, 20, 241, 31))
        self.lineEdit.setTabletTracking(False)
        self.lineEdit.setEchoMode(QtWidgets.QLineEdit.Normal)
        self.lineEdit.setClearButtonEnabled(False)
        self.lineEdit.setObjectName("lineEdit")
        self.frame = QtWidgets.QFrame(searchWindow)
        self.frame.setGeometry(QtCore.QRect(70, 70, 451, 471))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.frame.setObjectName("frame")
        self.imageLabels = QtWidgets.QLabel(self.frame)
        self.imageLabels.setGeometry(QtCore.QRect(110, 20, 221, 111))
        self.imageLabels.setText("")
        self.imageLabels.setObjectName("imageLabels")

        self.retranslateUi(searchWindow)
        QtCore.QMetaObject.connectSlotsByName(searchWindow)
        self.searchButton.clicked.connect(cmd.command_3)
    def retranslateUi(self, searchWindow):
        _translate = QtCore.QCoreApplication.translate
        searchWindow.setWindowTitle(_translate("searchWindow", "Search"))
        self.searchButton.setText(_translate("searchWindow", "Ara/Temizle"))

class Commands:
    def command_1(self):
        pass
    def command_2(self):
        pass
    def command_3(self): # Api den indirilen thumbnailleri bir daha indirmeye gerek kalmadan göster
        count = 0
        while count < 21:
            if os.path.exists("C:\\Users\\"+getuser()+f"\\Desktop\\denyo\\{ui.lineEdit.text().lower().replace(' ','_')}{count}.jpg") is True: # Eğer bu isimde bir dosya varsa
                ui.imageLabels.setPixmap(QtGui.QPixmap("C:\\Users\\"+getuser()+f"\\Desktop\\denyo\\{ui.lineEdit.text().lower().replace(' ','_')}{count}.jpg"))
            else: # yoksa
                print("indiriliyor")
                # youtube.search_video()
                break
    def command_4(self):
        pass

class YT_API:
    def __init__(self,api_key):
        self.api_key = api_key

    def search_video(self):
        pass

if __name__ == "__main__":
    import sys
    API_KEY = ""
    cmd = Commands()
    youtube = YT_API(api_key=API_KEY)
    app = QtWidgets.QApplication(sys.argv)
    searchWindow = QtWidgets.QWidget()
    ui = Ui_searchWindow()
    ui.setupUi(searchWindow)
    searchWindow.show()
    sys.exit(app.exec_())

Unutmadan söyliyeyim döngüde sorguladığım dosya normalde bilgisayarımda bulunuyor.

Hata ise şöyle:


Neden Yanıt vermiyor diyor olabilir ?

Teşekkür ediyorum şimdiden.

Yüksek ihtimalle sonsuz döngüye giriliyor, count’ı hiç arttırmıyorsunuz döngüde. Arttırmayacaktınız madem neden direkt hiç koşul belirtmeden while True yazmadınız ?

1 Beğeni

dediğiniz gibi gözümden kaçmış arttırmayı unutmuşum teşekkür ederim.

Edit:

@Unnick Hocam gözden kaçırdığım arttırmayı ekledim. çalıştırdığımda alt alta göstermesi gerekirken bana en son fotoğrafı gösteriyor.
Bunu tkinterde yaşamamıştım. Bunun nedeni ne olabilir. x,y kordinatlarınıda belirttim. Sonradan eklediklerim(aynı zamanda düzenlediğim) yalnızca:

image = QPixmap("C:\\Users\\"+getuser()+f"\\Desktop\\denyo\\{ui.lineEdit.text().lower().replace(' ','_')}{count}.jpg")
ui.imageLabels.setPixmap(image)
ui.imageLabels.move(50,15)
ui.imageLabels.show()

Denemedim fakat aynı değişkenin Pixmap’ini değiştirdiğinizden ötürü oluyor gibi görünüyor.
Basit bir fonksiyon ve sözlük ile halledilebilir gibi geldi.

Ui_searchWindow içerisine şöyle bir fonksiyon ekleyelim:

def setupUi(self, searchWindow):
    self.image_labels = {}
    # .
    # .
    # .

def create_imageLabel(self, object_name, parent, geometry, text=""):
    image_label = QtWidgets.QLavel(parent)
    image_label.setGeometry(QtCore.geometry)
    image_label.setText(text)
    image_label.setObjectName(object_name)
    
    self.image_labels.update({object_name: image_label})

Sonrasında ise bahsini ettiğiniz kodları şu şekilde ayarlayalım,

image = QPixmap("C:\\Users\\"+getuser()+f"\\Desktop\\denyo\\{ui.lineEdit.text().lower().replace(' ','_')}{count}.jpg")
object_name = f"image_label{count}"
ui.create_imageLabel(object_name=object_name, parent=ui.frame, geometry=QRect(200, 200, 200, 200), text="")
ui.image_labels[object_name].setPixmap(image)
ui.image_labels[object_name].move(50,15)
ui.image_labels[object_name].show()
1 Beğeni

hocam anladığım kadarıyla bir liste yada sizin dediğiniz gibi bir sözlük oluşturup açılacak her bir resmi butona bastıktan sonra içine ekleyip içine eklediğimiz listeyi ya da sözlüğü tek bir label’e bağlıyıp arayüzde göstermek. doğru muyum ?

Yok hayır, her biri için ayrı bir label oluşturmayı kast etmiştim. Her biri tek labelde gösterilebiliyor mu onu da bilmiyorum açıkçası. Sanırım siz tek bir labelde göstermeyi istiyorsunuz.

hocam şu olay istemekle olur mu bilmiyorum fakat tkinter de uğraşırken bunu bir döngüyle tek bir labelde gösterdiğim için ve orada uygularken kullnadığım mantıkla burada da olabilir gibi düşündüğümden dolayı böyle bir mantık yürüttüm. PyQt5’ide de yeni yeni öğrendiğim için biraz zaman geçtikten sonra yapabilirim diye düşünüyorum. Teşekkür ediyorum yardımınız için. Yaparsam çözüldü olarak işaretlerim.

Edit:

count = 0
while count < 21:
    if os.path.exists("C:\\Users\\"+getuser()+f"\\Desktop\\denyo\\{ui.searchEntry.get().lower().replace(' ','_')}{count}.jpg") is True:
        image = ImageTk.PhotoImage(Image.open("C:\\Users\\"+getuser()+f"\\Desktop\\denyo\\{ui.searchEntry.get().lower().replace(' ','_')}{count}.jpg"))
        t = Label(ui.f1,image=image)
        t.pack(padx=7,pady=27,anchor=W)
        t.image = image

    else:
       youtube.search_video()
       break
   count += 1

Tkinter kullanırken böyle bir yolla alt alta o klasörde bulunan bütün resimleri gösterebiliyorum.

1 Beğeni