aus tkinter

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Freitag 11. August 2017, 09:37

Hallo, vielleicht kann mir jemand hier auch helfen im tkinter Bereich wurde mir geholfen, ich möchte gerne das script umändern aber leider geht es nicht, grund ist das ich die leiste oben in dem script nicht haben möchte mit tkinter geht es nicht (linux) wurde schon im tkinter Bereich besprochen, hier mal der Code Problem ist übergabe des Bildes an label und rotate und vielleich noch mehr.
Vielleicht hat jemand Lust sich das anzuschauen.

Vielen Dank
Gruß ganja

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys, math
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import Qt
from PyQt5.uic import loadUi

from PIL import Image
import PIL
from PIL.ImageQt import ImageQt

#from Image import Image
#from Image import *


class Application(Qt.QMainWindow):
	def __init__(self, parent=None):
		super().__init__(parent)
		#### ohne border
		#self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
		
		self.ui = loadUi("wheel_gui.ui", self)
		
		self.start.clicked.connect(self.start_rotate)
		
		self.angle=0
		self.img_dict = {}
		self.angle_step = 0
		self.load_angle = 0
		self.step = 20
		
		pixmap = QtGui.QPixmap("pfeilunten1.png")
		self.label.setPixmap(QtGui.QPixmap(pixmap).scaled(50, 50, QtCore.Qt.IgnoreAspectRatio,QtCore.Qt.SmoothTransformation))
		self.label.setAlignment(QtCore.Qt.AlignCenter)
		
		#pixmap = QtGui.QPixmap("wheel.png")
		#self.label_2.setPixmap(QtGui.QPixmap(pixmap).scaled(650, 650, #QtCore.Qt.IgnoreAspectRatio,QtCore.Qt.SmoothTransformation))
		#self.label_2.setAlignment(QtCore.Qt.AlignCenter)
		
		im = Image.open('Gluecksrad_750_2.png')
		im = im.convert("RGBA")
		data = im.tobytes("raw","RGBA")
		qim = ImageQt(im)
		pix = QtGui.QPixmap.fromImage(qim)
		#self.label_2.setPixmap(pix)
		#self.graphicsScene.addPixmap(pix)
		#pix.show()
		#self.label_2(pix)
     
		self.load_image()
		self.label['image'] = self.img_dict[0]
		self.load_images()
           
     
	def start_rotate(self,event=None):
		if not self.angle_step:
			self.angle_step = 10
			self.angle = self.angle// 10 * 10
			self.img_rotate()
			self.Button['state'] = 'disabled'
			self.after(int(4500+random()*1000),self.wheel_stop)
     
	def load_images(self):
		if self.load_angle < 360:
			self.load_image()
			self.after(1,self.load_images)
     
     
	def load_image(self):
		self.img_dict[self.load_angle] = ImageQt(self.label_2.rotate(self.load_angle))
		#self.img_dict[self.load_angle] = ImageQt.PhotoImage(self.label_pil_img.rotate(self.load_angle))
		self.load_angle += 10
     
	def img_rotate(self):
		self.angle += self.angle_step
		self.angle = self.angle % 360
		if self.angle_step != 10:
			self.img = ImageQt(self.label_2.rotate(self.angle))
			self.label['image'] = self.img
			if not (self.angle % 15):
				self.angle_step = max(0,self.angle_step-1)
			if self.angle_step:
				self.after(self.step,self.img_rotate)
			else:
				self.Button['state'] = 'normal'
				print(self.angle)

		else:
			if self.angle not in self.img_dict:
				self.img_dict[self.angle] = ImageQt(self.label_2.rotate(self.angle))
			self.label['image'] = self.img_dict[self.angle]
			self.after(self.step,self.img_rotate)
     
	def wheel_stop(self,event=None):
		self.angle_step = 5


def main():
	app = Qt.QApplication(sys.argv)
	app_now = Application()
	app_now.show()
	#full ohne border
	#app_now.showFullScreen()
	app.exec_()

if __name__ == '__main__':
	main()
hier die ui

Code: Alles auswählen

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>961</width>
        <height>783</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
         <widget class="QWidget" name="widget" native="true">
          <layout class="QVBoxLayout" name="verticalLayout_2">
           <item>
            <widget class="QLabel" name="label">
             <property name="minimumSize">
              <size>
               <width>0</width>
               <height>50</height>
              </size>
             </property>
             <property name="maximumSize">
              <size>
               <width>16777215</width>
               <height>50</height>
              </size>
             </property>
             <property name="font">
              <font>
               <pointsize>48</pointsize>
               <weight>75</weight>
               <bold>true</bold>
              </font>
             </property>
             <property name="autoFillBackground">
              <bool>false</bool>
             </property>
             <property name="text">
              <string>v</string>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QLabel" name="label_2">
             <property name="text">
              <string>TextLabel</string>
             </property>
            </widget>
           </item>
          </layout>
         </widget>
        </item>
        <item>
         <widget class="QWidget" name="widget_2" native="true">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>100</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>16777215</width>
            <height>100</height>
           </size>
          </property>
          <layout class="QHBoxLayout" name="horizontalLayout_2">
           <item>
            <spacer name="horizontalSpacer_3">
             <property name="orientation">
              <enum>Qt::Horizontal</enum>
             </property>
             <property name="sizeHint" stdset="0">
              <size>
               <width>40</width>
               <height>20</height>
              </size>
             </property>
            </spacer>
           </item>
           <item>
            <widget class="QPushButton" name="start">
             <property name="minimumSize">
              <size>
               <width>0</width>
               <height>90</height>
              </size>
             </property>
             <property name="maximumSize">
              <size>
               <width>16777215</width>
               <height>90</height>
              </size>
             </property>
             <property name="font">
              <font>
               <pointsize>80</pointsize>
               <weight>75</weight>
               <bold>true</bold>
              </font>
             </property>
             <property name="text">
              <string>START</string>
             </property>
            </widget>
           </item>
           <item>
            <spacer name="horizontalSpacer_4">
             <property name="orientation">
              <enum>Qt::Horizontal</enum>
             </property>
             <property name="sizeHint" stdset="0">
              <size>
               <width>40</width>
               <height>20</height>
              </size>
             </property>
            </spacer>
           </item>
          </layout>
         </widget>
        </item>
       </layout>
      </widget>
     </widget>
     <resources/>
     <connections/>
    </ui>
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Montag 14. August 2017, 10:13

Ich habe weiter gemacht und kann jetzt das Bild um 15°, aber leider schaffe ich es nicht wenn man Button anklickt das sich das Bild 4 Sekunden + Zufall (1-2 Sekunden ) dreht, hat da niemand eine Idee oder ein Beispiel wie ich das realisieren kann, hiermit kann ich es um 15° drehen, mir fehlt einfach die Berechnung um das Bild gewisse zeit zu drehen im Moment bekomme ich es nicht hin, vielleicht geht es auch nicht mit label das weiß ich nicht, hoffe auf eure Unterstützung.
Danke

Code: Alles auswählen

pixmap1 = QtGui.QPixmap(self.img)
		self.rotation += 15
		transform = QtGui.QTransform().rotate(self.rotation)
		pixmap1 = pixmap1.transformed(transform, QtCore.Qt.SmoothTransformation)
		self.label_2.setPixmap(pixmap1)
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Dienstag 15. August 2017, 07:41

Und wo muss ich dieses pixmap1 in Dein voriges Script hineinkopieren, damit etwas läuft?

Und dort finde ich auch kein self.img

Und bei Deinem Script erhalte ich folgende Fehlermeldung:

AttributeError: 'QLabel' object has no attribute 'rotate'

Stelle doch bitte ein Beispiel herein, das auch läuft
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Dienstag 15. August 2017, 09:07

Sorry, hier ein Beispiel, wo ich das bild um 15° drehen.
Danke

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-
     
import sys, math
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import Qt
from PyQt5.uic import loadUi
     
class Application(Qt.QMainWindow):
	def __init__(self, parent=None):
		super().__init__(parent)
		#### ohne border
		#self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
		
		self.ui = loadUi("wheel_gui.ui", self)
		
		self.start.clicked.connect(self.rotate_pixmap)
           
		pixmap = QtGui.QPixmap("pfeilunten1.png")
		self.label.setPixmap(
            QtGui.QPixmap(pixmap).scaled(50, 50, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation))
		self.label.setAlignment(QtCore.Qt.AlignCenter)

		self.img = (QtGui.QImage("Bild.png").scaled(580, 580, QtCore.Qt.IgnoreAspectRatio,
                                                                QtCore.Qt.SmoothTransformation))

		pixmap = QtGui.QPixmap(self.img)

		diag = (pixmap.width() ** 0 + pixmap.height() ** 0) ** 0.0
		self.label_2.setMinimumSize(diag, diag)
		self.label_2.setAlignment(QtCore.Qt.AlignCenter)
		self.label_2.setPixmap(pixmap)

		self.rotation = 0

	def rotate_pixmap(self):
		
		pixmap = QtGui.QPixmap(self.img)
		self.rotation += 15
		
		transform = QtGui.QTransform().rotate(self.rotation)
		pixmap = pixmap.transformed(transform, QtCore.Qt.SmoothTransformation)
		self.label_2.setPixmap(pixmap)
           
           
def main():
	app = Qt.QApplication(sys.argv)
	app_now = Application()
	app_now.show()
	#full ohne border
	#app_now.showFullScreen()
	app.exec_()
     
if __name__ == '__main__':
	main()
BlackJack

Dienstag 15. August 2017, 09:13

Code: Alles auswählen

diag = (pixmap.width() ** 0 + pixmap.height() ** 0) ** 0.0
Das ist eine ziemlich umständliche Art ``diag = 1`` zu schreiben. :shock:
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Dienstag 15. August 2017, 09:23

Hallo @BlackJack hast du recht, aber so funktioniert es bei mir ohne das die Größe des Bildes verändert wird, vielleicht brauche ich es gar nicht, k.a. danke für den Hinweis ich werde schauen wie man das richtig macht, das die Größe des Bildes immer gleich bleibt.

diag = (pixmap.width()**2 + pixmap.height()**2)**0.1
so geht es auch ohne das die Größe verändert wird

Danke
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Dienstag 15. August 2017, 09:55

Gut das geht jetzt. Wenn mann schnell hintereinander die Leertaste drückt, dann dreht sich das Rad.

@ganja: jetzt brauchst Du doch nur noch einen Timer, der in kurzen Zeitabständen die Leertaste drückt oder die dazugehörige Methode aufruft, dann dreht sich das Rad.

Übrigens: 15 ° Schritte sind gar nicht gut, das sieht so aus, als ob manches still steht. Ich hatte deswegen bei der tkinter Version 10 ° Schritte genommen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Dienstag 15. August 2017, 10:21

@ganja: oben schreibst Du:

Code: Alles auswählen

        self.timer = QtCore.QTimer()
        self.start.clicked.connect(self.start_rotate_pixmap)
Und dann definiert Du etwa:

Code: Alles auswählen

    def start_rotate_pixmap(self):
        self.timer.timeout.connect(self.rotate_pixmap)
        self.timer.start(20)
Und bei den Grad solltest Du keine 15 ° nehmen. Am besten nimmst Du etwas was nicht gleich mit 15 aufgeht, etwa 9 ° wären gar nicht schlecht.

Ach so, Du hast ja eventuell gar keine Teilung in 24 sondern nur in 8 Teile, also keine 15 ° sondern 45 ° Schritte. Aber besser, wenn sich die Stellungen nicht so schnell wiederholen.

Und dann brauchst Du nur noch einen zweiten Timer, der nach einer gewissen Zeit dafür sorgt, daß sich das Rad verlangsamt und zum Stillstand kommt und dann wird auch der erste Timer gekillt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Dienstag 15. August 2017, 10:43

ganja hat geschrieben: diag = (pixmap.width()**2 + pixmap.height()**2)**0.1
so geht es auch ohne das die Größe verändert wird
Danke
So geht es nicht, denn die Wurzel ist 0.5 und nicht 0.1
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Dienstag 15. August 2017, 13:58

hallo @Alfons Mittelmeyer Danke dir, jetzt habe ich es versucht mit dem 2 timer, aber leider muss ich aufgeben, ich habe gedacht mit dem Beispiel aus Progressbar würde es gehen aber ich bekomme es nicht hin,schade, habe gedacht einfach eine funktion mit der man timer.stop() aufruft, muss weiter schauen ob ich ein Beispiel irgendwo finde
Vielen Dank trotzdem

Code: Alles auswählen

def timerEvent(self, e):
    if self.step >= 100:
        self.timer.stop()
       # self.btn.setText('Finished')
        return

    self.step = self.step + 1
   # self.pbar.setValue(self.step)


def doAction(self):
    if self.timer.isActive():
        self.timer.stop()
        self.btn.setText('Start')
    else:
        self.timer.start(100, self)
        #self.btn.setText('Stop')
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Freitag 18. August 2017, 01:18

ganja hat geschrieben:hallo @Alfons Mittelmeyer Danke dir, jetzt habe ich es versucht mit dem 2 timer, aber leider muss ich aufgeben, ich habe gedacht mit dem Beispiel aus Progressbar würde es gehen aber ich bekomme es nicht hin,schade, habe gedacht einfach eine funktion mit der man timer.stop() aufruft, muss weiter schauen ob ich ein Beispiel irgendwo finde
Vielen Dank trotzdem

Code: Alles auswählen

def timerEvent(self, e):
    if self.step >= 100:
        self.timer.stop()
       # self.btn.setText('Finished')
        return

    self.step = self.step + 1
   # self.pbar.setValue(self.step)


def doAction(self):
    if self.timer.isActive():
        self.timer.stop()
        self.btn.setText('Start')
    else:
        self.timer.start(100, self)
        #self.btn.setText('Stop')
Sorry, wo ist denn da ein zweiter timer? Und kein Mensch kann Dein Beispiel nachvollziehen, denn wo sind Deine images? Wenn es keiner starten kann. warum sollte Dir jemand helfen können?

Also ich habe Dein erstes Image auskommentiert, denn das habe ich nicht. Und dann habe ich folgendes als fortune.png genommen:

Bild

Und das ist dann das mit zweitem Timer, allerdings ohne langsamer werden:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-
     
import sys, math
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import Qt
from PyQt5.uic import loadUi
     
class Application(Qt.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        #### ohne border
        #self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
       
        self.ui = loadUi("wheel_gui.ui", self)
       
        self.timer = QtCore.QTimer()
        self.start.clicked.connect(self.start_rotate_pixmap)
        self.timer2 = QtCore.QTimer()
        
        
        #pixmap = QtGui.QPixmap("pfeilunten1.png")
        #self.label.setPixmap(
            #QtGui.QPixmap(pixmap).scaled(50, 50, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation))
        #self.label.setAlignment(QtCore.Qt.AlignCenter)
 
        self.img = (QtGui.QImage("fortune.png").scaled(580, 580, QtCore.Qt.IgnoreAspectRatio,
                                                                QtCore.Qt.SmoothTransformation))
 
        self.pixmap = QtGui.QPixmap(self.img)
 
        diag = (self.pixmap.width() ** 0 + self.pixmap.height() ** 0) ** 0.0
        self.label_2.setMinimumSize(diag, diag)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setPixmap(self.pixmap)
        self.rotation = 0
 
 
    def rotate_pixmap(self):
       
        self.rotation = (self.rotation + 1) % 360
        transform = QtGui.QTransform().rotate(self.rotation)
        pixmap = self.pixmap.transformed(transform, QtCore.Qt.SmoothTransformation)
        self.label_2.setPixmap(pixmap)

    def start_rotate_pixmap(self):
        self.timer.timeout.connect(self.rotate_pixmap)
        self.timer.start(20)
        self.timer2.setSingleShot(True)
        self.timer2.timeout.connect(self.stop_timer)
        self.timer2.start(5000)

    def stop_timer(self):
        self.timer.stop()
           
def main():
    app = Qt.QApplication(sys.argv)
    app_now = Application()
    app_now.show()
    #full ohne border
    #app_now.showFullScreen()
    app.exec_()
     
if __name__ == '__main__':
    main()
Und außerdem solltest Du, während das Rad läuft, den Start Button disablen.

Achtung mit Deiner Rotation stimmt etwas nicht. Ich habe es mal mit Schrittweite 1 gemacht, aber bei jedem Start wird es mehr. Das mußt Du mal überprüfen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sonntag 20. August 2017, 11:29

Fehler gefunden. Die connects für die Timer darf man nur einmal machen, sonst feuern die Timer immer öfter gleich auf einmal. Und jetzt ist es auch mit Verlangsamung und Endpositionierung in 15 Grad Schritten.

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-
     
import sys, math
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import Qt
from PyQt5.uic import loadUi
from random import random

     
class Application(Qt.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        #### ohne border
        #self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
       
        self.ui = loadUi("wheel_gui.ui", self)
       
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.rotate_pixmap)

        self.start.clicked.connect(self.start_rotate_pixmap)
        self.timer2 = QtCore.QTimer()
        self.timer2.setSingleShot(True)
        self.timer2.timeout.connect(self.stop_timer)
       
       
        #pixmap = QtGui.QPixmap("pfeilunten1.png")
        #self.label.setPixmap(
            #QtGui.QPixmap(pixmap).scaled(50, 50, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation))
        #self.label.setAlignment(QtCore.Qt.AlignCenter)
 
        self.img = (QtGui.QImage("fortune.png").scaled(580, 580, QtCore.Qt.IgnoreAspectRatio,
                                                                QtCore.Qt.SmoothTransformation))
 
        self.pixmap = QtGui.QPixmap(self.img)
 
        diag = (self.pixmap.width() ** 0 + self.pixmap.height() ** 0) ** 0.0
        self.label_2.setMinimumSize(diag, diag)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setPixmap(self.pixmap)
        self.rotation = 0
 
 
    def rotate_pixmap(self):
       
        self.rotation = (self.rotation + self.step) % 360
        if self.step < 9:
            if not self.rotation % 15:
                self.step -= 1
                if not self.step:
                    self.timer.stop()
            

        transform = QtGui.QTransform().rotate(self.rotation)
        pixmap = self.pixmap.transformed(transform, QtCore.Qt.SmoothTransformation)
        self.label_2.setPixmap(pixmap)
 
    def start_rotate_pixmap(self):
        self.step = 9
        self.timer.start(20)
        self.timer2.start(int(4500+random()*1000))
 
    def stop_timer(self):
        self.step = 8           

def main():
    app = Qt.QApplication(sys.argv)
    app_now = Application()
    app_now.show()
    #full ohne border
    #app_now.showFullScreen()
    app.exec_()
     
if __name__ == '__main__':
    main()
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Sonntag 20. August 2017, 17:40

Vielen DANK @Alfons Mittelmeyer, Dankeschön, mucho gracias, Koran dankon,Many Thanks
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Dienstag 22. August 2017, 16:25

Hallo, jetzt habe ich einen Fehler den ich warscheinlich verursache, wenn ich das jetzt weiter ausbat möchte siehe code von @Alfons Mittelmeyer

Code: Alles auswählen

def rotate_pixmap(self):
       
        self.rotation = (self.rotation + self.step) % 360
        if self.step < 9:
            if not self.rotation % 15:
                self.step -= 1
                if not self.step:
                    self.timer.stop()
                    print (self.rotation) #!
                    self.stop.check() #!

def stop_check(self):
                        if  0 <= self.rotation <= 60: 
                        print ("ja")
                        self.check_gpio()
# Wenn "ja" zutrifft nach dem self.check_gpio() fertig ist dreht sich das Rad einwenig weiter! Rufe ich self.stop_check() an falscher            stelle auf? 
#self.check_gpio macht nur einen pin on und nach gewisser zeit wieder off
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Dienstag 22. August 2017, 19:36

ganja hat geschrieben:Hallo, jetzt habe ich einen Fehler den ich warscheinlich verursache, wenn ich das jetzt weiter ausbat möchte siehe code von @Alfons Mittelmeyer

Code: Alles auswählen

def rotate_pixmap(self):
       
        self.rotation = (self.rotation + self.step) % 360
        if self.step < 9:
            if not self.rotation % 15:
                self.step -= 1
                if not self.step:
                    self.timer.stop()
                    print (self.rotation) #!
                    self.stop.check() #!

def stop_check(self):
                        if  0 <= self.rotation <= 60: 
                        print ("ja")
                        self.check_gpio()
# Wenn "ja" zutrifft nach dem self.check_gpio() fertig ist dreht sich das Rad einwenig weiter! Rufe ich self.stop_check() an falscher            stelle auf? 
#self.check_gpio macht nur einen pin on und nach gewisser zeit wieder off
Also, bei diesem rotate_pixmap dreht sich bei mir überhaupt nichts. Da ist ja nichts drin, damit sich etwas dreht.
Und bei print("ja") bekomme ich einen indentation error.

self.stop.check geht auch nicht, denn ein self.stop gibt es nicht. Und self.check_gpio gibt es auch nicht. Da geht ja dann sowieso nichts. Wundert mich, wieso dann bei Dir überhaupt etwas geht.
Antworten