Нужно открыть картинку и вращать ее по часовой стрелке по команде. Вот мой код, в
который нужно вставить данную фичу:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QWidget, QInputDialog,
QPushButton, QApplication, QTextEdit, QLabel, QLineEdit,QFrame )
from PyQt5.QtGui import QBrush, QPalette, QPixmap, QPainter, QPen, QImage
from PyQt5.QtCore import Qt, QTimer, QPointF, QRect
from PIL import Image
class Collector(QWidget):
def __init__(self):
super().__init__()
self.timer = QTimer()
self.timer.timeout.connect(self.process_timeout)
self.timer.start(10) # 50 -- период в милисекундах
self.phi = 0
self.lbl = QLabel(self)
def process_timeout(self):
if self.phi == 0:
self.phi += 5
elif self.phi == 5:
self.phi -= 5
self.update()
def showInputTc_h(self):
text, ok = QInputDialog.getText(self, "input Dialog", "Enter data:")
if ok:
self.textEdit_Tc_h.setText(str(text))
def showInputTr(self):
text, ok = QInputDialog.getText(self, "input Dialog", "Enter data:")
if ok:
self.textEdit_Tr.setText(str(text))
def showInputTt(self):
text_Tt, ok = QInputDialog.getText(self, "input Dialog", "Enter data:")
if ok:
self.textEdit_Tt.setText(str(text_Tt))
def lable_text_button(self):
Tt = QPushButton("Tt", self)
Tt.move(480, 130)
Tc_h = QPushButton("Tc-h", self)
Tc_h.move(400, 10)
Tr = QPushButton("Tr", self)
Tr.move(900, 530)
self.textEdit_Tt = QLineEdit(self)
self.textEdit_Tt.setGeometry(QRect(100, 90, 81, 31))
self.textEdit_Tt.setObjectName("textEdit")
self.textEdit_Tt.move(400, 130)
Tt.clicked.connect(self.showInputTt)
self.textEdit_Tr = QLineEdit(self)
self.textEdit_Tr.setGeometry(QRect(100, 90, 81, 31))
self.textEdit_Tr.setObjectName("textEdit")
self.textEdit_Tr.move(800, 530)
Tr.clicked.connect(self.showInputTr)
self.textEdit_Tc_h = QLineEdit(self)
self.textEdit_Tc_h.setGeometry(QRect(100, 90, 81, 31))
self.textEdit_Tc_h.setObjectName("textEdit")
self.textEdit_Tc_h.move(300, 10)
Tc_h.clicked.connect(self.showInputTc_h)
def get_image_size(self, img):
im = Image.open(img)
(width, height) = im.size
return (width, height) # вернем ширину и висоту
def draw_y(self, qp, x0, y0, range_int, const_y):
for i in range(range_int):
y0 -= 20 * i
x1 = x0
y1 = y0 + 10
qp.drawLine(QPointF(x0, y0), QPointF(x1, y1))
y0 = const_y
def draw_x(self, qp, x0, y0, range_int, const_x):
for i in range(range_int):
x0 += 20 * i
y1 = y0
x1 = x0 + 10
qp.drawLine(QPointF(x0, y0), QPointF(x1, y1))
x0 = const_x
def paintEvent(self, e):
qp = QPainter()
qp.begin(self)
pen = QPen(Qt.red, 1)
qp.translate(0, self.height())
qp.scale(1, -1)
qp.setPen(pen)
pomp = QPixmap()
QFrame.paintEvent(self, e)
# width1 = 992,
# height = 679
list_y = [(292, 627, 12), (292, 320, 4), (485, 595, 2), (183, 183, 7), (465,
40, 3)]
list_x = [(150, 637, 7), (310, 385, 6), (486, 607, 27), (183, 64, 14), (480,
64, 6), (690, 64, 16)]
for y in list_y:
self.draw_y(qp=qp, x0=y[0], y0=y[1]+self.phi, range_int=y[2], const_y=y[1]+self.phi)
for x in list_x:
self.draw_x(qp=qp, x0=x[0]+self.phi, y0=x[1], range_int=x[2], const_x=x[0]+self.phi)
pen = QPen(Qt.blue, 1)
qp.setPen(pen)
list_y_cold = [(5, 627, 15), (240, 386, 3), (183, 317, 4), (296, 183, 2),
(485, 312, 3), (652, 562, 15)]
list_x_cold = [(10, 347, 3), (113, 347, 3), (199, 347, 6), (345, 347, 4),
(296, 153, 37), (485, 272, 26), (656, 570, 18)]
for y_cold in list_y_cold:
self.draw_y(qp=qp, x0=y_cold[0], y0=y_cold[1]+self.phi, range_int=y_cold[2],
const_y=y_cold[1]+self.phi)
for x_cold in list_x_cold:
self.draw_x(qp=qp, x0=x_cold[0]+self.phi, y0=x_cold[1], range_int=x_cold[2],
const_x=x_cold[0]+self.phi)
qp.end()
def main():
app = QApplication(sys.argv)
w = Collector()
palette = QPalette()
palette.setBrush(QPalette.Background, QBrush(QPixmap("images/scheme.jpg")))
size = w.get_image_size("images/scheme.jpg")
w.setMaximumSize(size[0], size[1])
w.setMinimumSize(size[0], size[1])
w.setWindowTitle('Sun')
w.setPalette(palette)
w.lable_text_button()
w.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
Ответы
Ответ 1
Чтобы вращать картинку, отображаемую с помощью QPixmap, можно QTransform().rotate()
использовать. Код, основанный на ответе @Jean-Sébastien:
#!/usr/bin/python3
"""Usage: rotate-image """
from PyQt5.Qt import QImage, QLabel, QPixmap, QTransform, QWidget, Qt
class ImageRotor(QWidget):
def __init__(self, image_path, parent=None):
super().__init__(parent)
self.label = QLabel(self)
self.image = QImage(image_path) # keep original image for rotation
self.angle = 0
self.label.setAlignment(Qt.AlignCenter) # NOTE: keep image on screen
pm = QPixmap(self.image)
self.resize(pm.width(), pm.height()) # fit window to image
self.label.setPixmap(pm)
self.setWindowTitle('PyQt5 Image Rotor')
def keyPressEvent(self, event):
# on any key
self.angle += 45 if event.key() == Qt.Key_Down else -45
t = QTransform().rotate(self.angle)
self.label.setPixmap(QPixmap(self.image).transformed(t))
return super().keyPressEvent(event)
if __name__ == '__main__':
import sys
from PyQt5.Qt import QApplication
if len(sys.argv) < 2: # wrong arguments
sys.exit(__doc__) # print usage
app = QApplication(sys.argv)
w = ImageRotor(sys.argv[1])
# center on screen
w.move(app.desktop().screen().rect().center() - w.rect().center())
w.show()
sys.exit(app.exec_())
При нажатии на любую клавишу, изображение, указанное в командной строке, вращается
на 45 градусов. Если нажать на клавишу ↓ («вниз»), то по часовой стрелке вращение.
начальный размер окна подгонятся под изображение
используется выравнивание по центру, чтобы при повороте изображение не убегало
сохраняется оригинальное изображение, чтобы повторные повороты не искажали бы картинку