def initUI(self): self.label = QLabel(self) pixmap = QPixmap('logo.png') pixmap = pixmap.scaledToWidth(200) self.label.setPixmap(pixmap) self.lay = QVBoxLayout() self.label.setAlignment(Qt.AlignCenter) self.hor = QHBoxLayout() # self.lay.setContentsMargins(-1,-1,-1,0) self.Hbox = QHBoxLayout() # self.Hbox.addStretch(1) # self.hor.setAlignment(Qt.AlignCenter) # self.lay.addLayout(self.hor) self.setStyleSheet('QWidget {background-color:white;border:none}') # self.label.setStyleSheet('Q {width:50px;height:auto}') self.height = 60 self.trycount = 0 self.setGeometry(300, 150, 400, 600) self.setWindowTitle('Welcome') self.nameline = QLineEdit() self.passwordline = QLineEdit() self.nameline.setPlaceholderText("Username...") self.passwordline.setPlaceholderText("Password...") self.passwordline.setEchoMode(QLineEdit.Password) self.nameline.setStyleSheet('QLineEdit {background-color:#EEE;height:40;border-radius:3px;font-family:Arial;padding:6px}') self.passwordline.setStyleSheet('QLineEdit {background-color:#EEE;height:40;border-radius:3px;font-family:Arial;padding:6px;}') self.status = QLabel() self.status.setStyleSheet("color:red") self.lay.addStretch(1) self.lay.addWidget(self.label) self.lay.addStretch(1) self.lay.addWidget(self.nameline) self.lay.addWidget(self.passwordline) self.lay.addWidget(self.status) self.lay.setAlignment(self.nameline, Qt.AlignBottom) self.lay.addLayout(self.Hbox) # self.lay.addStretch(1) self.signin = QPushButton('Sign in') self.signup = QPushButton('Sign up') self.signin.setStyleSheet('QPushButton {background-color:#4990E2;color:white;height:50;font-size:20px;border-radius:3px;font-family:Arial;}') self.signup.setStyleSheet('QPushButton {background-color:#7FDC89;color:white;height:50;font-size:20px;border-radius:3px;font-family:Arial;}') self.signin.clicked.connect(self.authentification) self.signup.clicked.connect(self.authentification) self.Hbox.addWidget(self.signin) self.Hbox.addWidget(self.signup) self.setLayout(self.lay) self.show()
def set_img(self, future): content = future.result() img = QImage() img.loadFromData(content) pixmap = QPixmap(img) if pixmap.isNull(): return None self.img_label.setPixmap( pixmap.scaledToWidth(self.img_label.width(), mode=Qt.SmoothTransformation))
def itemSelectionChanged(self): if not self.pauseUpdate: selected = self.fileTreeWidget.selectedItems() if len(selected) < 1: self.previewLabel.clear() else: image = QPixmap() imagePath = selected[0].text(4) + "/" + selected[0].text(0) image.load(imagePath) widgetWidth = self.previewLabel.width() self.previewLabel.setPixmap(image.scaledToWidth(widgetWidth))
def set_image(self, image_filename): size = 800 pixmap = QPixmap(image_filename) if pixmap.width() > pixmap.height(): if pixmap.width() > size: pixmap = pixmap.scaledToWidth(size) else: if pixmap.height() > size: pixmap = pixmap.scaledToHeight(size) self.ui.label.setPixmap(pixmap) self.ui.label.setMask(pixmap.mask()) self.ui.label.show()
def loadImage(self, path): self.markable_picture = QMarkablePicture(self) hbox = QHBoxLayout(self) picture = QPixmap(path) if picture.width() > self.maximumWidth(): picture = picture.scaledToWidth(self.maximumWidth()) if picture.height() > self.maximumHeight(): picture = picture.scaledToHeight(self.maximumHeight()) self.markable_picture.setPixmap(picture) hbox.addWidget(self.markable_picture) hbox.setContentsMargins(0, 0, 0, 0) self.setLayout(hbox)
def cloneBody(self, bodyspecName, dropPos, itemId=None, width=0): bodyDef = self.bodies[bodyspecName]; if not itemId: if bodyspecName not in self.nameIndex: self.nameIndex[bodyspecName] = 0; self.nameIndex[bodyspecName] += 1; itemId = "{}{}".format(bodyspecName, self.nameIndex[bodyspecName]); body = BodyItem(itemId, bodyspecName, 2); self.bodyInstances.append(body); body.setPos(dropPos); group = QGraphicsItemGroup(body); self.renderScene.addItem(body); width = width*self.UNITS_PER_METER or self.DEFAULT_BODY_SIZE; for shape in bodyDef["shapes"]: vertices = shape["vertices"]; if shape["type"] == "POLYGON": newItem = QGraphicsPolygonItem(QPolygonF(vertices)); if shape["type"] == "CIRCLE": p1, p2 = vertices radius = math.hypot(p2.x()-p1.x(), p2.y()-p1.y()); newItem = QGraphicsEllipseItem(p1.x()-radius, p1.y()-radius, radius*2, radius*2); pen = QPen(); pen.setWidth(0); newItem.setPen(pen); newItem.setParentItem(group); bounding = group.childrenBoundingRect(); imagePath = None; height = 0; if (bodyDef["image"]): imagePath = bodyDef["image"]; pixmap = QPixmap(imagePath); body.setPixmap(pixmap); pm = QGraphicsPixmapItem(pixmap.scaledToWidth(width), body); body.setImg(pm); pm.setFlags(QGraphicsItem.ItemStacksBehindParent); pm.setOffset(0, -pm.boundingRect().height()); group.setScale(width/self.TRANSCOORD_X); height = pm.boundingRect().height(); else: group.setScale(width/bounding.width()); height = bounding.height(); for item in body.childItems(): item.setPos(item.pos().x(), item.pos().y() + height) body.updateBorder(); return body;
def set_paragraph(self, h2='', h3='', text='', img=None): if h2 != '': lbl_h2 = QLabel(h2, self.inner) fnt = lbl_h2.font() fnt.setPointSize(self.H2_FONT_SIZE) lbl_h2.setFont(fnt) lbl_h2.setFixedHeight(self.H2_HEIGHT) lbl_h2.setAlignment(Qt.AlignBottom) lbl_h2.setMargin(self.SIDE_MARGIN) self.vbox.addWidget(lbl_h2) frm = QFrame(self.inner) frm.setFrameShape(QFrame.HLine) frm.setContentsMargins(self.SIDE_MARGIN, 0, self.SIDE_MARGIN, 0) plt = frm.palette() plt.setColor(QPalette.WindowText, Qt.darkGray) frm.setPalette(plt) self.vbox.addWidget(frm) if text != '': lbl_txt = QLabel(text, self.inner) lbl_txt.setWordWrap(True) fnt = lbl_txt.font() fnt.setPointSize(self.TEXT_FONT_SIZE) lbl_txt.setFont(fnt) lbl_txt.setMargin(self.SIDE_MARGIN) self.vbox.addWidget(lbl_txt) if img is not None: if self.params.lang == 'en': img += '_en.png' else: img += '_jp.png' pixmap = QPixmap(img) if not pixmap.isNull(): lbl_img = QLabel(self.inner) lbl_img.setPixmap(pixmap) self.lbl_img_list.append(lbl_img) self.pixmap_list.append(pixmap.scaledToWidth(pixmap.width())) self.vbox.addWidget(lbl_img) self.inner.setLayout(self.vbox)
def put_cv2_image(self, image, widget): height, width = image.shape[0:2] qImg = self.cv2toQImage(image) pixmap = QPixmap(qImg) if height > width: if height > self.preview_size: pixmap = pixmap.scaledToHeight(self.preview_size) else: if width > self.preview_size: pixmap = pixmap.scaledToWidth(self.preview_size) widget.setPixmap(pixmap) #give hints to DrawableLabel() and MyLabel() widget.perspective = self.perspective widget.focus = self.focus widget.slitpos = self.slitpos w = pixmap.width() h = pixmap.height() x = ( self.preview_size - w ) // 2 y = ( self.preview_size - h ) // 2 widget.geometry = x,y,w,h
def scaledPixmap(path: str, scale: float) -> QPixmap: pixmap = QPixmap(path) if scale > 1.0: pixmap = pixmap.scaledToWidth(pixmap.width() * scale, Qt.SmoothTransformation) pixmap.setDevicePixelRatio(scale) return pixmap
class Ui_AboutWindow(QMainWindow): def __init__(self): super(Ui_AboutWindow, self).__init__() self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.CustomizeWindowHint) self.setWindowIcon(QIcon('icon.ico')) self.setFixedSize(241, 190) def setupUi(self): self.centralwidget = QWidget(self) with open("style.css", 'r') as file: self.centralwidget.setStyleSheet(file.read()) self.verticalLayoutWidget = QWidget(self.centralwidget) self.verticalLayoutWidget.setGeometry(QRect(10, 10, 221, 81)) self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.label_logo = QLabel(self.verticalLayoutWidget) self.pixmap = QPixmap('icon.ico') self.pixmap = self.pixmap.scaledToWidth(30, Qt.SmoothTransformation) self.label_logo.setPixmap(self.pixmap) self.verticalLayout.addWidget(self.label_logo, 0, Qt.AlignHCenter) self.label_name = QLabel(self.verticalLayoutWidget) font = QFont() font.setPointSize(13) font.setStyleStrategy(QFont.PreferAntialias) self.label_name.setFont(font) self.label_name.setLayoutDirection(Qt.LeftToRight) self.verticalLayout.addWidget(self.label_name, 0, Qt.AlignHCenter) self.label_version = QLabel(self.verticalLayoutWidget) font = QFont() font.setPointSize(10) self.label_version.setFont(font) self.label_version.setLayoutDirection(Qt.LeftToRight) self.verticalLayout.addWidget(self.label_version, 0, Qt.AlignHCenter) self.verticalLayoutWidget_2 = QWidget(self.centralwidget) self.verticalLayoutWidget_2.setGeometry(QRect(10, 100, 221, 81)) self.verticalLayout_2 = QVBoxLayout(self.verticalLayoutWidget_2) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.label_copyright = QLabel(self.verticalLayoutWidget_2) font = QFont() font.setPointSize(10) self.label_copyright.setFont(font) self.label_copyright.setLayoutDirection(Qt.LeftToRight) self.verticalLayout_2.addWidget(self.label_copyright, 0, Qt.AlignHCenter) self.label_author = QLabel(self.verticalLayoutWidget_2) font = QFont() font.setPointSize(10) self.label_author.setFont(font) self.label_author.setLayoutDirection(Qt.LeftToRight) self.verticalLayout_2.addWidget(self.label_author, 0, Qt.AlignHCenter) self.button_quit_about = QPushButton(self.verticalLayoutWidget_2) self.verticalLayout_2.addWidget(self.button_quit_about) self.button_quit_about.setMinimumSize(100, 30) self.button_quit_about.setProperty('class', 'Aqua') with open("style.css", 'r') as file: self.button_quit_about.setStyleSheet(file.read()) self.setCentralWidget(self.centralwidget) self.retranslateUi() QMetaObject.connectSlotsByName(self) def retranslateUi(self): _translate = QCoreApplication.translate self.setWindowTitle(_translate("MainWindow", "About")) self.label_name.setText(_translate("MainWindow", "PyDebloatX")) self.label_version.setText(_translate("MainWindow", "")) self.label_copyright.setText( _translate("MainWindow", "Copyright © 2020 by")) self.label_author.setText( _translate("MainWindow", "Anton Grouchtchak.")) self.button_quit_about.setText(_translate("MainWindow", "OK"))
class Explorer(QWidget): path='./imgs3/' dirs=[] currentDir=1 currentDirSize=0 currentFile=0 projectInfo=[] infoList=[] infoIndex=[] infoLabel=[] img='' infoEdit=[] checkBox=[] #checkList=['火车站', '地铁/轻轨站', '其它', '城市中心', '城市边缘', '郊外', '等候式', '通过式', '结合式', '宽敞的站前广场', '必要的集散空间', '垂直组织集约化用地', '其它', '换乘地铁', '换乘巴士', '换乘其它', '商业', '餐饮', '办公', '居住', '娱乐', '其它', '简约', '适中', '复杂', '上跨式', '侧立式' ,'其它', '线性', '非线性', '混合'] #checkListGroup=['类型', '城市区位', '客流模式', '前广场', '换乘', '附属功能', '形式复杂度', '与铁道关系', '线性/非线性'] checkList=[] checkListGroup=[] df=[] def getPreviousImg(self): files=os.listdir(self.path+str(self.currentDir)) self.currentDirSize=len(files) if self.currentFile - 1 >= 1: self.currentFile -= 1 else: QMessageBox.question(self, 'Message',"已经是项目第一张图片", QMessageBox.Yes, QMessageBox.Yes) self.img=self.path + str(self.currentDir) + '/' + str(self.currentFile) + '.jpg' def getNextImg(self): files=os.listdir(self.path+str(self.currentDir)) self.currentDirSize=len(files) if self.currentFile + 1 <= self.currentDirSize: self.currentFile += 1 else: reply=QMessageBox.question(self, 'Message',"完成该项目?", QMessageBox.Yes |QMessageBox.No, QMessageBox.No) if reply==QMessageBox.Yes: self.save() self.currentDir += 1 self.currentFile = 1 self.rSetInfoList() self.setCheckBox() self.navigationEdit.setText(str(self.currentDir)) #QApplication.processEvents() #self.img=self.path+self.dirs[currentDir-1]+'/'+files[currentFile-1] self.img=self.path + str(self.currentDir) + '/' + str(self.currentFile) + '.jpg' def setImg(self): self.pixmap = QPixmap(self.img) width=self.pixmap.width() height=self.pixmap.height() if height/width > 6/15: self.pixmap=self.pixmap.scaledToHeight(600) else: self.pixmap=self.pixmap.scaledToWidth(1500) self.imgLabel.setPixmap(self.pixmap) #print(self.pixmap.width(),self.pixmap.height()) def previousClicked(self): #print('previousClicked') self.getPreviousImg() self.setImg() def nextClicked(self): #print('nextClicked') self.getNextImg() self.setImg() def setInfoList(self): self.infoList=self.projectInfo.iloc[self.currentDir-1].tolist() self.infoLabel=[] infoVbox = QVBoxLayout() infoHbox =[] for i in range(len(self.infoIndex)): infoHbox.append(QHBoxLayout()) self.infoLabel.append(QLabel(self.infoIndex[i]+':\t')) self.infoEdit.append(QLineEdit(self)) self.infoEdit[i].setText(str(self.infoList[i])) infoHbox[i].addWidget(self.infoLabel[i]) infoHbox[i].addWidget(self.infoEdit[i]) infoVbox.addLayout(infoHbox[i]) self.infoGroup.setLayout(infoVbox) def rSetInfoList(self): self.infoList=self.projectInfo.iloc[self.currentDir-1].tolist() for i in range(len(self.infoIndex)): self.infoLabel[i].setText(self.infoIndex[i]+':\t') self.infoEdit[i].setText(str(self.infoList[i])) def navigationConfirm(self): self.save() self.currentDir=int(self.navigationEdit.text()) self.currentFile=1 self.img=self.path + str(self.currentDir) + '/' + str(self.currentFile) + '.jpg' self.setImg() self.rSetInfoList() self.setCheckBox() def nextProject(self): self.save() self.currentDir+=1 self.currentFile=1 self.img=self.path + str(self.currentDir) + '/' + str(self.currentFile) + '.jpg' self.setImg() self.rSetInfoList() self.setCheckBox() self.navigationEdit.setText(str(self.currentDir)) def setCheckBox(self): try: status = self.df[str(self.currentDir)].tolist() #print(status) for i in range(len(self.checkBox)): self.checkBox[i].setCheckState(status[i]==1) except BaseException: for i in range(len(self.checkBox)): self.checkBox[i].setCheckState(False) def save(self): temp=[] for i in range(len(self.checkBox)): if self.checkBox[i].checkState() > 0: temp.append(1) else: temp.append(0) self.df[str(self.currentDir)]=temp self.df=self.df.sort_index(axis=1) group = self.df['Group'] self.df.drop(labels=['Group'], axis=1,inplace = True) self.df.insert(0, 'Group', group) self.df.to_csv('tags.csv',encoding='GBK') temp=[] for edit in self.infoEdit: temp.append(edit.text()) self.projectInfo.loc[self.currentDir-1]=temp #print(self.projectInfo.loc[self.currentDir-1]) self.projectInfo.to_csv('projectInfo.csv',index=False) def __init__(self): super().__init__() self.projectInfo=pd.read_csv('projectInfo.csv',engine='python') self.infoIndex=self.projectInfo.columns.tolist() self.getNextImg() try: self.df=pd.read_csv('tags.csv',engine='python',index_col='Tags') except Exception as e: reply=QMessageBox.information(self, 'Warning',"找不到tags.csv,请依格式创建tags.csv", QMessageBox.Yes) if reply == QMessageBox.Yes: sys.exit(0) self.checkList=self.df.index.tolist() self.checkListGroup=self.df['Group'].tolist() self.initUI() def initUI(self): #info self.infoGroup = QGroupBox("Project_Infomation") self.setInfoList() #img self.imgLabel = QLabel(self) self.setImg() #leftVboxLayout leftVboxLayout = QVBoxLayout() leftVboxLayout.addWidget(self.infoGroup) leftVboxLayout.addStretch(1) leftVboxLayout.addWidget(self.imgLabel) #navigationEdit self.navigationEdit = QLineEdit(self) #navigationConfirmButton self.navigationConfirmButton = QPushButton("go to this project") self.navigationConfirmButton.clicked.connect(self.navigationConfirm) #nextProjectButton self.nextProjectButton = QPushButton("next project") self.nextProjectButton.clicked.connect(self.nextProject) #checkBox self.checkVboxlayout = QVBoxLayout() #count=0 for i in range(len(self.checkList)): #if i == 0 or i == 3 or i == 6 or i == 9 or i == 13 or i == 16 or i == 22 or i == 25 or i == 28: if self.checkListGroup[i] == self.checkListGroup[i]: self.checkVboxlayout.addWidget(QLabel('\t'+self.checkListGroup[i])) #count += 1 self.checkBox.append(QCheckBox(self.checkList[i], self)) self.checkVboxlayout.addWidget(self.checkBox[i]) self.checkVboxlayout.addStretch(1) self.setCheckBox() #scrollArea self.scrollWidget=QWidget() self.scrollWidget.setLayout(self.checkVboxlayout) self.scrollArea = QScrollArea() self.scrollArea.setWidget(self.scrollWidget) #button self.previousButton = QPushButton("PREVIOUS") self.previousButton.clicked.connect(self.previousClicked) self.nextButton = QPushButton("NEXT") self.nextButton.clicked.connect(self.nextClicked) self.buttonHboxlayout = QHBoxLayout() self.buttonHboxlayout.addStretch(1) self.buttonHboxlayout.addWidget(self.previousButton) self.buttonHboxlayout.addWidget(self.nextButton) #rightVboxLayout rightVboxLayout = QVBoxLayout() rightVboxLayout.addWidget(self.navigationEdit) rightVboxLayout.addWidget(self.navigationConfirmButton) rightVboxLayout.addWidget(self.nextProjectButton) #rightVboxLayout.addStretch(1) rightVboxLayout.addWidget(self.scrollArea) rightVboxLayout.addLayout(self.buttonHboxlayout) wholeHbox = QHBoxLayout() wholeHbox.addLayout(leftVboxLayout) wholeHbox.addStretch(1) wholeHbox.addLayout(rightVboxLayout) self.setLayout(wholeHbox) self.setGeometry(50,50,50,50) self.setWindowTitle('imgExplorer') self.setMinimumSize(1000,600) self.show()
class MainWindow(QWidget): def __init__(self, width, height): super().__init__() self.resize(width, height) # устанавливаем размер окна по размеру экрана self.setWindowTitle('FormulaVoiceInput') # заголовок self.tex = QPlainTextEdit() # редактируемое текстовое поле, в котором будут выводиться команды TEX self.set_tex() # настройка начального текста, необходимого для компиляции из tex в pdf self.image = QLabel() # здесь выводится картинка с формулой self.pixmap = QPixmap() # пиксельная карта для картинки self.scale = 1 # текущий к-т масштабирования картинки self.scroll = QScrollArea() # область с полосами прокрутки self.slider = QSlider(Qt.Horizontal) # ползунок для изменения масштаба self.set_slider() self.status_bar = QStatusBar() # нижняя строка состояния self.status_bar.addWidget(self.slider) # добавляем ползунок для изменения масштаба self.grid = QGridLayout() # макет сетки для виджетов self.set_layout() # установка макета self.words = SpeechProcessing(self.tex) # для обработки распознанной речи self.subprocess = QProcess(self) # подпроцесс для получения текста из pocketsphinx self.speech_to_text() # распознавание речи self.show() def set_tex(self): # начальная строка start_line = "\\documentclass{article}\n\ \\usepackage[left=0mm,right=0mm,top=0mm,bottom=0mm,bindingoffset=0mm]{geometry}\n\ \\usepackage[fleqn]{amsmath}\n\ \\begin{document}\n\ \\begin{gather*}\n\n\ \\end{gather*}\n\ \\end{document}" self.tex.insertPlainText(start_line) # вставка начальной строки self.tex.find('begin{gather*}', QTextDocument.FindBackward) # находим место фрагмента begin{gather*} self.tex.moveCursor(QTextCursor.Down) # устанавливаем курсор внутри def set_slider(self): self.slider.setMinimum(0) # минимальный масштаб self.slider.setMaximum(200) # максимальный масштаб self.slider.setValue(100) # устанавливаем ползунок посередине self.slider.valueChanged[int].\ connect(self.scale_img) # обработчик изменений положения ползунка def scale_img(self, scale): # масштабирование картинки с формулой self.scale = scale / 100 self.image = QLabel() # создаем новый виджет для картинки # устанавливаем масштабированную картинку self.image.setPixmap(self.pixmap.scaledToWidth(self.pixmap.size().width() * self.scale)) self.scroll.setWidget(self.image) # добавляем новый виджет в область прокрутки def set_layout(self): self.grid.addWidget(self.tex, 1, 0) self.grid.setSpacing(20) self.grid.addWidget(self.scroll, 1, 1) self.grid.addWidget(self.status_bar, 2, 1) self.setLayout(self.grid) # устанавливаем макет сетки для окна def speech_to_text(self): # распознавание речи с микрофона с помощью pocketsphinx logs = open('speech/pocketsphinx_logs', 'w') # создаем файл, в который будут записываться логи от pocketsphinx cmd = "pocketsphinx_continuous\ -hmm speech/map \ -dict speech/math.dict \ -jsgf speech/math.jsgf \ -logfn speech/pocketsphinx_logs \ -inmic yes" args = shlex.split(cmd) self.subprocess.\ readyReadStandardOutput.connect(self.stdout_ready) self.subprocess.start(args[0], args[1:]) def stdout_ready(self): # меняем кодировку текста, полученного в рез-те распознавания text = bytearray(self.subprocess.readAllStandardOutput()).decode("utf-8").rstrip() if text == 'новая формула': self.words.new_formula() elif text == 'обновить': self.create_img() self.update_img() else: self.words.queue.extend(text.split()) # добавляем новые слова self.words.parsing() # анализ распознанных слов self.create_img() self.update_img() def create_img(self): # получение pdf из файла tex tex_file = open('tex_file.tex', 'w') # создаем файл tex_file.tex tex_file.write(self.tex.toPlainText()) # запись текста из self.tex в tex_file tex_file.close() self.start_subprocess('pdflatex tex_file.tex', 1000) if path.isfile('tex_file.pdf'): self.start_subprocess('pdftoppm -png tex_file.pdf formula', 500) # запуск подпроцесса с параметрами, указанными в cmd и временем ожидания завершения delay(в миллисекундах) def start_subprocess(self, cmd, delay): args = shlex.split(cmd) p = QProcess(self) p.start(args[0], args[1:]) p.waitForFinished(delay) p.close() # загрузка новой картинки при добавлении новых символов def update_img(self): if path.isfile('formula-1.png'): self.pixmap.load('formula-1.png') self.image = QLabel() w = self.pixmap.size().width() self.image.setPixmap(self.pixmap.scaledToWidth(w * self.scale)) self.scroll.setWidget(self.image)
def setupUi(self): self.setObjectName("Main_Form") self.resize(600, 300) self.setStyleSheet("color: #212121;") # Инициализация дочерних виджетов self.label_image = QtWidgets.QLabel(self) self.label_image.setGeometry(QtCore.QRect(10, 10, 131, 300)) self.label_image.setObjectName("label_image") pixmap = QPixmap(self.movie.image_path) pixmap.scaledToWidth(131) pixmap.scaledToHeight(300) self.label_image.setPixmap(pixmap) self.label_title = QtWidgets.QLabel(self) self.label_title.setGeometry(QtCore.QRect(170, 10, self.width(), 21)) self.label_title.setStyleSheet("font-weight: bold; font-size: 16px; color: black") self.label_title.setObjectName("label_title") self.label_title.setText(self.movie.title_ru) self.label_description = QtWidgets.QLabel(self) self.label_description.setGeometry(QtCore.QRect(170, 80, 231, 21)) self.label_description.setObjectName("label_description") self.label_description.setText(self.movie.description) self.label_country = QtWidgets.QLabel(self) self.label_country.setGeometry(QtCore.QRect(170, 40, 221, 31)) self.label_country.setObjectName("label_country") self.label_country.setText(f"<b>Страна</b> {self.movie.country}") self.label_created_date = QtWidgets.QLabel(self) self.label_created_date.setGeometry(QtCore.QRect(170, 110, 221, 21)) self.label_created_date.setObjectName("label_created_date") self.label_created_date.setText(f"<b>Год выпуска</b> {self.movie.created_date}") self.label_rating = QtWidgets.QLabel(self) self.label_rating.setGeometry(QtCore.QRect(170, 140, 221, 21)) self.label_rating.setObjectName("label_rating") self.label_rating.setText(f"{self.movie.rating}⭐") self.label_genres = QtWidgets.QLabel(self) self.label_genres.setGeometry(QtCore.QRect(170, 200, 221, 21)) self.label_genres.setObjectName("label_genres") self.label_genres.setText(f"<b>Жанры</b> {self.movie.genres}") self.label_type = QtWidgets.QLabel(self) self.label_type.setGeometry(QtCore.QRect(170, 230, 221, 21)) self.label_type.setText(self.movie.movie_type) self.label_type.setStyleSheet("font-weight: bold; font-size: 15px; marin: 8px") self.pushButton_delete = QtWidgets.QPushButton(self) self.pushButton_delete.setGeometry(self.width(), 250, 100, 50) self.pushButton_delete.setText("Удалить") self.pushButton_delete.setStyleSheet("margin: 8px") self.pushButton_delete.clicked.connect(self.removeItem) self.pushButton_favorite = QtWidgets.QPushButton(self) self.pushButton_favorite.setGeometry(self.width(), 200, 100, 50) self.pushButton_favorite.setText("В избранное") self.pushButton_favorite.setStyleSheet("margin: 8px") self.pushButton_favorite.clicked.connect(self.add_to_favorite) QtCore.QMetaObject.connectSlotsByName(self)
class QmyMainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) #调用父类构造函数 self.ui = Ui_MainWindow() #创建UI对象 self.ui.setupUi(self) #构造UI界面 self.curPixmap = QPixmap() #图片 self.pixRatio = 1 #显示比例 self.itemFlags = (Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsAutoTristate) #节点标志 self.setCentralWidget(self.ui.scrollArea) self.__iniTree() #以下的属性设置在UI Designer里已经设置,这里是代码设置方法 self.ui.dockWidget.setFeatures(QDockWidget.AllDockWidgetFeatures) self.ui.dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.ui.scrollArea.setWidgetResizable(True) #自动调整内部组件大小 self.ui.scrollArea.setAlignment(Qt.AlignCenter) self.ui.LabPicture.setAlignment(Qt.AlignCenter) ## =================自定义功能函数================================ def __iniTree(self): ##初始化目录树 self.ui.treeFiles.clear() icon = QIcon(":/images/icons/15.ico") item = QTreeWidgetItem(TreeItemType.itTopItem.value) item.setIcon(TreeColNum.colItem.value, icon) item.setText(TreeColNum.colItem.value, "图片文件") item.setFlags(self.itemFlags) item.setCheckState(TreeColNum.colItem.value, Qt.Checked) item.setData(TreeColNum.colItem.value, Qt.UserRole, "") self.ui.treeFiles.addTopLevelItem(item) def __displayImage(self, item): ##显示节点item 的图片 filename = item.data(TreeColNum.colItem.value, Qt.UserRole) self.ui.statusBar.showMessage(filename) #状态栏显示文件名 self.curPixmap.load(filename) #原始图片 self.on_actZoomFitH_triggered() #适合高度显示 self.ui.actZoomFitH.setEnabled(True) self.ui.actZoomFitW.setEnabled(True) self.ui.actZoomIn.setEnabled(True) self.ui.actZoomOut.setEnabled(True) self.ui.actZoomRealSize.setEnabled(True) def __changeItemCaption(self, item): ##递归调用函数,修改节点标题 title = "*" + item.text(TreeColNum.colItem.value) item.setText(TreeColNum.colItem.value, title) if (item.childCount() > 0): for i in range(item.childCount()): self.__changeItemCaption(item.child(i)) ## ===========connectSlotsByName() 自动连接的槽函数================= @pyqtSlot() ##添加目录节点 def on_actTree_AddFolder_triggered(self): dirStr = QFileDialog.getExistingDirectory() #选择目录 if (dirStr == ""): return parItem = self.ui.treeFiles.currentItem() #当前节点 if (parItem == None): parItem = self.ui.treeFiles.topLevelItem(0) icon = QIcon(":/images/icons/open3.bmp") dirObj = QDir(dirStr) #QDir对象 nodeText = dirObj.dirName() #最后一级目录的名称 item = QTreeWidgetItem(TreeItemType.itGroupItem.value) #节点类型 item.setIcon(TreeColNum.colItem.value, icon) item.setText(TreeColNum.colItem.value, nodeText) #第1列 item.setText(TreeColNum.colItemType.value, "Group") #第2列 item.setFlags(self.itemFlags) item.setCheckState(TreeColNum.colItem.value, Qt.Checked) item.setData(TreeColNum.colItem.value, Qt.UserRole, dirStr) #关联数据为目录全名 parItem.addChild(item) parItem.setExpanded(True) #展开节点 @pyqtSlot() ##添加图片文件节点 def on_actTree_AddFiles_triggered(self): fileList, flt = QFileDialog.getOpenFileNames(self, "选择一个或多个文件", "", "Images(*.jpg)") #多选文件,返回两个结果,fileList是一个列表类型,存储了所有文件名; flt是设置的文件filter,即"Images(*.jpg)" if (len(fileList) < 1): #fileList是list[str] return item = self.ui.treeFiles.currentItem() #当前节点 if (item.type() == TreeItemType.itImageItem.value ): #若当前节点是图片节点,取其父节点作为父节点 parItem = item.parent() else: #否则取当前节点为父节点 parItem = item icon = QIcon(":/images/icons/31.ico") for i in range(len(fileList)): fullFileName = fileList[i] #带路径文件名 fileinfo = QFileInfo(fullFileName) nodeText = fileinfo.fileName() #不带路径文件名 item = QTreeWidgetItem(TreeItemType.itImageItem.value) #节点类型 item.setIcon(TreeColNum.colItem.value, icon) #第1列的图标 item.setText(TreeColNum.colItem.value, nodeText) #第1列的文字 item.setText(TreeColNum.colItemType.value, "Image") #第2列的文字 item.setFlags(self.itemFlags) item.setCheckState(TreeColNum.colItem.value, Qt.Checked) item.setData(TreeColNum.colItem.value, Qt.UserRole, fullFileName) #关联数据为文件全名 parItem.addChild(item) parItem.setExpanded(True) #展开节点 @pyqtSlot() ##删除当前节点 def on_actTree_DeleteItem_triggered(self): item = self.ui.treeFiles.currentItem() parItem = item.parent() parItem.removeChild(item) @pyqtSlot() ##遍历节点 def on_actTree_ScanItems_triggered(self): count = self.ui.treeFiles.topLevelItemCount() for i in range(count): item = self.ui.treeFiles.topLevelItem(i) self.__changeItemCaption(item) def on_treeFiles_currentItemChanged(self, current, previous): ##目录树节点变化 if (current == None): return nodeType = current.type() #获取节点类型 if (nodeType == TreeItemType.itTopItem.value): #顶层节点 self.ui.actTree_AddFolder.setEnabled(True) self.ui.actTree_AddFiles.setEnabled(True) self.ui.actTree_DeleteItem.setEnabled(False) #顶层节点不能删除 elif (nodeType == TreeItemType.itGroupItem.value): #组节点 self.ui.actTree_AddFolder.setEnabled(True) self.ui.actTree_AddFiles.setEnabled(True) self.ui.actTree_DeleteItem.setEnabled(True) elif (nodeType == TreeItemType.itImageItem.value): #图片节点 self.ui.actTree_AddFolder.setEnabled(False) self.ui.actTree_AddFiles.setEnabled(True) self.ui.actTree_DeleteItem.setEnabled(True) self.__displayImage(current) #显示图片 @pyqtSlot() ##适应高度显示图片 def on_actZoomFitH_triggered(self): H = self.ui.scrollArea.height() #得到scrollArea的高度 realH = self.curPixmap.height() #原始图片的实际高度 self.pixRatio = float(H) / realH #当前显示比例,必须转换为浮点数 pix = self.curPixmap.scaledToHeight(H - 30) #图片缩放到指定高度 self.ui.LabPicture.setPixmap(pix) #设置Label的PixMap @pyqtSlot() ##适应宽度显示 def on_actZoomFitW_triggered(self): W = self.ui.scrollArea.width() - 20 realW = self.curPixmap.width() self.pixRatio = float(W) / realW pix = self.curPixmap.scaledToWidth(W - 30) self.ui.LabPicture.setPixmap(pix) #设置Label的PixMap @pyqtSlot() ##实际大小 def on_actZoomRealSize_triggered(self): self.pixRatio = 1 #恢复显示比例为1 self.ui.LabPicture.setPixmap(self.curPixmap) @pyqtSlot() ##放大显示 def on_actZoomIn_triggered(self): self.pixRatio = self.pixRatio * 1.2 W = self.pixRatio * self.curPixmap.width() H = self.pixRatio * self.curPixmap.height() pix = self.curPixmap.scaled(W, H) #图片缩放到指定高度和宽度,保持长宽比例 self.ui.LabPicture.setPixmap(pix) @pyqtSlot() ##缩小显示 def on_actZoomOut_triggered(self): self.pixRatio = self.pixRatio * 0.8 W = self.pixRatio * self.curPixmap.width() H = self.pixRatio * self.curPixmap.height() pix = self.curPixmap.scaled(W, H) #图片缩放到指定高度和宽度,保持长宽比例 self.ui.LabPicture.setPixmap(pix) @pyqtSlot(bool) ##设置停靠区浮动性 def on_actDockFloat_triggered(self, checked): self.ui.dockWidget.setFloating(checked) @pyqtSlot(bool) ##停靠区浮动性改变 def on_dockWidget_topLevelChanged(self, topLevel): self.ui.actDockFloat.setChecked(topLevel) @pyqtSlot(bool) ##设置停靠区可见性 def on_actDockVisible_triggered(self, checked): self.ui.dockWidget.setVisible(checked) @pyqtSlot(bool) ##停靠区可见性变化 def on_dockWidget_visibilityChanged(self, visible): self.ui.actDockVisible.setChecked(visible)
class MainWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('CTS') self.setMinimumWidth(480) self.grid = QGridLayout() self.setLayout(self.grid) # Objects self.lbl_instructions = QLabel('Select folders to compare') self.lbl_path_a = QLabel('Path A') self.path_a_text = QLineEdit() self.browse_a = QPushButton('Browse', self) self.browse_a.clicked.connect(lambda: self.path_a_text.setText(self.browse())) self.lbl_path_b = QLabel('Path B') self.path_b_text = QLineEdit() self.browse_b = QPushButton('Browse', self) self.browse_b.clicked.connect(lambda: self.path_b_text.setText(self.browse())) self.compare_btn = QPushButton('Compare That Shit') self.compare_btn.clicked.connect(self.compare) self.lbl_mismatch = QLabel() self.lbl_mismatch.setStyleSheet('color: red') self.lbl_mismatch.setFont(bold_font) self.lbl_mismatch.setAlignment(QtCore.Qt.AlignCenter) self.btn_mismatch = QPushButton('Details') self.btn_mismatch.clicked.connect(self.open_unmatch_window) self.btn_mismatch.hide() self.lbl_missing = QLabel() self.lbl_missing.setStyleSheet('color: red') self.lbl_missing.setFont(bold_font) self.lbl_missing.setAlignment(QtCore.Qt.AlignCenter) self.btn_missing = QPushButton('Details') self.btn_missing.clicked.connect(self.open_missing_window) self.btn_missing.hide() self.thumb_up_image = QLabel(self) self.pixmap_tu = QPixmap('thumbs_up.png') self.pixmap_tu = self.pixmap_tu.scaledToWidth(51) self.thumb_up_image.setPixmap(self.pixmap_tu) self.thumb_up_image.hide() self.middle_finger_image = QLabel(self) self.pixmap_mf = QPixmap('middle_finger.png') self.pixmap_mf = self.pixmap_mf.scaledToWidth(51) self.middle_finger_image.setPixmap(self.pixmap_mf) self.middle_finger_image.hide() self.version_filter = QCheckBox('Version Filter') self.version_filter.setToolTip('Only compare files that includes version') self.version_filter.setChecked(True) self.size_a = QLabel() self.size_b = QLabel() # Positions self.grid.addWidget(self.lbl_instructions, 1, 2) self.grid.addWidget(self.lbl_path_a, 2, 1) self.grid.addWidget(self.path_a_text, 2, 2) self.grid.addWidget(self.browse_a, 2, 3) self.grid.addWidget(self.size_a, 2, 4) self.grid.addWidget(self.lbl_path_b, 3, 1) self.grid.addWidget(self.path_b_text, 3, 2) self.grid.addWidget(self.browse_b, 3, 3) self.grid.addWidget(self.size_b, 3, 4) self.grid.addWidget(self.compare_btn, 5, 2) self.grid.addWidget(self.version_filter, 5, 3) self.grid.addWidget(self.lbl_missing, 6, 2) self.grid.addWidget(self.btn_missing, 6, 3) self.grid.addWidget(self.lbl_mismatch, 7, 2) self.grid.addWidget(self.btn_mismatch, 7, 3) self.grid.addWidget(self.thumb_up_image, 7, 3) self.grid.addWidget(self.middle_finger_image, 6, 1) self.show() def browse(self): path = str(QFileDialog.getExistingDirectory(self, "Select Directory")) return path def compare(self): self.reset_gui() # self.path_a_text.setText('C:\Program Files (x86)\Waves\MultiRack') # self.path_b_text.setText('C:\Program Files (x86)\Waves\MultiRack ref') if self.path_a_text.text() == '' or self.path_b_text.text() == '': QMessageBox.about(self, "Title", "No folders selected") return self.size_a.setText('Size: ' + self.calculate_size(self.path_a_text.text())) self.size_b.setText('Size: ' + self.calculate_size(self.path_b_text.text())) self.missing_a, self.missing_b, self.unmatched = main(self.path_a_text.text(), self.path_b_text.text(), self.version_filter.isChecked()) if self.missing_a or self.missing_b: self.lbl_missing.setText('Found {} missing items'.format(sum([len(self.missing_a), len(self.missing_b)]))) self.btn_missing.show() self.middle_finger_image.show() if self.unmatched: self.lbl_mismatch.setText('Found {} version mismatch'.format(len(self.unmatched))) self.btn_mismatch.show() self.middle_finger_image.show() if not self.missing_a and not self.missing_b and not self.unmatched: self.lbl_mismatch.setText('Perfect match!') self.lbl_mismatch.setStyleSheet('color: blue') self.thumb_up_image.show() def reset_gui(self): """Clear GUI for next search""" self.thumb_up_image.hide() self.middle_finger_image.hide() self.btn_missing.hide() self.btn_mismatch.hide() self.lbl_missing.setText('') self.lbl_mismatch.setText('') def open_unmatch_window(self): self.unmatch_table = UnmatchTable() self.unmatch_table.show_unmatched_table(self.unmatched, self.path_a_text.text(), self.path_b_text.text()) self.unmatch_table.show() def open_missing_window(self): self.missing = MissingTable() self.missing.show_missing_table(self.missing_a, self.missing_b, self.path_a_text.text(), self.path_b_text.text()) self.missing.show() def calculate_size(self, path): if os.name == 'posix': return subprocess.check_output(['du', '-sh', path]).split()[0].decode('utf-8') else: size = 0 for path, dirs, files in os.walk(path): for f in files: size += os.path.getsize(os.path.join(path, f)) size = size/1000000 size = ("%.2f" % size) return str(size + ' MB')
def __init__(self, size): global resolution_in_x, resolution_in_y, Horizontal_Margin, Vertical_Margin, sensitivity, acceleration with open('config.json') as file: data = json.load(file) sensitivity = data["sensitivity"] acceleration = data["acceleration"] Horizontal_Margin = data["Horizontal_Margin"] Vertical_Margin = data["Vertical_Margin"] resolution_in_x = data["resolution_in_x"] resolution_in_y = data["resolution_in_y"] super(Ui, self).__init__() # Call the inherited classes __init__ method self.setWindowTitle("Gesture Mouse") self.gen_size = int(size.height() / 24) self.font_size = int(self.gen_size / 5) if self.font_size < 10: self.font_size = 10 #Prepare Font main_font = QFont("Arial", self.font_size, QFont.Bold) #Webcam Screem v_layout = QtWidgets.QVBoxLayout() # mainWindow layout pix = QPixmap("gui_images/logo.jpg") pix = pix.scaledToWidth(320) pix = pix.scaledToHeight(240) self.video_stream = QtWidgets.QLabel() self.video_stream.setPixmap(pix) self.video_stream.setAlignment(Qt.AlignCenter) v_layout.addWidget(self.video_stream) #Resolution Row h_layout_res = QtWidgets.QHBoxLayout() # Placeholder for a row res_pix = QPixmap("gui_images/communications.png") res_pix = res_pix.scaledToWidth(self.gen_size) res_pix = res_pix.scaledToHeight(self.gen_size) self.res_icon = QtWidgets.QLabel() self.res_icon.setPixmap(res_pix) self.res_label = QtWidgets.QLabel("Resolution") self.res_label.setFont(main_font) self.screen_combo = QtWidgets.QComboBox() self.screen_combo.addItem("1366 * 768") self.screen_combo.addItem("1920 * 1080") self.screen_combo.view().pressed.connect(self.handleTheResolution) h_layout_res.addWidget(self.res_icon) h_layout_res.addWidget(self.res_label) h_layout_res.addItem( QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) v_layout.addLayout(h_layout_res) v_layout.addWidget(self.screen_combo) #Sensitivity Row h_layout_sens = QtWidgets.QHBoxLayout() # Placeholder for a row sens_pix = QPixmap("gui_images/arrows.png") sens_pix = sens_pix.scaledToWidth(self.gen_size) sens_pix = sens_pix.scaledToHeight(self.gen_size) self.sens_icon = QtWidgets.QLabel() self.sens_icon.setPixmap(sens_pix) self.sens_label = QtWidgets.QLabel("Sensitivity") self.sens_label.setFont(main_font) self.sens_slider = QtWidgets.QSlider(Qt.Horizontal) self.sens_slider.setTickInterval(1) self.sens_slider.setMinimum(1) self.sens_slider.setMaximum(10) self.sens_slider.valueChanged.connect(self.handleSensitivity) self.sens_slider.setValue(sensitivity) h_layout_sens.addWidget(self.sens_icon) h_layout_sens.addWidget(self.sens_label) h_layout_sens.addItem( QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) v_layout.addLayout(h_layout_sens) v_layout.addWidget(self.sens_slider) #Acceleration Row h_layout_acc = QtWidgets.QHBoxLayout() # Placeholder for a row acc_pix = QPixmap("gui_images/arrows.png") acc_pix = acc_pix.scaledToWidth(self.gen_size) acc_pix = acc_pix.scaledToHeight(self.gen_size) self.acc_icon = QtWidgets.QLabel() self.acc_icon.setPixmap(acc_pix) self.acc_label = QtWidgets.QLabel("Acceleration") self.acc_label.setFont(main_font) self.acc_slider = QtWidgets.QSlider(Qt.Horizontal) self.acc_slider.setTickInterval(1) self.acc_slider.setMinimum(1) self.acc_slider.setMaximum(10) self.acc_slider.valueChanged.connect(self.handleAcceleration) self.acc_slider.setValue(acceleration / 0.1) h_layout_acc.addWidget(self.acc_icon) h_layout_acc.addWidget(self.acc_label) h_layout_acc.addItem( QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) v_layout.addLayout(h_layout_acc) v_layout.addWidget(self.acc_slider) #Horizontal Margin h_layout_horz_margin = QtWidgets.QHBoxLayout() # Placeholder for a row horz_margin_pix = QPixmap("gui_images/horizontal.png") horz_margin_pix = horz_margin_pix.scaledToWidth(self.gen_size) horz_margin_pix = horz_margin_pix.scaledToHeight(self.gen_size) self.horz_margin_icon = QtWidgets.QLabel() self.horz_margin_icon.setPixmap(horz_margin_pix) self.horz_margin_label = QtWidgets.QLabel("Horizontal Margin") self.horz_margin_label.setFont(main_font) self.horz_margin_slider = QtWidgets.QSlider(Qt.Horizontal) self.horz_margin_slider.setTickInterval(1) self.horz_margin_slider.setMinimum(1) self.horz_margin_slider.setMaximum(8) self.horz_margin_slider.valueChanged.connect( self.handleHorizontalMargin) self.horz_margin_slider.setValue(Horizontal_Margin / 0.05) h_layout_horz_margin.addWidget(self.horz_margin_icon) h_layout_horz_margin.addWidget(self.horz_margin_label) h_layout_horz_margin.addItem( QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) v_layout.addLayout(h_layout_horz_margin) v_layout.addWidget(self.horz_margin_slider) #Vertical Margin h_layout_vert_margin = QtWidgets.QHBoxLayout() # Placeholder for a row vert_margin_pix = QPixmap("gui_images/vertical.png") vert_margin_pix = vert_margin_pix.scaledToWidth(self.gen_size) vert_margin_pix = vert_margin_pix.scaledToHeight(self.gen_size) self.vert_margin_icon = QtWidgets.QLabel() self.vert_margin_icon.setPixmap(vert_margin_pix) self.vert_margin_label = QtWidgets.QLabel("Vertical Margin") self.vert_margin_label.setFont(main_font) self.vert_margin_slider = QtWidgets.QSlider(Qt.Horizontal) self.vert_margin_slider.setTickInterval(1) self.vert_margin_slider.setMinimum(1) self.vert_margin_slider.setMaximum(8) self.vert_margin_slider.valueChanged.connect(self.handleVerticalMargin) self.vert_margin_slider.setValue(Vertical_Margin / 0.05) h_layout_vert_margin.addWidget(self.vert_margin_icon) h_layout_vert_margin.addWidget(self.vert_margin_label) h_layout_vert_margin.addItem( QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) v_layout.addLayout(h_layout_vert_margin) v_layout.addWidget(self.vert_margin_slider) h_layout_btns = QtWidgets.QHBoxLayout() # Placeholder for a row #Apply button self.apply_button = QtWidgets.QPushButton("Apply") self.apply_button.clicked.connect(self.Apply) #Reset Button self.reset_button = QtWidgets.QPushButton("Reset") self.reset_button.clicked.connect(self.Reset) h_layout_btns.addWidget(self.apply_button) h_layout_btns.addWidget(self.reset_button) v_layout.addLayout(h_layout_btns) self.setLayout(v_layout) #Set Background oImage = QImage("gui_images/background.jpg") sImage = oImage.scaled(self.sizeHint()) # resize Image to widgets size palette = QPalette() palette.setBrush(QPalette.Window, QBrush(sImage)) self.setPalette(palette) self.setFixedSize(self.sizeHint()) #Disable resize self.show() # Show the GUI
def initMe(self): mod = self.mod layout = QVBoxLayout() # Name layout.addWidget(QLabel(str(mod.name))) # Image image = QLabel() if mod.image: pixmap = QPixmap(mod.image) else: pixmap = QPixmap(f("images/no_image.png")) pixmap = pixmap.scaledToWidth(image_width, mode=Qt.SmoothTransformation) image.setPixmap(pixmap) layout.addWidget(image) # Authors separator = ', ' if mod.authors: layout.addWidget(QLabel(f"Authors: {separator.join(mod.authors)}")) else: layout.addWidget(QLabel("Authors: not detected")) # source layout.addWidget(QLabel(f"source: {str(mod.source)}")) # minorVersion layout.addWidget(QLabel(f"minorVersion: {str(mod.minorVersion)}")) # hasSettings layout.addWidget(QLabel(f"hasOptions: {str(mod.options)}")) # Category Image if mod.category_image is not None: try: images.invert_image(mod.category_image) success = True except: success = False if success: image = QLabel() pixmap = QPixmap(f("Image_negative.jpg")) image.setPixmap(pixmap) image.setToolTip("Category") layout.addWidget(image) # Open in Explorer Button open_btn = QPushButton("Open in Explorer") open_btn.clicked.connect(self.open) layout.addWidget(open_btn) # Uninstall uninstall_btn = QPushButton("Uninstall Mod") uninstall_btn.clicked.connect(self.uninstall) layout.addWidget(uninstall_btn) self.setLayout(layout)
class ImageWithMouseControl(QWidget): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle('Image with mouse control') self.parent = parent self.point = QPoint(0, 0) def setImg(self, src): self.img = QPixmap(src) self.scaled_img = self.img.scaledToWidth(400) def paintEvent(self, e): ''' 绘图 :param e: :return: ''' painter = QPainter() painter.begin(self) self.draw_img(painter) painter.end() def draw_img(self, painter): painter.drawPixmap(self.point, self.scaled_img) def mouseMoveEvent(self, e): # 重写移动事件 if self.left_click: self._endPos = e.pos() - self._startPos self.point = self.point + self._endPos self._startPos = e.pos() self.repaint() def mousePressEvent(self, e): if e.button() == Qt.LeftButton: self.left_click = True self._startPos = e.pos() def mouseReleaseEvent(self, e): if e.button() == Qt.LeftButton: self.left_click = False elif e.button() == Qt.RightButton: self.point = QPoint(0, 0) self.scaled_img = self.img.scaledToWidth(self.size().width() - 10) self.repaint() def wheelEvent(self, e): if e.angleDelta().y() > 0: # 放大图片 self.scaled_img = self.img.scaledToWidth(self.scaled_img.width() - 50) new_w = e.x() - (self.scaled_img.width() * (e.x() - self.point.x())) / ( self.scaled_img.width() + 50) new_h = e.y() - (self.scaled_img.height() * (e.y() - self.point.y())) / ( self.scaled_img.height() + 50) self.point = QPoint(new_w, new_h) self.repaint() elif e.angleDelta().y() < 0: # 缩小图片 self.scaled_img = self.img.scaledToWidth(self.scaled_img.width() + 50) new_w = e.x() - (self.scaled_img.width() * (e.x() - self.point.x())) / ( self.scaled_img.width() - 50) new_h = e.y() - (self.scaled_img.height() * (e.y() - self.point.y())) / ( self.scaled_img.height() - 50) self.point = QPoint(new_w, new_h) self.repaint() def resizeEvent(self, e): if self.parent is not None: self.scaled_img = self.img.scaledToWidth(self.size().width() - 10) self.point = QPoint(0, 0) self.update()
# self.label.setStyleSheet('font: 20x') else: path = data[0] type_ = data[5] if path.endswith(('.mp4', '.webm')): path = get_frame(path) pixmap = QPixmap(path) if not pixmap.isNull(): height, width = pixmap.height(), pixmap.width() aspect_ratio = (width / height if height > width else height / width) if (type_ == 3 and aspect_ratio < .6) or aspect_ratio < .3: if height > width: pixmap = pixmap.scaledToWidth(self.width() * .9, Qt.SmoothTransformation) else: pixmap = pixmap.scaledToHeight(self.height() * .9, Qt.SmoothTransformation) else: pixmap = pixmap.scaled( self.size(), Qt.KeepAspectRatio, transformMode=Qt.SmoothTransformation) # else: # self.label.setText('No image') # self.setStyleSheet('font: 20x') self.verticalScrollBar().setSliderPosition(0) self.horizontalScrollBar().setSliderPosition(0)
def change_img(obj, ARRAY_OF_IMG, index, H, W): pixmap = QPixmap(ARRAY_OF_IMG[index]) pixmap = pixmap.scaledToHeight(H) pixmap = pixmap.scaledToWidth(W) obj.setPixmap(pixmap)
def generateRightFrame(self): self._currentUpload = [] layout = self.scrollLayout print(layout) print(layout.count()) while layout.count(): print("destroy") child = layout.takeAt(0) if child.widget(): child.widget().deleteLater() for currentExifImage in self.exifImageCollection: """ Current image """ localWidget = ImageUpload() localLayout = QHBoxLayout() localLayout.setAlignment(Qt.AlignRight) localWidget.setLayout(localLayout) self.scrollLayout.addWidget(localWidget) self._currentUpload.append(localWidget) """Local Left Widget""" localLeftWidget = QWidget() localLeftLayout = QFormLayout() localLeftLayout.setAlignment(Qt.AlignRight) localLeftWidget.setLayout(localLeftLayout) localLayout.addWidget(localLeftWidget) """ import? + Import Status """ cbImport = QCheckBox("Import") lblUploadResult = QLabel() lblUploadResult.setStyleSheet(STYLE_IMPORT_STATUS) localLeftLayout.addRow(cbImport, lblUploadResult) localWidget.cbImport = cbImport localWidget.lblUploadResult = lblUploadResult """ File Name of picture """ lblFileName = QLabel("Name: ") lblFileName.setAlignment(Qt.AlignLeft) lineEditFileName = QLineEdit() lineEditFileName.setFixedWidth(WIDTH_WIDGET_RIGHT) lineEditFileName.setText(currentExifImage.filename) lineEditFileName.setAlignment(Qt.AlignLeft) localLeftLayout.addRow(lblFileName, lineEditFileName) localWidget.lineEditFileName = lineEditFileName """ Shadow Real FileName """ lblRealFileName = QLineEdit() lblRealFileName.setText(currentExifImage.filename) localWidget.lblRealFileName = lblRealFileName localWidget.lblRealFileName.isVisible = False """ Description """ lblDescription = QLabel("Description: ") lblDescription.setAlignment(Qt.AlignLeft) lineEditDescription = QPlainTextEdit() lineEditDescription.setFixedWidth(WIDTH_WIDGET_RIGHT) localLeftLayout.addRow(lblDescription, lineEditDescription) localWidget.lineEditDescription = lineEditDescription """ Categories """ lblCategories = QLabel("Categories: ") lblCategories.setAlignment(Qt.AlignLeft) lineEditCategories = QLineEdit() lineEditCategories.setFixedWidth(WIDTH_WIDGET_RIGHT) lineEditCategories.setAlignment(Qt.AlignLeft) localLeftLayout.addRow(lblCategories, lineEditCategories) localWidget.lineEditCategories = lineEditCategories lblLocation = QLabel("Location: ") lblLocation.setAlignment(Qt.AlignLeft) lineEditLocation = QLineEdit() lineEditLocation.setFixedWidth(WIDTH_WIDGET_RIGHT) if currentExifImage.lat == None or currentExifImage.long == None: lineEditLocation.setText("") else: lineEditLocation.setText( str(currentExifImage.lat) + "|" + str(currentExifImage.long) + "|heading:" + str(currentExifImage.heading)) lineEditLocation.setAlignment(Qt.AlignLeft) localLeftLayout.addRow(lblLocation, lineEditLocation) localWidget.lineEditLocation = lineEditLocation lblDateTime = QLabel("Date Time: ") lblDateTime.setAlignment(Qt.AlignLeft) lineEditDateTime = QLineEdit() lineEditDateTime.setFixedWidth(WIDTH_WIDGET_RIGHT) lineEditDateTime.setText(currentExifImage.date + " " + currentExifImage.time) lineEditDateTime.setAlignment(Qt.AlignLeft) localLeftLayout.addRow(lblDateTime, lineEditDateTime) localWidget.lineEditDateTime = lineEditDateTime """ Image itself """ label = QLabel() pixmap = QPixmap(currentExifImage.fullFilePath) pixmapResize = pixmap.scaledToWidth(IMAGE_DIMENSION, Qt.FastTransformation) label.setPixmap(pixmapResize) localLayout.addWidget(label) localWidget.fullFilePath = currentExifImage.fullFilePath self.update()
def init_UI(self, config): self.set_status() # Define layout for sidebar side_bar_layout = QVBoxLayout() #add buttons to our layout side_bar_layout.addWidget(self.button_1) side_bar_layout.addWidget(self.button_2) side_bar_layout.addWidget(self.button_3) side_bar_layout.addWidget(self.button_4) side_bar_layout.addWidget(self.button_5) side_bar_layout.addWidget(self.button_6) # Set stretch and Spacing side_bar_layout.addStretch(1) side_bar_layout.addSpacing(0) # Define our side bar widget and set side bar layout to it side_bar_widget = QWidget() side_bar_widget.setLayout(side_bar_layout) side_bar_widget.setFixedWidth(215) side_bar_widget.setObjectName("sidebar") # Define out top bar logo = QLabel(self) logo_image = QPixmap("Elements\\bitwise_header.png") logo_image = logo_image.scaledToWidth(104) logo.setPixmap(logo_image) client_label = QLabel('Client ID : ' + config["client_id"]) user_label = QLabel(config["Username"]) client_label.setObjectName('top') user_label.setObjectName('top') self.timer_widget = QLCDNumber() self.timer_widget.setSegmentStyle(QLCDNumber.Flat) self.timer_widget.setDigitCount(8) self.timer_widget.display('00:00:00') self.timer_widget.setFixedSize(150, 40) top_bar_layout = QHBoxLayout() top_bar_layout.setContentsMargins(15, 5, 1, 0) top_bar_layout.addWidget(logo) top_bar_layout.addWidget(client_label, alignment=Qt.AlignCenter) top_bar_layout.addWidget(user_label, alignment=Qt.AlignCenter) top_bar_layout.addWidget(self.timer_widget, alignment=Qt.AlignRight) top_bar_widget = QWidget() top_bar_widget.setLayout(top_bar_layout) top_bar_widget.setObjectName('top_bar') # Define our right side screens corresponding to buttons on the sidebar # Basically right screens are tab widgets whose tabs are hidden, # and we map sidebar buttons to each tab switch :) # Since sidebars are not natively supported by pyqt5 self.right_widget = QTabWidget() self.right_widget.setObjectName("main_tabs") self.right_widget.addTab(self.tab1, '') self.right_widget.addTab(self.tab2, '') self.right_widget.addTab(self.tab3, '') self.right_widget.addTab(self.tab4, '') self.right_widget.addTab(self.tab5, '') self.right_widget.addTab(self.tab6, '') # Screen 1 will be our initial screen self.right_widget.setCurrentIndex(0) # Define the combined layout for sidebar + right side screns main_layout = QHBoxLayout() main_layout.addWidget(side_bar_widget) main_layout.addWidget(self.right_widget) # setstretch( index, stretch_value ) main_layout.setStretch(0, 10) main_layout.setStretch(1, 100) main_layout.setContentsMargins(10, 1, 10, 1) # Define our main widget = sidebar + windows main_widget = QWidget() main_widget.setObjectName("screen_widget") main_widget.setLayout(main_layout) #Define top_layout = logo bar + main_layout top_layout = QVBoxLayout() top_layout.addWidget(top_bar_widget) top_layout.addWidget(main_widget) top_layout.setContentsMargins(1, 0, 1, 1) top_layout.setStretch(0, 8) top_layout.setStretch(1, 92) top_widget = QWidget() top_widget.setLayout(top_layout) top_widget.setObjectName("top_widget") # Set top_widget as our central widget self.setCentralWidget(top_widget) return
class PictureView(FullView, AbstractPictureView): def __init__(self, parent=None, view_manager=AbstractViewManager): FullView.__init__(self, parent, view_manager) self.pix_label = QLabel(self.ui.mid_frame) self.pix_label.setAlignment(QtCore.Qt.AlignCenter) self.ui.mid_frame_layout.addWidget(self.pix_label) self.progress = QProgressHLine(self.ui.mid_frame) self.progress.hide() self.progress.new_progress('loaded', QtCore.Qt.gray) self.progress.new_progress('current', QtCore.Qt.red) self.pix = None self._redraw() self.dir = None self.cur_pix = 0 self.files = list() self.max_pics = 0 def test_favorite_item(self, item): return item.is_pix() or item.is_thumb() def get_page_type(self): return FavoriteRecord.pix def set_dir(self, filedir='', url=URL(), max_pics=12): self.dir = filedir self.url = url self.cur_pix = 0 self.controls.clear() self.max_pics = max_pics self.progress.set_max(max_pics - 1) self.progress.reset() self.progress.show() self.update() self.refresh() def refresh(self): if self.dir is None: return self.files = glob.glob(self.dir + '*.jpg') self.load_pix() def load_pix(self): if len(self.files) == 0: return if len(self.files) >= self.max_pics: self.progress.hide() self.progress.set_value('loaded', len(self.files) - 1) self.pix = QPixmap(self.files[self.cur_pix]) self._redraw() self.setWindowTitle(self.files[self.cur_pix]) def _redraw(self): if self.pix is None: return l_rect = self.ui.mid_frame.contentsRect() p_rect = self.pix.rect() try: if l_rect.height() / l_rect.width() < p_rect.height() / p_rect.width(): pix1 = self.pix.scaledToHeight(l_rect.height(), QtCore.Qt.SmoothTransformation) else: pix1 = self.pix.scaledToWidth(l_rect.width(), QtCore.Qt.SmoothTransformation) self.pix_label.setPixmap(pix1) except ZeroDivisionError: pass self.progress.setGeometry(0, l_rect.height() * 9 // 10, l_rect.width(), l_rect.height() * 9 // 10 + self.progress.height()) self.progress.set_value('current', self.cur_pix) self.progress.update() QtCore.QEventLoop().processEvents(QtCore.QEventLoop.AllEvents) self.update() def resizeEvent(self, *args, **kwargs): self._redraw() def wheelEvent(self, event): self.cur_pix -= event.angleDelta().y() // 120 if self.cur_pix < 0: self.cur_pix = 0 if self.cur_pix > len(self.files) - 1: self.cur_pix = len(self.files) - 1 self.load_pix()
def figures(self, N): groupbox = QGroupBox() groupbox.setStyleSheet('background-color: white;') groupbox.setFixedWidth(1000) layout = QVBoxLayout() horizlayout1 = QHBoxLayout() horizlayout1.setContentsMargins(0, 0, 0, 0) horizlayout1.setSpacing(0) groupbox.setLayout(layout) layout.addLayout(horizlayout1) fname = 'mirror.png' pix = QPixmap(fname) if N < 6: for i in range(N): beamsplitter_i = QLabel() beamsplitter_i.setPixmap(pix) horizlayout1.addWidget(beamsplitter_i) else: for i in range(6): beamsplitter_i = QLabel() beamsplitter_i.setPixmap(pix) horizlayout1.addWidget(beamsplitter_i) det = QLabel() # detpic = QPixmap('detector.png') det.setPixmap(QPixmap('detector.png')) horizlayout1.addWidget(det) horizlayout2 = QHBoxLayout() horizlayout2.setSpacing(0) horizlayout2.setContentsMargins(0, 0, 0, 0) layout.addLayout(horizlayout2) if N < 6: circuit = self.calcs.zenocirc(N, 1) circuit.draw(filename='circuit.png', output='mpl') cir = QLabel() cirpic = QPixmap('circuit.png') cirpic.scaledToWidth(500) cirpic.scaledToHeight(500) cir.setPixmap(cirpic) horizlayout2.addWidget(cir) else: circuit = self.calcs.zenocirc(6, 1) circuit.draw(filename='circuit.png', output='mpl') cir = QLabel() cirpic = QPixmap('circuit.png') cirpic.scaledToWidth(500) cirpic.scaledToHeight(500) cir.setPixmap(cirpic) horizlayout2.addWidget(cir) return groupbox
class Viewer(QtMainWindow): jobAdded = Signal() jobFinished = Signal() def __init__(self, weboob, parent=None): super(Viewer, self).__init__(parent) self.ui = Ui_Viewer() self.ui.setupUi(self) self.ui.prevButton.clicked.connect(self.prev) self.ui.nextButton.clicked.connect(self.next) self.ui.firstButton.clicked.connect(self.first) self.ui.lastButton.clicked.connect(self.last) self.ui.actionZoomIn.triggered.connect(self.zoomIn) self.ui.actionZoomOut.triggered.connect(self.zoomOut) self.ui.actionFullSize.triggered.connect(self.zoomFullSize) self.ui.actionFitWindow.triggered.connect(self.zoomFit) self.ui.actionSaveImage.setShortcut(QKeySequence.Save) self.ui.actionSaveImage.triggered.connect(self.saveImage) self.ui.actionClose.setShortcut(QKeySequence.Close) self.ui.actionClose.triggered.connect(self.close) self.model = None self.current = None self.total = 0 self.zoomFactor = 1 self.zoomMode = ZOOM_FACTOR self.weboob = weboob def setData(self, model, qidx): self.model = model self.current = QPersistentModelIndex(qidx) self.model.rowsInserted.connect(self.updatePos) self.model.rowsRemoved.connect(self.updatePos) self.model.rowsInserted.connect(self.updateNavButtons) self.model.rowsRemoved.connect(self.updateNavButtons) self.model.dataChanged.connect(self._dataChanged) self.model.modelReset.connect(self.disable) self.updateImage() @Slot() def disable(self): self.setEnabled(False) def updateNavButtons(self): prev = self.current.row() > 0 self.ui.prevButton.setEnabled(prev) self.ui.firstButton.setEnabled(prev) next = self.current.row() < self.total - 1 self.ui.nextButton.setEnabled(next) self.ui.lastButton.setEnabled(next) def updatePos(self): self.total = self.model.rowCount(self.current.parent()) self.ui.posLabel.setText('%d / %d' % (self.current.row() + 1, self.total)) def updateImage(self): self.updatePos() self.updateNavButtons() obj = self.current.data(ResultModel.RoleObject) if obj.data is NotLoaded: self.model.fillObj(obj, ['data'], QModelIndex(self.current)) self.pixmap = None elif obj.data: self.pixmap = QPixmap(QImage.fromData(obj.data)) else: self.pixmap = QPixmap() self._rebuildImage() @Slot(QModelIndex) def _dataChanged(self, qidx): if qidx == self.current: obj = qidx.data(ResultModel.RoleObject) if obj.data: self.pixmap = QPixmap(QImage.fromData(obj.data)) else: self.pixmap = QPixmap() self._rebuildImage() @Slot() def next(self): new = self.current.sibling(self.current.row() + 1, 0) if not new.isValid(): return self.current = QPersistentModelIndex(new) self.updateImage() @Slot() def prev(self): if self.current.row() == 0: return self.current = QPersistentModelIndex( self.current.sibling(self.current.row() - 1, 0)) self.updateImage() @Slot() def first(self): self.current = QPersistentModelIndex(self.current.sibling(0, 0)) self.updateImage() @Slot() def last(self): self.current = QPersistentModelIndex( self.current.sibling(self.total - 1, 0)) self.updateImage() @Slot() def zoomIn(self): self.zoomFactor *= 1.25 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomOut(self): self.zoomFactor *= 0.75 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomFullSize(self): self.zoomFactor = 1 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomFit(self): self.zoomMode = ZOOM_FIT self._rebuildImage() def resizeEvent(self, ev): super(Viewer, self).resizeEvent(ev) if self.zoomMode == ZOOM_FIT: self._rebuildImage() def _rebuildZoom(self): if self.zoomMode == ZOOM_FACTOR: new_width = int(self.pixmap.width() * self.zoomFactor) pixmap = self.pixmap.scaledToWidth(new_width, Qt.SmoothTransformation) else: new_size = self.ui.scrollArea.viewport().size() pixmap = self.pixmap.scaled(new_size, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.zoomFactor = pixmap.width() / float(self.pixmap.width()) return pixmap def _rebuildImage(self): if self.pixmap is None: self.ui.view.setText('Loading...') return elif self.pixmap.isNull(): self.ui.view.setText('Image could not be loaded') return pixmap = self._rebuildZoom() self.ui.view.setPixmap(pixmap) @Slot() def saveImage(self): def ext_for_filter(s): return re.match(r'(?:[A-Z]+) \(\*\.([a-z]+)\)$', s).group(1) if not self.pixmap: return filters = ['PNG (*.png)', 'JPEG (*.jpg)', 'GIF (*.gif)'] obj = self.current.data(ResultModel.RoleObject) name = '%s.%s' % (obj.title or obj.id or u'', obj.ext or 'png') default = filters[0] for f in filters: if name.endswith(ext_for_filter(f)): default = f filters = ';;'.join(filters) target = os.path.join(self.parent().lastSaveDir, name) out, filter = QFileDialog.getSaveFileName(self, 'Save image', target, filters, default) if not out: return ext = ext_for_filter(filter) self.parent().lastSaveDir = os.path.dirname(out) if not os.path.splitext(out)[1]: out = '%s.%s' % (out, ext) if os.path.exists(out): q = self.tr( '%s already exists, are you sure you want to replace it?' ) % out reply = QMessageBox.question(self, self.tr('Overwrite?'), q) if reply == QMessageBox.No: return self.saveImage() self.pixmap.save(out, ext.upper())
class FigureCanvas(QFrame): def __init__(self, parent=None): super(FigureCanvas, self).__init__(parent) self.setLineWidth(2) self.setMidLineWidth(1) self.setStyleSheet("background-color: white") self.img = [] self.qpix_buff = [] def load_mpl_figure(self, mplfig, view_dpi): self.qpix_buff = [] # ---------------------------------------------------- figure size ---- bbox = mplfig.get_window_extent() self.fwidth = bbox.width self.fheight = bbox.height # ------------------------------------------ save figure to buffer ---- # http://stackoverflow.com/questions/8598673/ # how-to-save-a-pylab-figure-into-in-memory-file-which-can-be-read # -into-pil-image/8598881#8598881 # http://stackoverflow.com/questions/1300908/ # load-blob-image-data-into-qpixmap # Scale dpi of figure to view_dpi orig_fig_dpi = mplfig.get_dpi() mplfig.dpi = view_dpi # Propagate changes to renderer : mplfig.canvas.draw() renderer = mplfig.canvas.get_renderer() orig_ren_dpi = renderer.dpi renderer.dpi = view_dpi # Generate img buffer : imgbuf = mplfig.canvas.buffer_rgba() imgwidth = int(renderer.width) imgheight = int(renderer.height) # Restore fig and renderer dpi renderer.dpi = orig_ren_dpi mplfig.dpi = orig_fig_dpi # Convert buffer to QPixmap : self.img = QImage(imgbuf, imgwidth, imgheight, QImage.Format_ARGB32) self.img = QImage.rgbSwapped(self.img) self.img = QPixmap(self.img) def paintEvent(self, event): """Qt method override to paint a custom image on the Widget.""" super(FigureCanvas, self).paintEvent(event) qp = QPainter() qp.begin(self) # Prepare paint rect : fw = self.frameWidth() rect = QRect(0 + fw, 0 + fw, self.size().width() - 2 * fw, self.size().height() - 2 * fw) # Check/update image buffer : qpix2print = None for qpix in self.qpix_buff: if qpix.size().width() == rect.width(): qpix2print = qpix break if qpix2print is None: qpix2print = self.img.scaledToWidth(rect.width(), mode=Qt.SmoothTransformation) self.qpix_buff.append(qpix2print) # Draw pixmap : # qp.setRenderHint(QPainter.Antialiasing, True) qp.drawPixmap(rect, qpix2print) qp.end()
class Ground(QLabel): def __init__(self, parent): QLabel.__init__(self, parent) self.symbol = QPixmap() self.symbol.load('gnd.png') self.symbol = self.symbol.scaledToWidth(30) self.resize(self.symbol.size()) self.setPixmap(self.symbol) self.move(300, 300) self.show() self.Node = node(parent) self.Node.move(self.x() + 10, self.y()) self.Node.id = 'N0' self.Node.show() self.parent().node_dict['N0'].add(self) # When right click on element a menu pops on self.PropMenu = QMenu(parent) # self.PropMenu.addAction('Rotate') self.PropMenu.addAction('Delete') # Setting Geometry of menu self.PropMenu.move(parent.frameGeometry().left() + self.x() + 30, parent.frameGeometry().top() + self.y() + 30) def mousePressEvent(self, event): self.__mousePressPos = None self.__mouseMovePos = None if event.button() == QtCore.Qt.LeftButton: self.__mousePressPos = event.globalPos() self.__mouseMovePos = event.globalPos() if event.button() == QtCore.Qt.RightButton: action = self.PropMenu.exec() if action is not None: if action.text() == 'Delete': print('Delete clicked') self.deleteMe() # elif action.text() == 'Rotate': # print('Rotate clicked') # # self.Rotate() super(Ground, self).mousePressEvent(event) def mouseMoveEvent(self, event): if event.buttons() == QtCore.Qt.LeftButton: # adjust offset from clicked point to origin of widget currPos = self.mapToGlobal(self.pos()) globalPos = event.globalPos() diff = globalPos - self.__mouseMovePos newPos = self.mapFromGlobal(currPos + diff) # Moving element to new position self.move(newPos) self.Node.move(newPos.x() + 10, newPos.y() ) self.PropMenu.move(self.parent().frameGeometry().left() + newPos.x() + 30, self.parent().frameGeometry().top() + newPos.y() + 30) self.__mouseMovePos = globalPos super(Ground, self).mouseMoveEvent(event) def mouseReleaseEvent(self, event): if self.__mousePressPos is not None: moved = event.globalPos() - self.__mousePressPos if moved.manhattanLength() > 3: event.ignore() return super(Ground, self).mouseReleaseEvent(event) def deleteMe(self): self.hide() self.Node.hide()
def inicializar_ventana(self): #inicializamos la ventana self.setWindowTitle(self.title) self.setFixedSize(self.width, self.height) self.distr_caja_busquedas = QGridLayout() self.setLayout(self.distr_caja_busquedas) #Creación del logo logo = QLabel(self) pixmap = QPixmap("src/recursos/Banner.png") pixmap = pixmap.scaledToWidth(self.width) logo.setPixmap(pixmap) logo.setAlignment(QtCore.Qt.AlignCenter) #Etiquetas principales de la caja de búsquedas self.etiqueta_album = QLabel('Título del album') self.txt_album = QLineEdit() self.boton_buscar_album = QPushButton("Buscar") self.boton_buscar_album.clicked.connect(self.buscar_album) self.boton_ver_albumes = QPushButton("Ver todos") self.boton_ver_albumes.clicked.connect(self.ver_albumes) self.etiqueta_cancion = QLabel('Título de la canción') self.txt_cancion = QLineEdit() #Botones de acción self.boton_buscar_cancion = QPushButton("Buscar") self.boton_buscar_cancion.clicked.connect(self.buscar_cancion) self.boton_ver_canciones = QPushButton("Ver todas") self.boton_ver_canciones.clicked.connect(self.ver_canciones) self.etiqueta_interprete = QLabel('Intérprete de la canción') self.txt_interprete = QLineEdit() self.boton_buscar_interprete = QPushButton("Buscar") self.boton_buscar_interprete.clicked.connect(self.buscar_interprete) #self.boton_ver_interpretes = QPushButton("Ver todos") #self.boton_ver_interpretes.clicked.connect(self.ver_interpretes) self.etiqueta_resultados = QLabel('Resultados') self.etiqueta_resultados.setFont(QFont("Times", weight=QFont.Bold)) #Se añaden los elementos a los distribuidores self.distr_caja_busquedas.addWidget(logo, 0, 0, 1, 4) self.distr_caja_busquedas.addWidget(self.etiqueta_album, 1, 0) self.distr_caja_busquedas.addWidget(self.txt_album, 1, 1) self.distr_caja_busquedas.addWidget(self.boton_buscar_album, 1, 2) self.distr_caja_busquedas.addWidget(self.boton_ver_albumes, 1, 3) self.distr_caja_busquedas.addWidget(self.etiqueta_cancion, 2, 0) self.distr_caja_busquedas.addWidget(self.txt_cancion, 2, 1) self.distr_caja_busquedas.addWidget(self.boton_buscar_cancion, 2, 2) self.distr_caja_busquedas.addWidget(self.boton_ver_canciones, 2, 3) self.distr_caja_busquedas.addWidget(self.etiqueta_interprete, 3, 0) self.distr_caja_busquedas.addWidget(self.txt_interprete, 3, 1) self.distr_caja_busquedas.addWidget(self.boton_buscar_interprete, 3, 2) self.distr_caja_busquedas.addWidget(self.etiqueta_resultados, 4, 0, 1, 4) self.distr_caja_busquedas.setAlignment(self.etiqueta_resultados, QtCore.Qt.AlignCenter) #Se crea un área con barra de desplazamiento para mostrar los resultados self.tabla_resultados = QScrollArea() self.tabla_resultados.setFixedHeight(200) self.tabla_resultados.setWidgetResizable(True) self.widget_tabla_resultados = QWidget() self.widget_tabla_resultados.setLayout(QGridLayout()) self.tabla_resultados.setWidget(self.widget_tabla_resultados) self.distr_caja_busquedas.addWidget(self.tabla_resultados, 4, 0, 1, 4)
class Inductor(element): def __init__(self, name, parent, value = 0.01): element.__init__(self, name, parent, value) self.Impedance = 1j *2 * np.pi * Current_src.freq * self.value # adding image to resistor(that is a QLabel object itself) as its symbol self.symbol = QPixmap() self.symbol.load('ind.png') self.symbol = self.symbol.scaledToWidth(100) self.resize(self.symbol.size()) self.setPixmap(self.symbol) self.move(200, 100) self.valueText = QLineEdit(parent) self.valueText.move(self.x() + 30, self.y() + 40) self.valueText.resize(50, 15) self.valueText.setText(str(self.value) + ' H') self.idLabel = QLabel(parent) self.idLabel.move(self.x() + 45, self.y()) self.idLabel.resize(20, 15) self.idLabel.setText(str(self.name)) self.idLabel.show() self.nodeP = node(parent) self.nodeS = node(parent) self.nodeP.move(self.x(), self.y() + 22) self.nodeS.move(self.x() + 90, self.y() + 22) self.nodeP.show() self.nodeS.show() # first element tahr is connected to a ned is It's element. self.nodeP.connected_elements.add(self.name) self.nodeS.connected_elements.add(self.name) # When right click on element a menu pops on self.PropMenu = QMenu(parent) self.PropMenu.addAction('Change Value') self.PropMenu.addAction('Rotate') self.PropMenu.addAction('Delete') # Setting Geometry of menu self.PropMenu.move(parent.frameGeometry().left() + self.x() + 20, parent.frameGeometry().top() + self.y() + 100) self.isHorizontal = True self.direction_label = QLabel(parent) self.direction = QPixmap() self.valueText.show() self.show() def mousePressEvent(self, event): self.__mousePressPos = None self.__mouseMovePos = None if event.button() == QtCore.Qt.LeftButton: self.__mousePressPos = event.globalPos() self.__mouseMovePos = event.globalPos() if event.button() == QtCore.Qt.RightButton: action = self.PropMenu.exec() if action is not None: if action.text() == 'Change Value': print('Change Value clicked') self.value = float(re.match('\d*(?:.\d*e?-?\d*)?', self.valueText.text()).group()) self.Impedance = 1j *2 * np.pi * Current_src.freq * self.value elif action.text() == 'Rotate': print('Rotate clicked') self.Rotate() elif action.text() == 'Delete': print('Delete clicked') self.deleteMe() self.parent().elements.remove(self) super(Inductor, self).mousePressEvent(event) def mouseMoveEvent(self, event): if event.buttons() == QtCore.Qt.LeftButton: # adjust offset from clicked point to origin of widget currPos = self.mapToGlobal(self.pos()) globalPos = event.globalPos() diff = globalPos - self.__mouseMovePos newPos = self.mapFromGlobal(currPos + diff) # Moving element to new position self.move(newPos) if self.isHorizontal: self.nodeP.move(newPos.x(), newPos.y() + 22) self.nodeS.move(newPos.x() + 90, newPos.y() + 22) self.valueText.move(newPos.x() + 30, newPos.y() + 40) self.idLabel.move(newPos.x() + 45, newPos.y()) self.PropMenu.move(self.parent().frameGeometry().left() + newPos.x() + 20, self.parent().frameGeometry().top() + newPos.y() + 100) else: self.nodeP.move(newPos.x() + 18, newPos.y()) self.nodeS.move(newPos.x() + 18, newPos.y() + 90) self.valueText.move(newPos.x() + 40, newPos.y() + 45) self.idLabel.move(newPos.x() + 40, newPos.y() + 25) self.PropMenu.move(self.parent().frameGeometry().left() + newPos.x() + 100, self.parent().frameGeometry().top() + newPos.y() + 20) self.__mouseMovePos = globalPos super(Inductor, self).mouseMoveEvent(event) def mouseReleaseEvent(self, event): if self.__mousePressPos is not None: moved = event.globalPos() - self.__mousePressPos if moved.manhattanLength() > 3: event.ignore() return super(Inductor, self).mouseReleaseEvent(event) def Rotate(self): if(self.isHorizontal): self.symbol = QPixmap() self.symbol.load('ind2.png') self.symbol = self.symbol.scaledToHeight(100) self.resize(self.symbol.size()) self.setPixmap(self.symbol) self.valueText.move(self.x() + 40, self.y() + 45) self.idLabel.move(self.x() + 40, self.y() + 25) self.valueText.setText(str(self.value) + ' H') self.nodeP.move(self.x() + 18, self.y()) self.nodeS.move(self.x() + 18, self.y() + 90) self.isHorizontal = False else: self.symbol = QPixmap() self.symbol.load('ind.png') self.symbol = self.symbol.scaledToWidth(100) self.resize(self.symbol.size()) self.setPixmap(self.symbol) self.valueText.move(self.x() + 30, self.y() + 40) self.idLabel.move(self.x() + 45, self.y()) self.valueText.setText(str(self.value) + ' H') self.nodeP.move(self.x(), self.y() + 22) self.nodeS.move(self.x() + 90, self.y() + 22) self.isHorizontal = True def deleteMe(self): self.hide() self.nodeP.hide() self.nodeS.hide() self.idLabel.hide() self.valueText.hide() def show_detail(self): self.setStyleSheet("background-color: yellow") if self.isHorizontal: self.direction.load('arrow_right.png') self.direction = self.direction.scaledToWidth(100) self.direction_label.resize(self.direction.size()) self.direction_label.setPixmap(self.direction) self.direction_label.move(self.x(), self.y()) self.direction_label.show() else: self.direction.load('arrow_down.png') self.direction = self.direction.scaledToHeight(100) self.direction_label.resize(self.direction.size()) self.direction_label.setPixmap(self.direction) self.direction_label.move(self.x(), self.y()) self.direction_label.show() def hide_detail(self): self.setStyleSheet("background-color: none") self.direction_label.hide()
def ImageLoad(imageName, scale): img = QPixmap(runDirectory + "/weatherType/" + imageName + ".png") width = img.width() img = img.scaledToWidth(width * scale) return img
class Viewer(QtMainWindow): jobAdded = Signal() jobFinished = Signal() def __init__(self, weboob, parent=None): super(Viewer, self).__init__(parent) self.ui = Ui_Viewer() self.ui.setupUi(self) self.ui.prevButton.clicked.connect(self.prev) self.ui.nextButton.clicked.connect(self.next) self.ui.firstButton.clicked.connect(self.first) self.ui.lastButton.clicked.connect(self.last) self.ui.actionZoomIn.triggered.connect(self.zoomIn) self.ui.actionZoomOut.triggered.connect(self.zoomOut) self.ui.actionFullSize.triggered.connect(self.zoomFullSize) self.ui.actionFitWindow.triggered.connect(self.zoomFit) self.ui.actionSaveImage.setShortcut(QKeySequence.Save) self.ui.actionSaveImage.triggered.connect(self.saveImage) self.ui.actionClose.setShortcut(QKeySequence.Close) self.ui.actionClose.triggered.connect(self.close) self.model = None self.current = None self.total = 0 self.zoomFactor = 1 self.zoomMode = ZOOM_FACTOR self.weboob = weboob def setData(self, model, qidx): self.model = model self.current = QPersistentModelIndex(qidx) self.model.rowsInserted.connect(self.updatePos) self.model.rowsRemoved.connect(self.updatePos) self.model.rowsInserted.connect(self.updateNavButtons) self.model.rowsRemoved.connect(self.updateNavButtons) self.model.dataChanged.connect(self._dataChanged) self.model.modelReset.connect(self.disable) self.updateImage() @Slot() def disable(self): self.setEnabled(False) def updateNavButtons(self): prev = self.current.row() > 0 self.ui.prevButton.setEnabled(prev) self.ui.firstButton.setEnabled(prev) next = self.current.row() < self.total - 1 self.ui.nextButton.setEnabled(next) self.ui.lastButton.setEnabled(next) def updatePos(self): self.total = self.model.rowCount(self.current.parent()) self.ui.posLabel.setText('%d / %d' % (self.current.row() + 1, self.total)) def updateImage(self): self.updatePos() self.updateNavButtons() obj = self.current.data(ResultModel.RoleObject) if obj.data is NotLoaded: self.model.fillObj(obj, ['data'], QModelIndex(self.current)) self.pixmap = None elif obj.data: self.pixmap = QPixmap(QImage.fromData(obj.data)) else: self.pixmap = QPixmap() self._rebuildImage() @Slot(QModelIndex) def _dataChanged(self, qidx): if qidx == self.current: obj = qidx.data(ResultModel.RoleObject) if obj.data: self.pixmap = QPixmap(QImage.fromData(obj.data)) else: self.pixmap = QPixmap() self._rebuildImage() @Slot() def next(self): new = self.current.sibling(self.current.row() + 1, 0) if not new.isValid(): return self.current = QPersistentModelIndex(new) self.updateImage() @Slot() def prev(self): if self.current.row() == 0: return self.current = QPersistentModelIndex(self.current.sibling(self.current.row() - 1, 0)) self.updateImage() @Slot() def first(self): self.current = QPersistentModelIndex(self.current.sibling(0, 0)) self.updateImage() @Slot() def last(self): self.current = QPersistentModelIndex(self.current.sibling(self.total - 1, 0)) self.updateImage() @Slot() def zoomIn(self): self.zoomFactor *= 1.25 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomOut(self): self.zoomFactor *= 0.75 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomFullSize(self): self.zoomFactor = 1 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomFit(self): self.zoomMode = ZOOM_FIT self._rebuildImage() def resizeEvent(self, ev): super(Viewer, self).resizeEvent(ev) if self.zoomMode == ZOOM_FIT: self._rebuildImage() def _rebuildZoom(self): if self.zoomMode == ZOOM_FACTOR: new_width = int(self.pixmap.width() * self.zoomFactor) pixmap = self.pixmap.scaledToWidth(new_width, Qt.SmoothTransformation) else: new_size = self.ui.scrollArea.viewport().size() pixmap = self.pixmap.scaled(new_size, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.zoomFactor = pixmap.width() / float(self.pixmap.width()) return pixmap def _rebuildImage(self): if self.pixmap is None: self.ui.view.setText('Loading...') return elif self.pixmap.isNull(): self.ui.view.setText('Image could not be loaded') return pixmap = self._rebuildZoom() self.ui.view.setPixmap(pixmap) @Slot() def saveImage(self): def ext_for_filter(s): return re.match(r'(?:[A-Z]+) \(\*\.([a-z]+)\)$', s).group(1) if not self.pixmap: return filters = ['PNG (*.png)', 'JPEG (*.jpg)', 'GIF (*.gif)'] obj = self.current.data(ResultModel.RoleObject) name = '%s.%s' % (obj.title or obj.id or u'', obj.ext or 'png') default = filters[0] for f in filters: if name.endswith(ext_for_filter(f)): default = f filters = ';;'.join(filters) target = os.path.join(self.parent().lastSaveDir, name) out, filter = QFileDialog.getSaveFileName(self, 'Save image', target, filters, default) if not out: return ext = ext_for_filter(filter) self.parent().lastSaveDir = os.path.dirname(out) if not os.path.splitext(out)[1]: out = '%s.%s' % (out, ext) if os.path.exists(out): q = self.tr('%s already exists, are you sure you want to replace it?') % out reply = QMessageBox.question(self, self.tr('Overwrite?'), q) if reply == QMessageBox.No: return self.saveImage() self.pixmap.save(out, ext.upper())
def __init__(self, image_path): super().__init__() item_pixmap = QPixmap(image_path) resize_item = item_pixmap.scaledToWidth(150) self.item = QGraphicsPixmapItem(resize_item)
class App(): def __init__(self): # sizeObject = QDesktopWidget().screenGeometry() # print(" Screen size : " + str(sizeObject.height()) + "x" + str(sizeObject.width())) self.current_image_index = 0 print(self.current_image_index) QWidget().__init__() try: self.folder = sys.argv[1] except IndexError: print('You must specify the full path to a folder.\n') sys.exit(1) self.original_path = os.path.join(self.folder, 'original') self.full_masks_path = os.path.join(self.folder, 'full-masks') #Create array of images in 'original' folder self.original_images = [] for (dirpath, dirnames, original_filenames) in walk(self.original_path): self.original_images.extend(original_filenames) self.sortedoriginal = sorted(self.original_images) print(len(self.sortedoriginal)) #Create array of images in 'full-masks' folder self.full_masks_images = [] for (dirpath, dirnames, mask_filenames) in walk(self.full_masks_path): self.full_masks_images.extend(mask_filenames) self.sortedmasks = sorted(self.full_masks_images) print(len(self.sortedmasks)) #Full mask window self.w2 = QWidget() self.b2 = QLabel(self.w2) self.current_mask = QPixmap(os.path.join(self.full_masks_path, self.sortedmasks[self.current_image_index])) self.maskim = Image.open(os.path.join(self.full_masks_path, self.sortedmasks[self.current_image_index])) self.b2.setPixmap(self.current_mask) self.w2.setGeometry(1100, 200, 1003, 752) self.w2.setWindowTitle("Full mask: " + self.sortedmasks[self.current_image_index]) self.w2.show() #Original image window self.w = QWidget() self.b = QLabel(self.w) self.current_original_image = QPixmap(os.path.join(self.original_path, self.sortedoriginal[self.current_image_index])) self.origim = Image.open(os.path.join(self.original_path, self.sortedoriginal[self.current_image_index])) self.origimresized = resizeimage.resize_cover(self.origim, [1003, 752]) self.b.setPixmap(self.current_original_image.scaledToWidth(1003)) self.w.setGeometry(5, 200, 1003, 752) self.w.setWindowTitle("Original image: " + self.sortedoriginal[self.current_image_index]) self.w.show() #Overlayed image window self.w3 = QWidget() self.b3 = QLabel(self.w3) self.overlayed_image = Image.blend(self.origimresized, self.maskim, 0.3) self.qim = ImageQt(self.overlayed_image) self.pix = QPixmap.fromImage(self.qim) self.b3.setPixmap(self.pix) self.w3.setGeometry(2195, 200, 1003, 752) self.w3.setWindowTitle('Overlayed Image: ' + self.sortedoriginal[self.current_image_index]) self.w3.show() #Next button window self.btnwin = QWidget() self.btntext = QLabel(self.btnwin) self.btntext.setText("The images are in the following order: original image, full mask, overlayed mask.") self.btn = QPushButton(self.btnwin) self.btn.setText("Next") self.btn.clicked.connect(self.handle_btn) self.btnwin.setGeometry(700, 1000, 700, 100) self.btntext.move(50, 5) self.btn.move(300, 40) self.btnwin.setWindowTitle('PyQt 4') self.btnwin.show() self.load_new_image(self.sortedoriginal) def load_new_image(self, folder): print(folder) # def resize_image() def handle_btn(self): if self.current_image_index + 1 < len(self.sortedoriginal): self.current_image_index = self.current_image_index + 1 #Set new original image self.current_original_image = QPixmap(os.path.join(self.original_path, self.sortedoriginal[self.current_image_index])) self.origim = Image.open(os.path.join(self.original_path, self.sortedoriginal[self.current_image_index])) self.origimresized = resizeimage.resize_cover(self.origim, [1003, 752]) self.b.setPixmap(self.current_original_image) self.b.setPixmap(self.current_original_image.scaledToWidth(1003)) self.w.setWindowTitle("Original image: " + self.sortedoriginal[self.current_image_index]) #set new mask image self.current_mask = QPixmap(os.path.join(self.full_masks_path, self.sortedmasks[self.current_image_index])) self.maskim = Image.open(os.path.join(self.full_masks_path, self.sortedmasks[self.current_image_index])) self.b2.setPixmap(self.current_mask) self.w2.setWindowTitle("Full mask: " + self.sortedmasks[self.current_image_index]) #set new overlay image self.overlayed_image = Image.blend(self.origimresized, self.maskim, 0.3) self.qim = ImageQt(self.overlayed_image) self.pix = QPixmap.fromImage(self.qim) self.b3.setPixmap(self.pix) self.w3.setWindowTitle('Overlayed Image: ' + self.sortedoriginal[self.current_image_index]) self.w3.show() else: print("No more images in directory!")
class main_win(QWidget): switch_window = pyqtSignal() switch_window2 = pyqtSignal() def __init__(self): QWidget.__init__(self) self.setWindowTitle('OpenKDM') layout = QVBoxLayout() self.labelImage = QLabel(self) self.pixmap = QPixmap(appctxt.get_resource("logo_banner.png")) self.pixmap = self.pixmap.scaledToWidth(512) # image size self.labelImage.setPixmap(self.pixmap) self.labelImage.setAlignment(Qt.AlignCenter) self.button = QPushButton('Numerical Simulation') self.button.clicked.connect(self.login1) self.button2 = QPushButton('Analytical Solutions') self.button2.clicked.connect(self.login2) self.button.resize(100, 32) # self.button.setSizePolicy(QSizePolicy.Preferred,QSizePolicy.Expanding) # self.button2.setSizePolicy(QSizePolicy.Preferred,QSizePolicy.Expanding) self.button.setEnabled(False) self.button2.setEnabled(False) self.intro_text = """The study of the 'Kinematics and Dynamics of Machinery' (IITT course code: ME2206) lies at the very core of a mechanical engineering background. Although, little has changed in the way the subject is presented, our methodology brings the subject alive and current. We present the design and fabrication of a novel experimental setup for carrying out static, kinematic and dynamic analysis of three different mechanisms in a single setup. The mechanism is designed to be configurable to three different types of mechanisms namely - double crank, slider crank and a six bar mechanism depending on the use case. The mechanism has retrofitted parts (different link lengths and sliders) to facilitate multiple experiments in the same setup. The learner gets to 'play' with the mechanism parameters and immediately understand their effects. This will enhance one’s grasp of the concepts and the development of analytical skills. Hence greatly supplementing and reinforcing the theoretical understanding of the undergraduate students taking the course.""" self.license_text = """MIT License Copyright (c) 2020 Aakash Yadav Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ self.text = QLabel() self.text.setText(self.intro_text) self.text.setWordWrap(True) self.text.setAlignment(Qt.AlignCenter) self.license_layout = QVBoxLayout() self.license = QPlainTextEdit(self.license_text) self.license.setReadOnly(True) self.license_layout.addWidget(self.license) self.license_layout.setContentsMargins(200, 0, 200, 0) self.agree_box = QCheckBox("I have read the license agreement") # self.agree_box.setChecked(True) self.agree_box.stateChanged.connect(self.license_agree) self.license_layout.addWidget(self.agree_box) layout.addWidget(self.labelImage) layout.addWidget(self.text) layout.addLayout(self.license_layout) layout.addWidget(self.button) layout.addWidget(self.button2) layout.setSpacing(20) layout.setContentsMargins(200, 10, 200, 10) #left, top, right, bottom self.setLayout(layout) @pyqtSlot() def login1(self): self.switch_window.emit() @pyqtSlot() def login2(self): self.switch_window2.emit() @pyqtSlot() def license_agree(self): if self.sender().isChecked(): self.button.setEnabled(True) self.button2.setEnabled(True) else: self.button.setEnabled(False) self.button2.setEnabled(False)
def update_weather(self): self.wg.get_json_data() self.wg.parse_observation_data() self.wg.parse_forecast_data() w = self.wg.observation_dict f = self.wg.forecast_dict try: if w['observation_epoch'] != self.last_update: self.last_update = w['observation_epoch'] # Observation Section pix = QPixmap('/home/pi/piqtwx/icons/%s' % w['icon']) self.icon_current.setPixmap(pix) self.text_current_temp_f.setText( '<span style="color:#feae3c;">' '<b>%s</b><sup>°F</sup>' '</span>' % w['temp_f'] ) self.text_wind_dir.setText(w['wind_dir']) self.text_wind_speed.setText( '<b>%s</b>' % w['wind_mph'] ) if w['heat_index_f'] == 'NA' and w['windchill_f'] == 'NA': self.label_hi_or_wc.setText('HI:') self.text_hi_or_wc.setText('<b>NA</b>') elif w['heat_index_f'] != 'NA': self.label_hi_or_wc.setText('HI:') self.text_hi_or_wc.setText( '<b>%s</b>°F' % w['heat_index_f'] ) else: self.label_hi_or_wc.setText('WC:') self.text_hi_or_wc.setText( '<b>%s</b>°F' % w['windchill_f'] ) self.text_dewpoint.setText( '<b>%s</b>°F' % w['dewpoint_f'] ) self.text_humidity.setText( '<b>%s</b>' % w['relative_humidity'] ) self.text_pressure.setText( '<b>%s</b> in.' % w['pressure_in'] ) self.text_visibility.setText( '<b>%s</b> miles' % w['visibility_mi'] ) if w['precip_today_in'] != "": self.text_precip.setText( '<b>%s</b> in.' % w['precip_today_in'] ) else: self.text_precip.setText( '<b>0.0</b> in.' ) # Forecast Section self.text_forecast1_date.setText( '<b>%s %s/%s</b>' % ( f[0]['weekday'], f[0]['month'], f[0]['day'] ) ) self.text_forecast1_temp.setText( '<b style="color:#feae3c;">%s°</b>' '<span style="color:#aaa;"> | </span>' '<b style="color:#0074a2;">%s°</b>' % ( f[0]['high_f'], f[0]['low_f'] ) ) pix = QPixmap('/home/pi/piqtwx/icons/%s' % f[0]['icon']) self.icon_forecast1.setPixmap(pix.scaledToWidth(40)) self.text_forecast2_date.setText( '<b>%s %s/%s</b>' % ( f[1]['weekday'], f[1]['month'], f[1]['day'] ) ) self.text_forecast2_temp.setText( '<b style="color:#feae3c;">%s°</b>' '<span style="color:#aaa;"> | </span>' '<b style="color:#0074a2;">%s°</b>' % ( f[1]['high_f'], f[1]['low_f'] ) ) pix = QPixmap('/home/pi/piqtwx/icons/%s' % f[1]['icon']) self.icon_forecast2.setPixmap(pix.scaledToWidth(40)) self.text_forecast3_date.setText( '<b>%s %s/%s</b>' % ( f[2]['weekday'], f[2]['month'], f[2]['day'] ) ) self.text_forecast3_temp.setText( '<b style="color:#feae3c;">%s°</b>' '<span style="color:#aaa;"> | </span>' '<b style="color:#0074a2;">%s°</b>' % ( f[2]['high_f'], f[2]['low_f'] ) ) pix = QPixmap('/home/pi/piqtwx/icons/%s' % f[2]['icon']) self.icon_forecast3.setPixmap(pix.scaledToWidth(40)) except KeyError: # Current Observations pix = QPixmap('/home/pi/piqtwx/icons/unknown.png') self.icon_current.setPixmap(pix) self.text_current_temp_f.setText('<b>??</b><sup>°F</sup>') self.text_hi_or_wc.setText('<b>???</b>°F') self.text_dewpoint.setText('<b>???</b>°F') self.text_humidity.setText('<b>???</b>%') self.text_pressure.setText('<b>???</b> in.') self.text_visibility.setText('<b>???</b> miles') self.text_precip.setText('<b>???</b> in.') # Forecast self.text_forecast1_date.setText('<b>???</b>') self.icon_forecast1.setPixmap(pix) self.text_forecast1_temp.setText( '<b style="color:#feae3c;">???°</b>' '<span style="color:#aaa;"> | </span>' '<b style="color:#0074a2;">???°</b>' ) self.text_forecast2_date.setText('<b>???</b>') self.icon_forecast2.setPixmap(pix) self.text_forecast2_temp.setText( '<b style="color:#feae3c;">???°</b>' '<span style="color:#aaa;"> | </span>' '<b style="color:#0074a2;">???°</b>' ) self.text_forecast3_date.setText('<b>???</b>') self.icon_forecast3.setPixmap(pix) self.text_forecast3_temp.setText( '<b style="color:#feae3c;">???°</b>' '<span style="color:#aaa;"> | </span>' '<b style="color:#0074a2;">???°</b>' ) return False return True
class ScoreTracker(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle('ScoreKeeper 4.2') self.stack = QStackedWidget(self) self.setCentralWidget(self.stack) self.create_titleScreen() self.create_scoreScreen() current_dir = os.path.dirname(os.path.abspath(__file__)) styles = os.path.join(current_dir, 'score_tracker.css') with open(styles, 'r') as f: self.setStyleSheet(f.read()) self.stack.addWidget(self.title_screen) self.stack.addWidget(self.score_screen) self._create_menu() self._create_tool_bar() def create_scoreScreen(self): self.score_header = QLabel() self.screen_image = QPixmap(':/images/score_board2.jpg') self.screen_image.scaledToWidth(0) self.score_header.setPixmap(self.screen_image) self.score_screen = QWidget() self.score_screen.setObjectName("score_screen") self.score_screen_layout = QVBoxLayout() self.score_screen.setLayout(self.score_screen_layout) self.score_screen_layout.addWidget(self.score_header) self.score_label = QLabel() self.score_screen_layout.addWidget(self.score_label) def create_titleScreen(self): self.header = QLabel() self.title_image = QPixmap(':/images/score_board.jpg') self.title_image.scaledToWidth(15) self.header.setPixmap(self.title_image) self.player_no = QComboBox() self.players = ['1', '2', '3', '4'] self.player_no.addItems(self.players) self.player_boxLabel = QLabel( 'Please select the number of players (1-4):') self.player_boxLabel.setObjectName('cbox_label') self.player_boxLabel.setBuddy(self.player_no) self.title_screen = QWidget() self.title_screen.setObjectName("title_screen") self.title_screen_layout = QVBoxLayout() self.title_screen.setLayout(self.title_screen_layout) self.title_screen_layout.addWidget(self.header) self.title_screen_layout.addWidget(self.player_boxLabel) self.title_screen_layout.addWidget(self.player_no) self.title_button = QPushButton('Create Score Board') self.title_screen_layout.addWidget(self.title_button) self.title_button.clicked.connect(self.score_screen_onClick) self.title_button.clicked.connect(self._create_players) def _create_players(self): number_of_players = self.player_no.currentText() self.holding_list = [] for i in range(int(number_of_players)): self.holding_list.append(Player()) for j in range(int(number_of_players)): self.score_screen_layout.addWidget( self.holding_list[j].button_group) def _add_player(self): self.new_player = Player() self.holding_list.append(self.new_player) self.score_screen_layout.addWidget( self.holding_list[len(self.holding_list) - 1].button_group) def _remove_player(self): if (len(self.holding_list) > 1): self.holding_list[-1].button_group.setParent(None) self.holding_list.pop() for k in range(0, 10): QApplication.processEvents() self.resize(self.minimumSizeHint()) def score_screen_onClick(self): self.stack.setCurrentIndex(1) def title_screen_onClick(self): self.stack.setCurrentIndex(0) def _create_tool_bar(self): self.tools = QToolBar() self.addToolBar(self.tools) self.tools.addAction('&Add Player', self._add_player) self.tools.addAction('&Remove Player', self._remove_player) def _create_menu(self): self.menu = self.menuBar().addMenu('&Menu') self.help = self.menuBar().addMenu('&Help') self.menu.addAction('&Exit', self.close) self.help.addAction('&About', self.display_about) def display_about(self): about = QDialog(self) layout = QVBoxLayout() about_label = QLabel( 'Small ScoreKeeper app made in Python, \nshoutout to John Milley. \n\n\n\n\t\t CNA OOP Python 1890 ' ) layout.addWidget(about_label) about.setLayout(layout) about.exec()
def __init__(self): super().__init__() self.show_log = False # create a palette, used to set color self.pe = QPalette() """ UI for training """ choose_train_data = QPushButton('choose train data') self.start_train = QPushButton('Start training') self.stop_train = QPushButton('Stop training') choose_train_data.clicked.connect(self.show_train_dialog) self.start_train.clicked.connect(self.start_train_func) self.stop_train.clicked.connect(self.stop_train_func) # used to show the chosen training directory self.train_dir_edit = QLineEdit() # used to show training statics self.statics_label = QLabel('') self.statics_label.setAlignment(Qt.AlignTop) self.statics_label.setAutoFillBackground(True) self.pe.setColor(QPalette.Background, Qt.white) self.statics_label.setPalette(self.pe) self.loss_label = QLabel('') self.pe.setColor(QPalette.Background, Qt.white) self.loss_label.setAutoFillBackground(True) self.loss_label.setPalette(self.pe) self.resize_image(path="./buffer/blank.jpg", mode='loss') loss_im = QPixmap("./buffer/loss_buffer.jpg") loss_im = loss_im.scaledToWidth(430) loss_im = loss_im.scaledToHeight(300) self.loss_label.setPixmap(loss_im) # add buttons, label, and edit to the ui grid_train = QGridLayout() grid_train.setSpacing(10) grid_train.addWidget(choose_train_data, 1, 0) grid_train.addWidget(self.train_dir_edit, 1, 1, 1, 3) grid_train.addWidget(self.start_train, 1, 4, 1, 2) grid_train.addWidget(self.stop_train, 1, 6, 1, 2) grid_train.addWidget(self.statics_label, 2, 0, -1, 4) grid_train.addWidget(self.loss_label, 2, 4, -1, 4) """ UI for testing """ choose_test_data = QPushButton('choose test data') choose_test_data.clicked.connect(self.show_test_dialog) self.test_dir_edit = QLineEdit() # create a label to show image self.image_label = QLabel() self.resize_image(path="./buffer/blank.jpg", mode='test') test_im = QPixmap("./buffer/test_buffer.jpg") test_im = test_im.scaledToWidth(430) test_im = test_im.scaledToHeight(430) self.image_label.setPixmap(test_im) self.results_label = QLabel('Results') self.results_label.setAlignment(Qt.AlignCenter) self.pe.setColor(QPalette.Background, Qt.lightGray) self.results_label.setAutoFillBackground(True) self.results_label.setPalette(self.pe) # add thses buttons, labels, edit to the ui grid_test = QGridLayout() grid_test.setSpacing(10) grid_test.addWidget(choose_test_data, 1, 0) grid_test.addWidget(self.test_dir_edit, 1, 1, 1, 3) grid_test.addWidget(self.image_label, 2, 0, -1, 4) grid_test.addWidget(self.results_label, 1, 4, 1, 4) # create ui for test results self.pe.setColor(QPalette.Background, Qt.white) collar_label = QLabel('领子设计') collar_label.setAlignment(Qt.AlignCenter) self.collar_result = QLabel('') self.collar_result.setAutoFillBackground(True) self.collar_result.setPalette(self.pe) self.collar_result.setAlignment(Qt.AlignCenter) neckline_label = QLabel('颈线设计') neckline_label.setAlignment(Qt.AlignCenter) self.neckline_result = QLabel('') self.neckline_result.setAutoFillBackground(True) self.neckline_result.setPalette(self.pe) self.neckline_result.setAlignment(Qt.AlignCenter) neck_label = QLabel('脖颈设计') neck_label.setAlignment(Qt.AlignCenter) self.neck_result = QLabel('') self.neck_result.setAutoFillBackground(True) self.neck_result.setPalette(self.pe) self.neck_result.setAlignment(Qt.AlignCenter) lapel_label = QLabel('翻领设计') lapel_label.setAlignment(Qt.AlignCenter) self.lapel_result = QLabel('') self.lapel_result.setAutoFillBackground(True) self.lapel_result.setPalette(self.pe) self.lapel_result.setAlignment(Qt.AlignCenter) coat_label = QLabel('衣长') coat_label.setAlignment(Qt.AlignCenter) self.coat_result = QLabel('') self.coat_result.setAutoFillBackground(True) self.coat_result.setPalette(self.pe) self.coat_result.setAlignment(Qt.AlignCenter) pant_laebl = QLabel('裤长') pant_laebl.setAlignment(Qt.AlignCenter) self.pant_result = QLabel('') self.pant_result.setAutoFillBackground(True) self.pant_result.setPalette(self.pe) self.pant_result.setAlignment(Qt.AlignCenter) skirt_label = QLabel('裙长') skirt_label.setAlignment(Qt.AlignCenter) self.skirt_result = QLabel('') self.skirt_result.setAutoFillBackground(True) self.skirt_result.setPalette(self.pe) self.skirt_result.setAlignment(Qt.AlignCenter) sleeve_label = QLabel('袖长') sleeve_label.setAlignment(Qt.AlignCenter) self.sleeve_result = QLabel('') self.sleeve_result.setAutoFillBackground(True) self.sleeve_result.setPalette(self.pe) self.sleeve_result.setAlignment(Qt.AlignCenter) grid_test.addWidget(collar_label, 2, 4, 1, 2) grid_test.addWidget(self.collar_result, 3, 4, 1, 2) grid_test.addWidget(neckline_label, 2, 6, 1, 2) grid_test.addWidget(self.neckline_result, 3, 6, 1, 2) grid_test.addWidget(neck_label, 4, 4, 1, 2) grid_test.addWidget(self.neck_result, 5, 4, 1, 2) grid_test.addWidget(lapel_label, 4, 6, 1, 2) grid_test.addWidget(self.lapel_result, 5, 6, 1, 2) grid_test.addWidget(coat_label, 6, 4, 1, 2) grid_test.addWidget(self.coat_result, 7, 4, 1, 2) grid_test.addWidget(pant_laebl, 6, 6, 1, 2) grid_test.addWidget(self.pant_result, 7, 6, 1, 2) grid_test.addWidget(skirt_label, 8, 4, 1, 2) grid_test.addWidget(self.skirt_result, 9, 4, 1, 2) grid_test.addWidget(sleeve_label, 8, 6, 1, 2) grid_test.addWidget(self.sleeve_result, 9, 6, 1, 2) """ combine two grid """ upper_grid = QGridLayout() upper_grid.setSpacing(10) upper_grid.addLayout(grid_train, 1, 0) upper_grid.addLayout(grid_test, 2, 0) """ show the ui """ self.setLayout(upper_grid) self.setGeometry(300, 100, 890, 860) self.setWindowTitle('image classification') self.setFixedSize(890, 860) self.show()
class sistema(QMainWindow, QDialog): def __init__(self, logado): QMainWindow.__init__(self) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.setWindowIcon(QIcon("icon/app.png")) self.userlog = logado self.ui.login_logado.setText(self.userlog) #usuario logado # PAGE 1 #self.ui.btn_page_1.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.page1)) # PAGE 2 #self.ui.btn_page_2.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.page2)) # PAGE 3 #self.ui.btn_page_3.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.pagina3)) #icone #Imagens::: self.ui.btnEscolherArquivo.clicked.connect( self.abrir_imagem) #abrir foto self.ui.btnRedimensionar.clicked.connect( self.redimensionar) #colocar no tamanho self.ui.btnSalvar.clicked.connect(self.salvar) #salvar foto self.ui.ver_link_2.clicked.connect( self.abrir_imagem_pagina3) #abrir imagen self.ui.baixa_link.clicked.connect(self.opcao) #opcao baixa self.ui.pushButton.clicked.connect(self.box) # ver imagen #MENU BAR CHAMAR PAGINA self.ui.actionPAGINA1.triggered.connect( lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.page1)) self.ui.actionPAGINA2.triggered.connect( lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.page2)) self.ui.actionPAGINA3.triggered.connect( lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.pagina3)) self.ui.actionPAGINA4.triggered.connect( lambda: self.ui.stackedWidget.setCurrentWidget(self.ui. pagin4_cadastro)) self.ui.actionFECHAR.triggered.connect(self.menu_inicial) def menu_inicial(self): #volta tela de login quit() def box(self): #seta combox item = self.ui.comboBox.currentText() self.ui.label_pagina2.setText(item) def opcao(self): #selecionar opcao baixa_musica = self.ui.caixa_link_2.text() baixa_foto = self.ui.caixa_link_2.text() baixa_video = self.ui.caixa_link_2.text() if self.ui.radioButton_image.isChecked(): #baixa image try: self.ui.tela_2.setText("baixando") baixa_foto == urlretrieve(baixa_foto, "imagen.png") time.sleep(2) except: QMessageBox.about(self, "Title", "Imagen") time.sleep(2) self.sistema = Imagen() self.sistema.show() self.ui.tela_2.setText("") self.ui.caixa_link_2.setText("") if self.ui.radioButton_musica.isChecked(): #baixa musica try: baixa_musica == urlretrieve(baixa_musica, "musica.mp3") self.ui.tela_2.setText("baixando") time.sleep(2) except: QMessageBox.about(self, "Title", "Musica") self.ui.tela_2.setText("") self.ui.caixa_link_2.setText("") if self.ui.radioButton_video_2.isChecked(): #video try: self.ui.tela_2.setText("baixando") baixa_video == urlretrieve(baixa_video, "video.mp4") time.sleep(2) except: QMessageBox.about(self, "Title", "Video") self.ui.tela_2.setText("") self.ui.caixa_link_2.setText("") ############################################### def abrir_imagem(self): #imagens imagem, _ = QFileDialog.getOpenFileName( self.ui.centralwidget, 'Abrir imagem', r'/home/luizotavio/Imagens/', options=QFileDialog.DontUseNativeDialog) self.ui.inputAbrirArquivo.setText(imagem) self.original_img = QPixmap(imagem) self.ui.labelImg.setPixmap(self.original_img) self.ui.inputLargura.setText(str(self.original_img.width())) self.ui.inputAltura.setText(str(self.original_img.height())) def redimensionar(self): #imagens largura = int(self.ui.inputLargura.text()) self.nova_imagem = self.original_img.scaledToWidth(largura) self.ui.labelImg.setPixmap(self.nova_imagem) self.ui.inputLargura.setText(str(self.nova_imagem.width())) self.ui.inputAltura.setText(str(self.nova_imagem.height())) def salvar(self): #imagens imagem, _ = QFileDialog.getSaveFileName( self.ui.centralwidget, 'Salvar imagem', r'/home/luizotavio/Desktop/', options=QFileDialog.DontUseNativeDialog) self.nova_imagem.save(imagem, 'PNG') ############################################## def abrir_imagem_pagina3(self): #imagens pagina 3 imagem, _ = QFileDialog.getOpenFileName( self.ui.centralwidget, 'Ver Imagen', r'/home/luizotavio/Imagens/', options=QFileDialog.DontUseNativeDialog) self.ui.inputAbrirArquivo_2.setText(imagem) self.original_img = QPixmap(imagem) self.ui.Open_pagina2.setPixmap(self.original_img)
class LoginForm(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 프로그램 전체 설정(배경색, 제목, 크기) self.setStyleSheet("background-color:white;") self.setWindowTitle('펀치 QR 생성') self.resize(300, 500) # GridLayout layout = QGridLayout() # Punch 로고 self.lbl = QLabel() self.lbl.setMinimumSize(300, 400) self.img = QPixmap("logoW.png") self.lbl.setPixmap(self.img.scaledToWidth(170)) self.lbl.setStyleSheet( "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, " "stop: 0.4 #FF4B2B," "stop: 1.0 #FF416C,);" "border-radius : 15px;") self.lbl.setAlignment(Qt.AlignCenter) layout.addWidget(self.lbl, 0, 0) # ID 입력창 self.lineEdit_username = QLineEdit() self.lineEdit_username.setStyleSheet( "font-family: NanumSquare; font-size: 20px; font-weight:bold; " "padding-left: 10px;" "background-color: #f6f7f9; border-radius:10px; height:45px;") self.lineEdit_username.setPlaceholderText('아이디') self.lineEdit_username.resize(50, 10) layout.addWidget(self.lineEdit_username, 2, 0) # 비밀번호 입력창 self.lineEdit_password = QLineEdit() self.lineEdit_password.setStyleSheet( "font-family: NanumSquare; font-size: 20px; font-weight:bold; " "padding-left: 10px;" "background-color: #f6f7f9; border-radius:10px; height:45px;") self.lineEdit_password.setEchoMode(QLineEdit.Password) self.lineEdit_password.setPlaceholderText('비밀번호') layout.addWidget(self.lineEdit_password, 3, 0) # 로그인버튼 button_login = QPushButton('로그인') button_login.clicked.connect(self.login) button_login.setShortcut("Return") button_login.setStyleSheet( "font-size : 20px; background-color: #fff; font-family: NanumSquare;" "background-color: #fff;" "height: 45px; margin-top:10px; padding 5px;") layout.addWidget(button_login, 4, 0) # 전체 레이아웃 설정 self.setLayout(layout) # login 함수 구현 def login(self): if self.lineEdit_username.text() == "" or self.lineEdit_password.text( ) == "": msg = QMessageBox() msg.setText('아이디 혹은 비밀번호를 입력하세요.') msg.exec_() else: url_post = "http://ec2-54-180-94-182.ap-northeast-2.compute.amazonaws.com:3000/python/login" login_json = { 'inputId': self.lineEdit_username.text(), 'inputPw': self.lineEdit_password.text() } response = requests.post(url_post, json=login_json) if response.status_code == 200: data_login = response.json() if data_login['error']: msg = QMessageBox() msg.setText('아이디 혹은 비밀번호를 확인해주세요.') msg.exec_() else: global qr_token qr_token = data_login['token'] self.close() self.qr = QR() self.qr.show() else: msg = QMessageBox() msg.setText('인터넷 연결을 확인해주세요.') msg.exec_()
def makeImage(self, image): pixmap = QPixmap(self.imageRes(image)) pixmap.scaledToWidth(300) pixmap.scaledToHeight(300) return pixmap
def __init__(self, players): super().__init__() print('Players to play: ', players) # PowerUp process self.powerUpQueue = Queue() print('Regular process id: ', current_process().pid) powerUpProcess = Process(target=powerup_process, args=[self.powerUpQueue]) powerUpProcess.start() self.powerUpLabels = [] # ShootLaser thread self.shootLaser = ShootLaser() self.shootLaser.calc_done.connect(self.move_laser_up) self.shootLaser.collision_detected.connect( self.player_laser_enemy_collide) self.shootLaser.moving_collision_detected.connect( self.player_laser_moving_enemy_collide) self.shootLaser.start() # MoveEnemy thread self.moveEnemy = MoveEnemy() self.moveEnemy.calc_done.connect(self.move_enemy) self.moveEnemy.start() # EnemyShoot thread self.enemyShoot = EnemyShoot() self.enemyShoot.can_shoot.connect(self.enemy_shoot_laser) self.enemyShoot.move_down.connect(self.move_enemy_laser) self.enemyShoot.collision_detected.connect(self.enemy_hit_player) self.enemyShoot.next_level.connect(self.next_level) self.enemyShoot.start() # EnemyAttack thread self.enemyAttack = EnemyAttack() self.enemyAttack.can_attack.connect(self.enemy_attack_player) self.enemyAttack.move_down.connect(self.move_enemy_down) self.enemyAttack.player_collision.connect(self.enemy_attack_player_hit) self.enemyAttack.start() # PowerUp thread self.deusExMachina = DeusExMachina() self.deusExMachina.collision_detected.connect(self.powerup_collision) self.deusExMachina.powerup_timeout.connect(self.powerup_timeout) self.deusExMachina.start() # Power up timer self.powerUpTimer = QTimer() self.powerUpTimer.setInterval(config.POWERUP_TIMEOUT) self.powerUpTimer.timeout.connect(self.show_powerup) self.powerUpTimer.start() # Gameplay options self.activePlayers = players self.startPlayers = players self.playerOneSpeed = config.PLAYER_SPEED self.playerTwoSpeed = config.PLAYER_SPEED self.playerOneCanShoot = True self.playerTwoCanShoot = True # Add background pixmap self.backgroundPixmap = QPixmap('images/background.png') # Add player one self.playerPixmap = QPixmap('images/ship.png') # add second player if self.startPlayers == 2: self.playerTwoPixmap = QPixmap('images/ship_two.png') # Set enemy pixmaps self.enemyPixmaps = [] enemyPixmap = QPixmap('images/enemy_1.png') enemyPixmap = enemyPixmap.scaledToWidth(config.IMAGE_WIDTH - 20) enemyPixmap = enemyPixmap.scaledToHeight(config.IMAGE_HEIGHT - 20) self.enemyPixmaps.append(enemyPixmap) enemyPixmap = QPixmap('images/enemy_2.png') enemyPixmap = enemyPixmap.scaledToWidth(config.IMAGE_WIDTH - 20) enemyPixmap = enemyPixmap.scaledToHeight(config.IMAGE_HEIGHT - 20) self.enemyPixmaps.append(enemyPixmap) enemyPixmap = QPixmap('images/enemy_3.png') enemyPixmap = enemyPixmap.scaledToWidth(config.IMAGE_WIDTH - 20) enemyPixmap = enemyPixmap.scaledToHeight(config.IMAGE_HEIGHT - 20) self.enemyPixmaps.append(enemyPixmap) enemyPixmap = QPixmap('images/enemy_4.png') enemyPixmap = enemyPixmap.scaledToWidth(config.IMAGE_WIDTH - 20) enemyPixmap = enemyPixmap.scaledToHeight(config.IMAGE_HEIGHT - 20) self.enemyPixmaps.append(enemyPixmap) self.__init_ui__()
class MainWindow(QMainWindow): def __init__(self): # Basic stuff super(MainWindow, self).__init__() self.title = "Annotation Tool" self.setWindowTitle(self.title) # Shorter side of image is scaled to this size self.displaySize = 500 self.targetSize = 1024 self.bboxSteps = 5 self.resize(1200, 800) self.setFixedSize(1200, 800) # Menu bar # Open dataset openAction = QAction('Open', self) openAction.setStatusTip('Opens a dataset...') openAction.triggered.connect(self.openDataset) # Save dataset saveAction = QAction('Save', self) saveAction.setStatusTip('Saves a dataset...') saveAction.triggered.connect(self.saveDataset) # Add to Menubar menuBar = self.menuBar() fileMenu = menuBar.addMenu('File') fileMenu.addAction(openAction) fileMenu.addAction(saveAction) # Dataset stuff self.dataset_path = None self.df = None self.cur_index = -1 # Saved for currently displayed image self.imagepath = None self.im = None # Define label to display image self.label = QLabel(self) self.label.setAlignment(Qt.AlignCenter) self.label.mousePressEvent = self.moveBBox self.setCentralWidget(self.label) self.painter = None self.show() def openDataset(self): # Open dataset .csv file_name = QFileDialog.getOpenFileName(self, 'Open File') self.dataset_path = os.path.dirname(file_name[0]) self.df = pd.read_csv(filename[0]) #pathlib.Path(self.dataset_path, 'labels').mkdir(parents=True, exist_ok=True) # Add flagged and crop_offset columns #self.df['flagged'] = False #self.df['bboxX'] = np.nan #self.df['bboxY'] = np.nan #self.df['bboxSize'] = np.nan # Display first image self.keyPressEvent(QKeyEvent(QEvent.KeyPress, Qt.Key_F, Qt.NoModifier)) def saveDataset(self): # Save dataset to .csv filename = QFileDialog.getSaveFileName(self, 'Save File') with open(filename[0], 'w', encoding='utf-8') as f: self.df.to_csv(f, index=False, line_terminator='\n') def prepareImage(self): self.xOffset, self.yOffset, self.bboxScale = 0.0, 0.0, 1.0 # Load image self.im = Image.open(self.imagepath) self.pixmap = QPixmap(self.imagepath) # Scale shorter side to self.display_size while retaining aspect ratio self.w, self.h = self.im.size self.isBroad = (self.w > self.h) if self.isBroad: self.bboxMax = self.h self.scale_f = self.displaySize / self.h self.w = int(self.scale_f * self.w) self.h = self.displaySize else: self.bboxMax = self.w self.scale_f = self.displaySize / self.w self.w = self.displaySize self.h = int(self.scale_f * self.h) self.bboxMin = self.targetSize if self.targetSize < self.bboxMax else self.bboxMax self.bboxStep = (self.bboxMax - self.bboxMin) / self.bboxSteps if self.isBroad: self.pixmap = self.pixmap.scaledToHeight(self.displaySize) else: self.pixmap = self.pixmap.scaledToWidth(self.displaySize) # xOffset and yOffset are for crop bounding box def displayImage(self): pixmap = self.pixmap.copy() # Create painter self.painter = QPainter(pixmap) # Configure painter self.penRectangle = QPen(Qt.red) self.penRectangle.setWidth(3) self.painter.setPen(self.penRectangle) # Initial position of bounding box bboxSize = self.bboxMin * self.scale_f + self.bboxScale * self.bboxSteps * self.bboxStep * self.scale_f xPos = (0.5 * self.w - 0.5 * bboxSize) yPos = (0.5 * self.h - 0.5 * bboxSize) # Add offset x = min(max(xPos + self.xOffset, 0.0), self.w - bboxSize) y = min(max(yPos + self.yOffset, 0.0), self.h - bboxSize) # Draw bounding box rectangle and center point self.painter.drawRect(x, y, bboxSize - 1, bboxSize - 1) self.painter.drawPoint(x + (bboxSize - 1) / 2, y + (bboxSize - 1) / 2) self.label.setPixmap(pixmap) # Save crop_offset to dataframe scale_f_inv = 1.0 / self.scale_f bboxX, bboxY, bboxSize_ = int(x * scale_f_inv), int( y * scale_f_inv), int(bboxSize * scale_f_inv) print('{:d}/{:d} | X: {:d}, Y: {:d}, S: {:d}'.format( self.cur_index, len(self.df), bboxX, bboxY, bboxSize_)) self.df.loc[self.cur_index, 'bboxX'] = bboxX self.df.loc[self.cur_index, 'bboxY'] = bboxY self.df.loc[self.cur_index, 'bboxSize'] = bboxSize_ del self.painter # Moves crop bbox on click def moveBBox(self, event): if self.df is None: return self.xOffset = event.pos().x() - self.label.width() / 2 self.yOffset = event.pos().y() - self.label.height() / 2 self.displayImage() def keyPressEvent(self, event): key = event.key() new_image = False if event.key() == Qt.Key_F: # Next image new_image = True self.cur_index = self.cur_index + 1 if self.cur_index + 1 < len( self.df) else len(self.df) - 1 elif event.key() == Qt.Key_A: # Previous image new_image = True self.cur_index = self.cur_index - 1 if self.cur_index - 1 >= 0 else 0 elif event.key() == Qt.Key_L: # Move BBox self.xOffset += 20.0 self.displayImage() elif event.key() == Qt.Key_H: self.xOffset -= 20.0 self.displayImage() elif event.key() == Qt.Key_J: self.yOffset += 20.0 self.displayImage() elif event.key() == Qt.Key_K: self.yOffset -= 20.0 self.displayImage() elif event.key() == Qt.Key_D: # Change Bbox scale self.bboxScale += 1.0 / self.bboxSteps self.bboxScale = min(1.0, self.bboxScale) self.displayImage() elif event.key() == Qt.Key_S: self.bboxScale -= 1.0 / self.bboxSteps self.bboxScale = max(0.0, self.bboxScale) self.displayImage() elif event.key() == Qt.Key_G: # Flag/Unflag self.df.loc[self.cur_index, 'flagged'] = not self.df.loc[self.cur_index, 'flagged'] print('Flagged:', self.df.loc[self.cur_index, 'flagged']) # Open image and display if new_image: self.imagepath = opjoin(self.dataset_path, 'images', self.df.iloc[self.cur_index]['id']) if os.path.isfile(self.imagepath + '.jpeg'): self.imagepath += '.jpeg' elif os.path.isfile(self.imagepath + '.png'): self.imagepath += '.png' else: print('Skipping image, because not found') self.df.iloc[self.cur_index]['flagged'] = True self.keyPressEvent(event) try: im = Image.open(self.imagepath) except: print('Skipping image, because cannot open') self.df.loc[self.cur_index, 'flagged'] = True self.keyPressEvent(event) self.prepareImage() self.displayImage()
def __init__(self): super().__init__() self.central_widget = QWidget() self.answers = { "0.mp4": "Dalla Dalla - Itzy", "1.mp4": "Gashina - Sunmi", "2.mp4": "Heart Shaker - Twice", "3.mp4": "Kill This Love - Blackpink", "4.mp4": "Psycho - Red Velvet", "5.mp4": "Red Flavor - Red Velvet", "6.mp4": "What is Love - Twice" } # Logo up top labelImage = QLabel() pixmap = QPixmap("logo.png") pixmap = pixmap.scaledToWidth(100) labelImage.setPixmap(pixmap) # Text on right of logo name_of_app = QLabel('Guess That Song!') learn_more = QPushButton("Learn More") width = learn_more.fontMetrics().boundingRect( 'Learn More').width() + 12 learn_more.setMaximumWidth(width) # name_of_app.setIndent(3) top_font = QFont("Helvetica", 30, QFont.Bold) name_of_app.setFont(top_font) # Layout up top top_layout = QHBoxLayout() right_layout = QVBoxLayout() right_button_layout = QHBoxLayout() right_button_layout.setAlignment(Qt.AlignRight) top_layout.addWidget(labelImage) right_layout.addWidget(name_of_app) right_button_layout.addWidget(learn_more) right_layout.addLayout(right_button_layout) top_layout.addLayout(right_layout) self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) self.videoWidget = QVideoWidget() # List of Videos self.vidList = [ os.path.abspath(os.path.join("videos/", f)) for f in os.listdir("videos/") ] random.shuffle(self.vidList) # Labels for inputs self.question = QLabel() self.status = QLabel() status_font = QFont("Helvetica", 12, QFont.Bold) self.status.setFont(status_font) self.answer_group = QButtonGroup() self.a1 = QRadioButton("a.") self.a2 = QRadioButton("b.") self.a3 = QRadioButton("c.") self.a4 = QRadioButton("d.") self.answer_group.addButton(self.a1) self.answer_group.addButton(self.a2) self.answer_group.addButton(self.a3) self.answer_group.addButton(self.a4) self.submit = QPushButton('Submit') width = self.submit.fontMetrics().boundingRect('Submit').width() + 12 self.submit.setMaximumWidth(width) # Frame for email and password forms frame1 = QFrame(self.central_widget) frame1.setFrameShape(QFrame.StyledPanel) frame1.setFrameShadow(QFrame.Raised) questionLayout = QVBoxLayout() frame1Layout = QVBoxLayout() choiceLayout = QVBoxLayout() submitLayout = QVBoxLayout() statusLayout = QVBoxLayout() questionLayout.addWidget(self.question) choiceLayout.addWidget(self.a1) choiceLayout.addWidget(self.a2) choiceLayout.addWidget(self.a3) choiceLayout.addWidget(self.a4) submitLayout.addWidget(self.submit) statusLayout.addWidget(self.status) questionLayout.setAlignment(Qt.AlignCenter) choiceLayout.setAlignment(Qt.AlignCenter) submitLayout.setAlignment(Qt.AlignCenter) statusLayout.setAlignment(Qt.AlignCenter) frame1Layout.addLayout(questionLayout) frame1Layout.addLayout(choiceLayout) frame1Layout.addLayout(submitLayout) frame1Layout.addLayout(statusLayout) frame1Layout.setAlignment(Qt.AlignCenter) frame1.setLayout(frame1Layout) frame1Layout.addStretch() # Frame for email and nt3 data paths frame2 = QFrame(self.central_widget) frame2.setFrameShape(QFrame.StyledPanel) frame2.setFrameShadow(QFrame.Raised) frame2Layout = QVBoxLayout() frame2Layout.addWidget(self.videoWidget) frame2.setLayout(frame2Layout) self.progressBar = QProgressBar() self.progressBar.setMaximum(len(self.vidList)) self.progressBar.setValue(0) self.submit.clicked.connect(self.check) learn_more.clicked.connect(self.learn_more_dialog) self.layout = QVBoxLayout(self.central_widget) self.layout.addLayout(top_layout) self.layout.addWidget(frame1) self.layout.addWidget(frame2) self.layout.addWidget(self.progressBar) self.setCentralWidget(self.central_widget) self.mediaPlayer.setVideoOutput(self.videoWidget) self.mediaPlayer.mediaStatusChanged.connect(self.loop) self.item = 1 self.score = 0 self.play(self.vidList[self.item - 1], self.item)
class FigureCanvas(QFrame): def __init__(self, parent=None): super(FigureCanvas, self).__init__(parent) self.setLineWidth(2) self.setMidLineWidth(1) self.setStyleSheet("background-color: white") self.img = [] self.qpix_buff = [] def load_mpl_figure(self, mplfig, view_dpi): self.qpix_buff = [] # ---------------------------------------------------- figure size ---- bbox = mplfig.get_window_extent() self.fwidth = bbox.width self.fheight = bbox.height # ------------------------------------------ save figure to buffer ---- # http://stackoverflow.com/questions/8598673/ # how-to-save-a-pylab-figure-into-in-memory-file-which-can-be-read # -into-pil-image/8598881#8598881 # http://stackoverflow.com/questions/1300908/ # load-blob-image-data-into-qpixmap # Scale dpi of figure to view_dpi orig_fig_dpi = mplfig.get_dpi() mplfig.dpi = view_dpi # Propagate changes to renderer : mplfig.canvas.draw() renderer = mplfig.canvas.get_renderer() orig_ren_dpi = renderer.dpi renderer.dpi = view_dpi # Generate img buffer : imgbuf = mplfig.canvas.buffer_rgba() imgwidth = int(renderer.width) imgheight = int(renderer.height) # Restore fig and renderer dpi renderer.dpi = orig_ren_dpi mplfig.dpi = orig_fig_dpi # Convert buffer to QPixmap : self.img = QImage(imgbuf, imgwidth, imgheight, QImage.Format_ARGB32) self.img = QImage.rgbSwapped(self.img) self.img = QPixmap(self.img) def paintEvent(self, event): """Qt method override to paint a custom image on the Widget.""" super(FigureCanvas, self).paintEvent(event) qp = QPainter() qp.begin(self) # Prepare paint rect : fw = self.frameWidth() rect = QRect(0 + fw, 0 + fw, self.size().width() - 2 * fw, self.size().height() - 2 * fw) # Check/update image buffer : qpix2print = None for qpix in self.qpix_buff: if qpix.size().width() == rect.width(): qpix2print = qpix break if qpix2print is None: qpix2print = self.img.scaledToWidth( rect.width(), mode=Qt.SmoothTransformation) self.qpix_buff.append(qpix2print) # Draw pixmap : # qp.setRenderHint(QPainter.Antialiasing, True) qp.drawPixmap(rect, qpix2print) qp.end()
class WindowSR(QMainWindow): """Main window of SoundRain""" bad_id = pyqtSignal() def __init__(self): super().__init__() self.initWin() self.init_client_id() def initWin(self): """Create main parts of the window""" # Main Window self.setFixedSize(900, 500) self.center() self.setWindowTitle("SoundRain") self.setWindowIcon(QIcon('soundrainlogo.jpg')) # Central Widget self.central_widget = QWidget() self.setCentralWidget(self.central_widget) # QVBox stocking every row self.vertical_grid = QVBoxLayout() # First row: URL request row_url = QHBoxLayout() label_url = QLabel("URL:", self) self.text_url = QLineEdit(self) self.text_url.textChanged.connect(self.block_dl) self.but_url = QPushButton("Search", self) self.but_url.clicked.connect(self.check_url) row_url.addWidget(label_url) row_url.addWidget(self.text_url) row_url.addWidget(self.but_url) # Row of separation 1 row_sep1 = QHBoxLayout() line_sep = QFrame() line_sep.setFrameShape(QFrame.HLine) row_sep1.addWidget(line_sep) # Second row (splitted screen between cover image and music info): row_split = QHBoxLayout() # Cover image column_image = QVBoxLayout() self.label_image = QLabel(self) self.label_image.setMaximumHeight(280) self.label_image.setMinimumHeight(280) self.label_image.setMaximumWidth(280) self.label_image.setMinimumHeight(280) self.cover = QPixmap(280, 280) self.cover.load("unknownperson.jpg") self.label_image.setPixmap(self.cover) column_image.addWidget(self.label_image) # music info column_info = QVBoxLayout() label_name = QLabel("Name", self) self.name = QLineEdit(self) label_artist = QLabel("Artist", self) self.artist = QLineEdit(self) label_album = QLabel("Album", self) self.album = QLineEdit(self) label_genre = QLabel("Genre", self) self.genre = QLineEdit(self) # -- column_info.addWidget(label_name) column_info.addWidget(self.name) column_info.addWidget(label_artist) column_info.addWidget(self.artist) column_info.addWidget(label_album) column_info.addWidget(self.album) column_info.addWidget(label_genre) column_info.addWidget(self.genre) # -- row_split.addLayout(column_image) row_split.addLayout(column_info) # Row of separation 2 row_sep2 = QHBoxLayout() line_sep2 = QFrame() line_sep2.setFrameShape(QFrame.HLine) row_sep2.addWidget(line_sep2) # Add the file location selection row row_file = QHBoxLayout() self.but_file = QPushButton("Save location", self) self.but_file.clicked.connect(self.open_f) self.text_file = QLineEdit(self.default_path(), self) row_file.addWidget(self.but_file) row_file.addWidget(self.text_file) # Row of separation 3 row_sep3 = QHBoxLayout() line_sep3 = QFrame() line_sep3.setFrameShape(QFrame.HLine) row_sep3.addWidget(line_sep3) # Download button row row_dl = QHBoxLayout() self.bar_dl = QProgressBar(self) self.bar_dl.setFixedSize(600, 30) self.bar_dl.setMaximum(100) self.bar_dl.setMinimum(0) self.bar_dl.hide() self.label_dl = QLabel(self) self.label_dl.hide() self.but_dl = QPushButton("Download", self) self.but_dl.clicked.connect(self.manage_download) self.but_dl.setDisabled(True) row_dl.addWidget(self.bar_dl) row_dl.addWidget(self.label_dl) row_dl.addStretch(1) row_dl.addWidget(self.but_dl) # Add every row to the vertical grid self.vertical_grid.addLayout(row_url) self.vertical_grid.addLayout(row_sep1) self.vertical_grid.addLayout(row_split) self.vertical_grid.addLayout(row_sep2) self.vertical_grid.addLayout(row_file) self.vertical_grid.addLayout(row_sep3) self.vertical_grid.addLayout(row_dl) # Set layout of the vertical grid to the central widget self.central_widget.setLayout(self.vertical_grid) self.show() def init_client_id(self): """Ask for client id if it as never been entered, else load it from register with QSettings""" self.client_id = None self.setting = QSettings(QSettings.UserScope, "BoBibelo", "SoundRain", self) if not self.setting.value("SR_bool"): # Setting never set self.client_id_box() self.setting.setValue("SR_bool", True) self.setting.setValue("SR_id", self.client_id) else: self.client_id = self.setting.value("SR_id") self.client = soundcloud.Client(client_id=self.client_id) def client_id_box(self): """Generate the client id box""" self.client_id_bo = QDialog(self) self.client_id_bo.setFixedSize(400, 200) self.client_id_bo.setModal(True) client_id_grid = QVBoxLayout() label_request = QLabel("Enter your Soundcloud Client ID:", self.client_id_bo) self.input_id = QLineEdit(self.client_id_bo) label_help = QLabel("<a href=\"http://bobibelo.github.io/soundrain/help.html\">Need help ?</a>", self.client_id_bo) label_help.setTextFormat(Qt.RichText); label_help.setTextInteractionFlags(Qt.TextBrowserInteraction); label_help.setOpenExternalLinks(True); self.got_id = False button_cancel = QPushButton("Cancel", self.client_id_bo) button_cancel.clicked.connect(self.reject_id) button_accept = QPushButton("Ok", self.client_id_bo) button_accept.clicked.connect(self.get_id) button_grid = QHBoxLayout() button_grid.addStretch(1) button_grid.addWidget(button_cancel) button_grid.addWidget(button_accept) client_id_grid.addWidget(label_request) client_id_grid.addWidget(self.input_id) client_id_grid.addWidget(label_help) client_id_grid.addLayout(button_grid) self.client_id_bo.setLayout(client_id_grid) self.client_id_bo.rejected.connect(self.reject_id) self.client_id_bo.exec_() def get_id(self): """Get client id from the qdialog""" self.client_id = self.input_id.text().strip() if len(self.client_id) != 0: self.got_id = True self.client_id_bo.close() def reject_id(self): """Quit app after user not giving client id""" if not self.got_id: self.close() sys.exit(1) def open_f(self): """Choose the directory where to save music""" self.dirname = QFileDialog.getExistingDirectory() if self.dirname and len(self.dirname) > 0: self.text_file.setText(self.dirname) def center(self): """Places window in the screen's center""" center_geo = self.frameGeometry() center_pos = QDesktopWidget().availableGeometry().center() center_geo.moveCenter(center_pos) self.move(center_geo.topLeft()) def check_url(self): """Test if the music url is correct and if so fill info""" url_pattern = "^https?://(www\.)?soundcloud\.com" if not re.match(url_pattern, self.text_url.text()): QMessageBox.about(self, "Invalid URL", "The requested URL is invalid: %s" % self.text_url.text()) else: self.but_dl.setDisabled(False) if "/sets/" in self.text_url.text(): # Is playlist self.artist.setText("Not available for playlist.") self.name.setText("Not available for playlist.") self.disable_input(True) elif len(self.text_url.text().split('/')) == 4: # Likes self.artist.setText("Not available for likes.") self.name.setText("Not available for likes.") self.disable_input(False) else: self.enable_input() self.get_music_info() def disable_input(self, bo): """Disable artist, and name in case of playlist""" if bo: self.is_playlist = True self.is_likes = False else: self.is_playlist = False self.is_likes = True self.artist.setDisabled(True) self.name.setDisabled(True) def enable_input(self): """Enable artist, and name after a playlist""" self.is_likes = False self.is_playlist = False self.artist.setDisabled(False) self.name.setDisabled(False) def get_track(self): """Returns track""" http_page = httplib2.Http() resp = http_page.request(self.url_str, "HEAD") if int(resp[0]["status"]) >= 400: QMessageBox.about(self, "Error URL", "URL doesn't exist.") return False try: self.track = self.client.get("/resolve", url=self.url_str) except: self.setting.setValue("SR_bool", False) self.init_client_id() self.get_track() return True def get_music_info(self): """Get music info, which will be stocked in self.track, and fill info""" self.url_str = self.text_url.text() if not self.get_track(): return if not self.is_playlist and not self.is_likes: self.artist.setText(self.track.user['username']) self.name.setText(self.track.title) url = self.modifiy_image_size() if url: self.image = requests.get(url).content self.cover.loadFromData(self.image) self.cover = self.cover.scaledToWidth(280) self.label_image.setPixmap(self.cover) else: # Get the last part of URL ( == to playlist name) self.album.setText(self.text_url.text().rsplit('/', 1)[-1]) if self.album.text() != "": self.text_file.setText("%s/%s" % (self.text_file.text(), self.album.text())) if not self.is_likes: self.genre.setText(self.track.genre) else: self.album.setText(self.track.username + "'s favorites") def modifiy_image_size(self): """Change artwork_url so the image can (potentially) look better""" artwork_url = self.track.artwork_url if not artwork_url: return None if "large" in artwork_url: return artwork_url.replace("large", "t500x500") else: return artwork_url def manage_download(self): """Manage download in case of playlist""" if self.is_playlist: playlist = self.client.get('/playlists/%s' % (self.track.id)) count = 1 self.label_dl.show() for song_url in playlist.tracks: self.label_dl.setText("%d / %d" % (count, len(playlist.tracks))) count += 1 self.url_str = song_url["permalink_url"] self.get_track() self.image = requests.get(self.modifiy_image_size()).content self.download() if len(playlist.tracks) == 0: self.fail_box() else: self.success_box() # Success box for playlist self.label_dl.hide() self.enable_input() elif self.is_likes: likes = self.client.get('/users/%s/favorites/' % (self.track.id), linked_partitioning=1, limit=200) set_likes = set() while True: try: link = likes.next_href except: break for like in likes.collection: set_likes.add(like) likes = self.client.get(link, linked_partitioning=1, limit=200) for like in likes.collection: set_likes.add(like) count = 1 self.label_dl.show() for like in set_likes: self.url_str = like.user['permalink_url'] self.track = like self.label_dl.setText("%d / %d" % (count, len(set_likes))) count += 1 self.image = requests.get(self.modifiy_image_size()).content self.download() sys.exit(0) else: self.success_box() # Success box for playlist self.label_dl.hide() self.enable_input() else: if self.download(): self.success_box() # Succes box for single song self.reset() def download(self): """Try to download a single song""" self.setDisabled(True) self.bar_dl.setDisabled(False) self.bar_dl.show() try: self.fi_mp3, headers = urllib.request.urlretrieve(self.create_url(), self.create_filename(), reporthook=self.reporthook) except: self.fail_box() self.setDisabled(False) self.bar_dl.hide() return False self.add_tags() self.setDisabled(False) self.bar_dl.hide() return True def fail_box(self): """Fail box for playlist and single song""" if self.is_playlist: QMessageBox.about(self, "Error Download", "Playlist '%s' failed to download." % self.text_url.text().rsplit('/', 1)[-1]) else: QMessageBox.about(self, "Error Download", "Download failed for song: %s" % self.track.title) def reset(self): """Reset all input & image after end of download""" self.text_url.setText("") self.artist.setText("") self.name.setText("") self.album.setText("") self.genre.setText("") self.image = None self.cover.load("unknownperson.jpg") self.label_image.setPixmap(self.cover) self.but_dl.setDisabled(True) self.text_file.setText(self.default_path()) def block_dl(self): """Disable download button if user change URL (forces him to re-'search')""" self.but_dl.setDisabled(True) def add_tags(self): """Add artists name, music name, album, genre, and cover""" # Set artist name, music name, album, and genre audio_file = EasyMP3(self.fi_mp3) audio_file.tags = None if self.is_playlist: audio_file["artist"] = self.track.user["username"] audio_file["title"] = self.track.title if self.is_likes: audio_file["artist"] = self.track.user["username"] audio_file["title"] = self.track.title else: audio_file["artist"] = self.artist.text() audio_file["title"] = self.name.text() audio_file["genre"] = self.genre.text() audio_file["album"] = self.album.text() audio_file.save() # Determine the mime artwork_url = self.modifiy_image_size() if not artwork_url: return mime = "image/jpeg" if ".png" in artwork_url: mime = "image/png" # Set cover audio_file = MP3(self.fi_mp3, ID3=ID3) audio_file.tags.add( APIC( encoding=3, mime=mime, type=3, desc="Cover", data=self.image ) ) audio_file.save() def success_box(self): """Display a sucess box""" if self.is_playlist: QMessageBox.about(self, "Success", "%s playlist has just been downloaded right into %s" % (self.text_url.text().rsplit('/', 1)[-1], self.text_file.text())) else: QMessageBox.about(self, "Success", "%s has just been downloaded right into %s" % (self.name.text(), self.text_file.text())) def create_url(self): url_str = "http://api.soundcloud.com/tracks/%s/stream?client_id=%s" % (self.track.id, self.client_id) return url_str def create_filename(self): path = self.text_file.text() if self.is_playlist or self.is_likes: name = self.track.title + ".mp3" else: name = self.name.text() + ".mp3" if not os.path.exists(path): os.makedirs(path) fi_str = os.path.join(path, name) return fi_str def default_path(self): """Set the default path""" list_user = os.listdir("/Users") for user in list_user: if user != "Shared" and user != ".localized": break else: user = "******" path = "/Users/" + user + "/Music" return path def reporthook(self, blocks_read, block_size, total_size): """Tracks the progress of music download""" if blocks_read == 0: self.bar_dl.setValue(0) else: amount_read = blocks_read * block_size percent = int((amount_read / total_size) * 100) # Percent of achieved download self.bar_dl.setValue(percent) QApplication.processEvents() return