aus tkinter

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

aus tkinter

Beitragvon ganja » 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

  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. import sys, math
  5. from PyQt5 import QtCore, QtGui, QtWidgets
  6. from PyQt5 import Qt
  7. from PyQt5.uic import loadUi
  8.  
  9. from PIL import Image
  10. import PIL
  11. from PIL.ImageQt import ImageQt
  12.  
  13. #from Image import Image
  14. #from Image import *
  15.  
  16.  
  17. class Application(Qt.QMainWindow):
  18.     def __init__(self, parent=None):
  19.         super().__init__(parent)
  20.         #### ohne border
  21.         #self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
  22.        
  23.         self.ui = loadUi("wheel_gui.ui", self)
  24.        
  25.         self.start.clicked.connect(self.start_rotate)
  26.        
  27.         self.angle=0
  28.         self.img_dict = {}
  29.         self.angle_step = 0
  30.         self.load_angle = 0
  31.         self.step = 20
  32.        
  33.         pixmap = QtGui.QPixmap("pfeilunten1.png")
  34.         self.label.setPixmap(QtGui.QPixmap(pixmap).scaled(50, 50, QtCore.Qt.IgnoreAspectRatio,QtCore.Qt.SmoothTransformation))
  35.         self.label.setAlignment(QtCore.Qt.AlignCenter)
  36.        
  37.         #pixmap = QtGui.QPixmap("wheel.png")
  38.         #self.label_2.setPixmap(QtGui.QPixmap(pixmap).scaled(650, 650, #QtCore.Qt.IgnoreAspectRatio,QtCore.Qt.SmoothTransformation))
  39.         #self.label_2.setAlignment(QtCore.Qt.AlignCenter)
  40.        
  41.         im = Image.open('Gluecksrad_750_2.png')
  42.         im = im.convert("RGBA")
  43.         data = im.tobytes("raw","RGBA")
  44.         qim = ImageQt(im)
  45.         pix = QtGui.QPixmap.fromImage(qim)
  46.         #self.label_2.setPixmap(pix)
  47.         #self.graphicsScene.addPixmap(pix)
  48.         #pix.show()
  49.         #self.label_2(pix)
  50.      
  51.         self.load_image()
  52.         self.label['image'] = self.img_dict[0]
  53.         self.load_images()
  54.            
  55.      
  56.     def start_rotate(self,event=None):
  57.         if not self.angle_step:
  58.             self.angle_step = 10
  59.             self.angle = self.angle// 10 * 10
  60.             self.img_rotate()
  61.             self.Button['state'] = 'disabled'
  62.             self.after(int(4500+random()*1000),self.wheel_stop)
  63.      
  64.     def load_images(self):
  65.         if self.load_angle < 360:
  66.             self.load_image()
  67.             self.after(1,self.load_images)
  68.      
  69.      
  70.     def load_image(self):
  71.         self.img_dict[self.load_angle] = ImageQt(self.label_2.rotate(self.load_angle))
  72.         #self.img_dict[self.load_angle] = ImageQt.PhotoImage(self.label_pil_img.rotate(self.load_angle))
  73.         self.load_angle += 10
  74.      
  75.     def img_rotate(self):
  76.         self.angle += self.angle_step
  77.         self.angle = self.angle % 360
  78.         if self.angle_step != 10:
  79.             self.img = ImageQt(self.label_2.rotate(self.angle))
  80.             self.label['image'] = self.img
  81.             if not (self.angle % 15):
  82.                 self.angle_step = max(0,self.angle_step-1)
  83.             if self.angle_step:
  84.                 self.after(self.step,self.img_rotate)
  85.             else:
  86.                 self.Button['state'] = 'normal'
  87.                 print(self.angle)
  88.  
  89.         else:
  90.             if self.angle not in self.img_dict:
  91.                 self.img_dict[self.angle] = ImageQt(self.label_2.rotate(self.angle))
  92.             self.label['image'] = self.img_dict[self.angle]
  93.             self.after(self.step,self.img_rotate)
  94.      
  95.     def wheel_stop(self,event=None):
  96.         self.angle_step = 5
  97.  
  98.  
  99. def main():
  100.     app = Qt.QApplication(sys.argv)
  101.     app_now = Application()
  102.     app_now.show()
  103.     #full ohne border
  104.     #app_now.showFullScreen()
  105.     app.exec_()
  106.  
  107. if __name__ == '__main__':
  108.     main()

hier die ui
  1.     <?xml version="1.0" encoding="UTF-8"?>
  2.     <ui version="4.0">
  3.      <class>MainWindow</class>
  4.      <widget class="QMainWindow" name="MainWindow">
  5.       <property name="geometry">
  6.        <rect>
  7.         <x>0</x>
  8.         <y>0</y>
  9.         <width>961</width>
  10.         <height>783</height>
  11.        </rect>
  12.       </property>
  13.       <property name="windowTitle">
  14.        <string>MainWindow</string>
  15.       </property>
  16.       <widget class="QWidget" name="centralwidget">
  17.        <layout class="QVBoxLayout" name="verticalLayout">
  18.         <item>
  19.          <widget class="QWidget" name="widget" native="true">
  20.           <layout class="QVBoxLayout" name="verticalLayout_2">
  21.            <item>
  22.             <widget class="QLabel" name="label">
  23.              <property name="minimumSize">
  24.               <size>
  25.                <width>0</width>
  26.                <height>50</height>
  27.               </size>
  28.              </property>
  29.              <property name="maximumSize">
  30.               <size>
  31.                <width>16777215</width>
  32.                <height>50</height>
  33.               </size>
  34.              </property>
  35.              <property name="font">
  36.               <font>
  37.                <pointsize>48</pointsize>
  38.                <weight>75</weight>
  39.                <bold>true</bold>
  40.               </font>
  41.              </property>
  42.              <property name="autoFillBackground">
  43.               <bool>false</bool>
  44.              </property>
  45.              <property name="text">
  46.               <string>v</string>
  47.              </property>
  48.             </widget>
  49.            </item>
  50.            <item>
  51.             <widget class="QLabel" name="label_2">
  52.              <property name="text">
  53.               <string>TextLabel</string>
  54.              </property>
  55.             </widget>
  56.            </item>
  57.           </layout>
  58.          </widget>
  59.         </item>
  60.         <item>
  61.          <widget class="QWidget" name="widget_2" native="true">
  62.           <property name="minimumSize">
  63.            <size>
  64.             <width>0</width>
  65.             <height>100</height>
  66.            </size>
  67.           </property>
  68.           <property name="maximumSize">
  69.            <size>
  70.             <width>16777215</width>
  71.             <height>100</height>
  72.            </size>
  73.           </property>
  74.           <layout class="QHBoxLayout" name="horizontalLayout_2">
  75.            <item>
  76.             <spacer name="horizontalSpacer_3">
  77.              <property name="orientation">
  78.               <enum>Qt::Horizontal</enum>
  79.              </property>
  80.              <property name="sizeHint" stdset="0">
  81.               <size>
  82.                <width>40</width>
  83.                <height>20</height>
  84.               </size>
  85.              </property>
  86.             </spacer>
  87.            </item>
  88.            <item>
  89.             <widget class="QPushButton" name="start">
  90.              <property name="minimumSize">
  91.               <size>
  92.                <width>0</width>
  93.                <height>90</height>
  94.               </size>
  95.              </property>
  96.              <property name="maximumSize">
  97.               <size>
  98.                <width>16777215</width>
  99.                <height>90</height>
  100.               </size>
  101.              </property>
  102.              <property name="font">
  103.               <font>
  104.                <pointsize>80</pointsize>
  105.                <weight>75</weight>
  106.                <bold>true</bold>
  107.               </font>
  108.              </property>
  109.              <property name="text">
  110.               <string>START</string>
  111.              </property>
  112.             </widget>
  113.            </item>
  114.            <item>
  115.             <spacer name="horizontalSpacer_4">
  116.              <property name="orientation">
  117.               <enum>Qt::Horizontal</enum>
  118.              </property>
  119.              <property name="sizeHint" stdset="0">
  120.               <size>
  121.                <width>40</width>
  122.                <height>20</height>
  123.               </size>
  124.              </property>
  125.             </spacer>
  126.            </item>
  127.           </layout>
  128.          </widget>
  129.         </item>
  130.        </layout>
  131.       </widget>
  132.      </widget>
  133.      <resources/>
  134.      <connections/>
  135.     </ui>
ganja
User
Beiträge: 92
Registriert: Mittwoch 3. Dezember 2014, 07:44

Re: aus tkinter

Beitragvon ganja » 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
  1. pixmap1 = QtGui.QPixmap(self.img)
  2.         self.rotation += 15
  3.         transform = QtGui.QTransform().rotate(self.rotation)
  4.         pixmap1 = pixmap1.transformed(transform, QtCore.Qt.SmoothTransformation)
  5.         self.label_2.setPixmap(pixmap1)
Alfons Mittelmeyer
User
Beiträge: 1557
Registriert: Freitag 31. Juli 2015, 13:34

Re: aus tkinter

Beitragvon Alfons Mittelmeyer » 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: 92
Registriert: Mittwoch 3. Dezember 2014, 07:44

Re: aus tkinter

Beitragvon ganja » Dienstag 15. August 2017, 09:07

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

  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3.      
  4. import sys, math
  5. from PyQt5 import QtCore, QtGui, QtWidgets
  6. from PyQt5 import Qt
  7. from PyQt5.uic import loadUi
  8.      
  9. class Application(Qt.QMainWindow):
  10.     def __init__(self, parent=None):
  11.         super().__init__(parent)
  12.         #### ohne border
  13.         #self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
  14.        
  15.         self.ui = loadUi("wheel_gui.ui", self)
  16.        
  17.         self.start.clicked.connect(self.rotate_pixmap)
  18.            
  19.         pixmap = QtGui.QPixmap("pfeilunten1.png")
  20.         self.label.setPixmap(
  21.             QtGui.QPixmap(pixmap).scaled(50, 50, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation))
  22.         self.label.setAlignment(QtCore.Qt.AlignCenter)
  23.  
  24.         self.img = (QtGui.QImage("Bild.png").scaled(580, 580, QtCore.Qt.IgnoreAspectRatio,
  25.                                                                 QtCore.Qt.SmoothTransformation))
  26.  
  27.         pixmap = QtGui.QPixmap(self.img)
  28.  
  29.         diag = (pixmap.width() ** 0 + pixmap.height() ** 0) ** 0.0
  30.         self.label_2.setMinimumSize(diag, diag)
  31.         self.label_2.setAlignment(QtCore.Qt.AlignCenter)
  32.         self.label_2.setPixmap(pixmap)
  33.  
  34.         self.rotation = 0
  35.  
  36.     def rotate_pixmap(self):
  37.        
  38.         pixmap = QtGui.QPixmap(self.img)
  39.         self.rotation += 15
  40.        
  41.         transform = QtGui.QTransform().rotate(self.rotation)
  42.         pixmap = pixmap.transformed(transform, QtCore.Qt.SmoothTransformation)
  43.         self.label_2.setPixmap(pixmap)
  44.            
  45.            
  46. def main():
  47.     app = Qt.QApplication(sys.argv)
  48.     app_now = Application()
  49.     app_now.show()
  50.     #full ohne border
  51.     #app_now.showFullScreen()
  52.     app.exec_()
  53.      
  54. if __name__ == '__main__':
  55.     main()
Benutzeravatar
BlackJack
Moderator
Beiträge: 32975
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: aus tkinter

Beitragvon BlackJack » Dienstag 15. August 2017, 09:13

  1. diag = (pixmap.width() ** 0 + pixmap.height() ** 0) ** 0.0

Das ist eine ziemlich umständliche Art ``diag = 1`` zu schreiben. :shock:
“Programs must be written for people to read, and only incidentally for machines to execute.” — Abelson & Sussman, SICP (preface to the first edition)
ganja
User
Beiträge: 92
Registriert: Mittwoch 3. Dezember 2014, 07:44

Re: aus tkinter

Beitragvon ganja » 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: 1557
Registriert: Freitag 31. Juli 2015, 13:34

Re: aus tkinter

Beitragvon Alfons Mittelmeyer » 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: 1557
Registriert: Freitag 31. Juli 2015, 13:34

Re: aus tkinter

Beitragvon Alfons Mittelmeyer » Dienstag 15. August 2017, 10:21

@ganja: oben schreibst Du:

  1.         self.timer = QtCore.QTimer()
  2.         self.start.clicked.connect(self.start_rotate_pixmap)


Und dann definiert Du etwa:

  1.     def start_rotate_pixmap(self):
  2.         self.timer.timeout.connect(self.rotate_pixmap)
  3.         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: 1557
Registriert: Freitag 31. Juli 2015, 13:34

Re: aus tkinter

Beitragvon Alfons Mittelmeyer » 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: 92
Registriert: Mittwoch 3. Dezember 2014, 07:44

Re: aus tkinter

Beitragvon ganja » 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
  1. def timerEvent(self, e):
  2.     if self.step >= 100:
  3.         self.timer.stop()
  4.        # self.btn.setText('Finished')
  5.         return
  6.  
  7.     self.step = self.step + 1
  8.    # self.pbar.setValue(self.step)
  9.  
  10.  
  11. def doAction(self):
  12.     if self.timer.isActive():
  13.         self.timer.stop()
  14.         self.btn.setText('Start')
  15.     else:
  16.         self.timer.start(100, self)
  17.         #self.btn.setText('Stop')

Zurück zu „Qt/KDE“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder