Anfänger hat mal wieder fragen und kommt nicht weiter, im Tkinter Forum habe schon paar mal fragen gestellt da wurde mir immer geholfen (Vielen Dank dafür), da ich mir jetzt pyqt5 beibringen möchte, bin ich an meine grenzen gestoßen, ich habe mir wirklich viele Beispiele angeschaut und probiert aber es klappt bei meinem vorhaben nicht so wie ich möchte, wahrscheinlich liegt es am Verständnis zu wenig davon. Ich habe auf git code gefunden für slide show, den code würde ich gerne in meiner app unten in einem bestimmten widget anzeigen d.h ich starte meine app und die slide show fängt an in unterem teil meiner app, oben habe ich dann was anderes, ich scheitere an dem den code den ich gefunden habe in eine funktion zu packen und diese als thread aufzurufen viellleicht könnt ihr mir dabei helfen, die bilder sollen an die Größe des widget oder des graphicsView angepasst werden. 1 Bild als label habe ich mal zum test hinbekommen aber da passt auch irgendwie die auflösung nicht. Ich werde es weiter hin probieren vielleich komme ich selber drauf aber im moment bin ich irgend wie Blind und sehe nicht wo mein fehler liegt.
Vielen Dank im Voraus
Gruß ganja
hier der code schnipsel
Code: Alles auswählen
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import Qt
from PyQt5.uic import loadUi
from os import listdir
from os.path import isfile, join
import os
import sys
import random
import time
import threading
# oberer teil meiner app
class StopWatch(Qt.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent
self.ui = loadUi("gui.ui", self)
#verschiedene funktionen
def slide(self):
# hier sollte class Slideshow sein aber wie???
#gefundener code den ich in funktion packen möchte
class Slideshow():
picture_types = ('.jpg', '.png', '.JPG', '.PNG', '.jpeg', '.JPEG')
def __init__(self,sleep):
super(Slideshow, self).__init__()
print("hallo")
self.scene = QtWidgets.QGraphicsScene()
self.scene.setBackgroundBrush(QtGui.QBrush(Qt.black, Qt.SolidPattern))
self.graphicsView = QtWidgets.QGraphicsView(self.scene)
self.setCentralWidget(self.graphics_view)
#self.setWindowTitle('Slideshow')
#self.resize(1137, 885)
#self.setWindowFlags(Qt.FramelessWindowHint)
#self.setWindowState(Qt.WindowFullScreen)
#self.show()
#QtWidgets.QShortcut(QtGui.QKeySequence("SPACE"), self,self.nextPicture)
self.path = os.getcwd()
self.files = Slideshow.get_all_pictures(self.path)
self._current_picture = None
self.lock = threading.Lock()
self._stopThread = False
self.thread = threading.Thread(target=slideTime, args=(self, sleep))
self.thread.daemon = True
self.thread.start()
def nextPicture(self):
self.lock.acquire()
self.files = Slideshow.get_all_pictures(self.path)
if self.files:
upper = len(self.files) - 1
r = random.randint(0, upper)
while self.files[r] == self._current_picture:
r = random.randint(0, upper)
self._change_picture(self.files[r])
self.lock.release()
def _change_picture(self, file):
self._current_picture = file
pixmap = QtGui.QPixmap(os.path.join(os.getcwd(), file))
item = QtWidgets.QGraphicsPixmapItem(pixmap)
item.setTransformationMode(Qt.SmoothTransformation) # AA for transfoming
self.scene.clear()
self.scene.setSceneRect(0, 0, pixmap.width(), pixmap.height())
self.scene.addItem(item)
self.graphics_view.fitInView(item, Qt.KeepAspectRatio)
print("Changed picture to " + str(file))
self.graphicsView.mapToScene(self.graphicsView.viewport().rect().center())
def stopThread(self):
return self._stopThread
@staticmethod
def get_all_pictures(path):
print("Generating file list...")
list = [f for f in listdir(path) if isfile(join(path, f))
and os.path.splitext(f)[1] in Slideshow.picture_types]
print("Number of files: " + str(len(list)))
return list
def closeEvent(self, event):
print("Stopping Thread...")
self._stopThread = True
event.accept() # let the window close
def slideTime(slide, delay):
print("Starting thread...")
while not slide.stopThread():
slide.nextPicture()
time.sleep(delay)
print("Thread stopped...")
# wird auskommentiert soll im meins alles sein da ich meine app aufrufen möchte
#def main():
# app = QtWidgets.QApplication(sys.argv)
# s = Slideshow(int(sys.argv[1]) if len(sys.argv) == 2 else 5)
# i = app.exec_()
# sys.exit(i)
#if __name__ == '__main__':
# main()
# meins
def main():
app = Qt.QApplication(sys.argv)
watch = StopWatch()
watch.show()
#watch.showFullScreen()
app.exec_()
if __name__ == '__main__':
main()
# meine gui im designer erstelllt hier sollten dann die bilder angezeigt werden
<item>
<widget class="QWidget" name="widget_6" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QGraphicsView" name="graphicsView">
<property name="minimumSize">
<size>
<width>0</width>
<height>1200</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
# 1 Bild als label was ich geschaft habe aber mit einer falschen auflösung das bild ist zu gross für label es wird nur 1/4 des Bildes im label angezeigt, 3/4 sind nicht zu sehen da das Bild irgend wie zu groß ist
w = 800
h = 400
# Create widget
self.label_2 =Qt. QLabel(self.label_2)
pixmap = Qt.QPixmap('image.jpg')
pixmap =pixmap.scaled(Qt.QSize(w, h), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
self.label_2.setPixmap(pixmap)