class StatusBarView(QStatusBar): """ The model of Navigation component """ def __init__(self, parent): super().__init__(parent) self.status_label = QLabel("", parent) self.status_label.setTextFormat(Qt.RichText) self.label_time = QLabel("", parent) self.combo_referential = QComboBox(parent) self.movie_loader = QMovie(":/icons/loader") self.label_loading = QLabel(parent) self.label_loading.setMovie(self.movie_loader) self.label_loading.setMaximumHeight(self.height()) self.movie_loader.setScaledSize(QSize(16, 16)) self.movie_loader.start() self.movie_loader.setPaused(True) self.addPermanentWidget(self.label_loading) self.addPermanentWidget(self.status_label, 2) self.addPermanentWidget(self.label_time) self.addPermanentWidget(self.combo_referential) def start_loading(self): self.movie_loader.setPaused(False) def stop_loading(self): self.movie_loader.setPaused(True)
def animationLabel(self, index, animationFile, speed=100): """ Public slot to set an animated icon. @param index tab index (integer) @param animationFile name of the file containing the animation (string) @param speed animation speed of the icon in percent of the original icon's speed (integer) @return reference to the created label (QLabel) """ if index == -1: return None if hasattr(self.__tabBar, 'setTabButton'): side = self.__freeSide() animation = QLabel(self) if animationFile and not animation.movie(): movie = QMovie(animationFile, QByteArray(), animation) movie.setSpeed(speed) animation.setMovie(movie) movie.start() self.__tabBar.setTabButton(index, side, None) self.__tabBar.setTabButton(index, side, animation) return animation else: return None
class GifWidget(QLabel): def __init__(self, parent = None, path = None): super(GifWidget, self).__init__(parent) self.setPath(path) def __del__(self): print("GifWidget __del__") if hasattr(self, "_movie"): self._movie.stop() del self._movie def setPath(self, path): if hasattr(self, "_movie"): self._movie.stop() del self._movie if not path: return self._movie = QMovie(path) self.setMovie(self._movie) self._movie.start() def start(self): if hasattr(self, "_movie"): self._movie.start() def stop(self): if hasattr(self, "_movie"): self._movie.stop()
class MoviePlayer(QWidget): def __init__(self): super(MoviePlayer, self).__init__() self.setAttribute(Qt.WA_TranslucentBackground) self.setWindowFlags(Qt.FramelessWindowHint) self.movie = QMovie(self) self.movieLabel = QLabel("No movie loaded") self.movieLabel.setAlignment(Qt.AlignAbsolute) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.mainLayout = QVBoxLayout() self.mainLayout.addWidget(self.movieLabel) self.setLayout(self.mainLayout) #self.resize(400, 500) self.movieLabel.setMovie(self.movie) self.movie.setFileName('icon/gears.gif') pos = kp.pos() x = pos.x() - ((self.width()/2) - (kp.width()/2)) +220 y = pos.y() - ((self.height()/2) - (kp.height()/2)) +160 self.setGeometry(x,y, 400, 500) self.movie.start()
def initoptionspanel(self): label = QLabel('Filter') filtertype = QComboBox() filtertype.addItem('None') filtertype.addItem('Lowpass') filtertype.addItem('Highpass') filtertype.addItem('Bandreject') filtertype.addItem('Bandpass') filtertype.currentIndexChanged.connect(self.filtertypelistener) self.filterfunction = QComboBox() self.filterfunction.addItem('Ideal') self.filterfunction.addItem('Butterworth') self.filterfunction.addItem('Gaussian') self.filterfunction.currentIndexChanged.connect(self.filterfunctionlistener) self.filterfunction.setEnabled(False) self.filtercutoff = QDoubleSpinBox() self.filtercutoff.setValue(0.0) self.filtercutoff.setRange(0.0, 10000.0) self.filtercutoff.valueChanged.connect(self.filtercutofflistener) self.filtercutoff.setEnabled(False) self.filterbandwidth = QDoubleSpinBox() self.filterbandwidth.setValue(1.0) self.filterbandwidth.setRange(0.0, 10000.0) self.filterbandwidth.valueChanged.connect(self.filterbandwidthlistener) self.filterbandwidth.setEnabled(False) self.filterorder = QDoubleSpinBox() self.filterorder.setValue(1.0) self.filterorder.setRange(0.0, 10000.0) self.filterorder.valueChanged.connect(self.filterorderlistener) self.filterorder.setEnabled(False) loader = QMovie('loader.gif') loader.start() self.loadercontainer = QLabel() self.loadercontainer.setMovie(loader) self.loadercontainer.setVisible(False) formlayout = QFormLayout() formlayout.addRow('Type', filtertype) formlayout.addRow('Function', self.filterfunction) formlayout.addRow('Cut off', self.filtercutoff) formlayout.addRow('Bandwidth', self.filterbandwidth) formlayout.addRow('Order', self.filterorder) formlayout.addRow('', self.loadercontainer) filterbox = QGroupBox('Filter') filterbox.setLayout(formlayout) options = QDockWidget('Options') options.setFeatures(QDockWidget.DockWidgetFloatable) options.setFeatures(QDockWidget.DockWidgetMovable) options.setWidget(filterbox) self.addDockWidget(Qt.RightDockWidgetArea, options)
class LoadingGifWin( QWidget): def __init__(self,parent=None): super(LoadingGifWin, self).__init__(parent) self.label = QLabel('', self) self.setFixedSize(128,128) self.setWindowFlags( Qt.Dialog| Qt.CustomizeWindowHint) self.movie = QMovie("./images/loading.gif") self.label.setMovie(self.movie) self.movie.start()
def open(self): self.file = QFileDialog.getOpenFileName(self, "Open File", self.pwd)[0] if self.file == "": return self.information = info.Information(self, self.file) movie = QMovie(self.file, QByteArray(), self) movie.setCacheMode(QMovie.CacheAll) movie.setSpeed(100) self.label.setMovie(movie) movie.start()
def __makeAnimatedLabel(self, fileName, label): """ Private slot to create an animated label. @param fileName name of the file containing the animation (string) @param label reference to the label to be animated (QLabel) """ movie = QMovie(fileName, QByteArray(), label) movie.setSpeed(100) label.setMovie(movie) movie.start()
class WaitDialog(QWidget): def __init__(self, parent=None, *args, **kwargs): super(WaitDialog, self).__init__(parent) self.label = QLabel(self) self.label.setAlignment(Qt.AlignCenter) self.setFixedSize(551, 401) self.setWindowOpacity(0.5) # set transparent self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint | Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) # background transparent self.setContentsMargins(0, 0, 0, 0) config = Config() self.movie = QMovie(os.path.join(config.images, 'wait.gif')) self.label.setMovie(self.movie) self.movie.start()
class LoadingItem(QLabel): def __init__(self): super(LoadingItem, self).__init__() self.movie = QMovie(resources.IMAGES['loading']) self.setMovie(self.movie) self.movie.setScaledSize(QSize(16, 16)) self.movie.start() def add_item_to_tree(self, folder, tree, item_type=None, parent=None): if item_type is None: item = QTreeWidgetItem() item.setText(0, (_translate("LoadingItem", " LOADING: '%s'") % folder)) else: item = item_type(parent, ( _translate("LoadingItem", " LOADING: '%s'") % folder), folder) tree.addTopLevelItem(item) tree.setItemWidget(item, 0, self) return item
def __init__(self, parent, text=""): QDialog.__init__(self, parent) # Create waiting image waitingImage = QMovie(qtUtils.getAbsoluteImagePath('waiting.gif')) waitingImage.start() waitingImageLabel = QLabel(self) waitingImageLabel.setMovie(waitingImage) waitingLabel = QLabel(text, self) hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(waitingImageLabel) hbox.addSpacing(10) hbox.addWidget(waitingLabel) hbox.addStretch(1) self.setLayout(hbox)
def setupWidget1(self): #setup the tree movie = QMovie() movie.setFileName("res/tree.gif") self.ui.lb_tree.setMovie(movie) self.ui.lb_tree_big.setMovie(movie) movie.start() #setup the statistics self.ui.gridLayout.setHorizontalSpacing(60) self.ui.gridLayout.setVerticalSpacing(10) self.ui.gridLayout.setGeometry(QRect(0, 51, 291, 224)) self.ui.gridLayout.setAlignment(QtCore.Qt.AlignCenter) self.statLabels = [] for i in range(7): self.statLabels.append([]) for j in range(4): self.statLabels[i].append(QLabel()) self.statLabels[i][j].setScaledContents(True) self.statLabels[i][j].setAutoFillBackground(False) self.statLabels[i][j].setAlignment(QtCore.Qt.AlignCenter) self.ui.gridLayout.addWidget(self.statLabels[i][j], i, j, 1, 1)
class IconManagement(object): def __init__(self, tray, interval = 100): self.tray = tray self.movie = QMovie(":/images/tray_animations/tray.gif") self.movie.setSpeed(interval) self.movie.frameChanged.connect(self.next_icon) self.icons = Enum( ok = QIcon(":/images/demerio.png"), problem = QIcon(":/images/demerio-problem.png"), conductor_problem = QIcon(":/images/demerio-conductor-problem.png") ) self.icon = self.icons.ok self.update_icon() def internet_is_ok(self, internet_is_ok): self.icon = self.icons.ok if internet_is_ok else self.icons.problem self.update_icon() @pyqtSlot(int) def next_icon(self, i): self.tray.setIcon(QIcon(self.movie.currentPixmap())) def start(self): self.movie.start() def stop(self): self.update_icon() self.movie.stop() def update_icon(self): self.tray.setIcon(self.icon) def conductor_problem(self): if self.movie.state() == QMovie.Running: self.movie.stop() self.icon = self.icons.conductor_problem self.update_icon()
class QConnectingWidget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) # Create connecting image self.connectingGif = QMovie(qtUtils.getAbsoluteImagePath('waiting.gif')) self.connectingGif.start() self.connetingImageLabel = QLabel(self) self.connetingImageLabel.setMovie(self.connectingGif) self.connectingLabel = QLabel(self) hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(self.connetingImageLabel, alignment=Qt.AlignCenter) hbox.addSpacing(10) hbox.addWidget(self.connectingLabel, alignment=Qt.AlignCenter) hbox.addStretch(1) self.setLayout(hbox) def setConnectingToNick(self, nick): self.connectingLabel.setText("Connecting to " + nick + "...")
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setGeometry(50, 50, 600, 750) self.setFixedSize(500, 500) self.startUIWindow() self.movie = QMovie("mail.gif") self.movie.frameChanged.connect(self.repaint) self.movie.start() def startUIWindow(self): self.Window = UIWindow(self) self.setWindowTitle("Email Dialog") self.show() def paintEvent(self, event): currentFrame = self.movie.currentPixmap() frameRect = currentFrame.rect() frameRect.moveCenter(self.rect().center()) if frameRect.intersects(event.rect()): painter = QPainter(self) painter.drawPixmap(frameRect.left(), frameRect.top(), currentFrame)
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(973, 636) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.remove_from_pending = QtWidgets.QPushButton(self.centralwidget) self.remove_from_pending.setGeometry(QtCore.QRect(20, 130, 241, 81)) self.remove_from_pending.setObjectName("remove_from_pending") self.add_to_pending = QtWidgets.QPushButton(self.centralwidget) self.add_to_pending.setGeometry(QtCore.QRect(20, 40, 241, 81)) self.add_to_pending.setStyleSheet("") self.add_to_pending.setObjectName("add_to_pending") self.incomplete_list = QtWidgets.QListWidget(self.centralwidget) self.incomplete_list.setGeometry(QtCore.QRect(20, 290, 251, 191)) self.incomplete_list.setObjectName("incomplete_list") self.pending_list = QtWidgets.QListWidget(self.centralwidget) self.pending_list.setGeometry(QtCore.QRect(360, 40, 251, 191)) self.pending_list.setObjectName("pending_list") self.completed_list = QtWidgets.QListWidget(self.centralwidget) self.completed_list.setGeometry(QtCore.QRect(690, 280, 251, 221)) self.completed_list.setObjectName("completed_list") self.incomplete = QtWidgets.QLabel(self.centralwidget) self.incomplete.setGeometry(QtCore.QRect(60, 250, 161, 31)) font = QtGui.QFont() font.setFamily("Comic Sans MS") font.setPointSize(20) self.incomplete.setFont(font) self.incomplete.setObjectName("incomplete") self.pending = QtWidgets.QLabel(self.centralwidget) self.pending.setGeometry(QtCore.QRect(450, 0, 101, 41)) font = QtGui.QFont() font.setFamily("Comic Sans MS") font.setPointSize(20) self.pending.setFont(font) self.pending.setObjectName("pending") self.completed = QtWidgets.QLabel(self.centralwidget) self.completed.setGeometry(QtCore.QRect(730, 240, 161, 31)) font = QtGui.QFont() font.setFamily("Comic Sans MS") font.setPointSize(20) self.completed.setFont(font) self.completed.setObjectName("completed") self.jugglingGif = QtWidgets.QLabel(self.centralwidget) self.jugglingGif.setGeometry(QtCore.QRect(290, 260, 381, 351)) self.jugglingGif.setFrameShape(QtWidgets.QFrame.Box) self.jugglingGif.setText("") self.jugglingGif.setObjectName("jugglingGif") self.movie = QMovie('JugglingGIF.gif') self.jugglingGif.setMovie(self.movie) self.movie.start() self.add_to_completed = QtWidgets.QPushButton(self.centralwidget) self.add_to_completed.setGeometry(QtCore.QRect(700, 40, 241, 81)) font = QtGui.QFont() font.setPointSize(8) self.add_to_completed.setFont(font) self.add_to_completed.setObjectName("add_to_completed") self.remove_from_completed = QtWidgets.QPushButton(self.centralwidget) self.remove_from_completed.setGeometry(QtCore.QRect(700, 140, 241, 81)) self.remove_from_completed.setObjectName("remove_from_completed") self.incomplete_search_bar = QtWidgets.QTextBrowser(self.centralwidget) self.incomplete_search_bar.setGeometry(QtCore.QRect(20, 470, 251, 16)) self.incomplete_search_bar.setObjectName("incomplete_search_bar") self.pending_search_bar = QtWidgets.QTextBrowser(self.centralwidget) self.pending_search_bar.setGeometry(QtCore.QRect(360, 220, 251, 16)) self.pending_search_bar.setObjectName("pending_search_bar") self.completed_search_bar = QtWidgets.QTextBrowser(self.centralwidget) self.completed_search_bar.setGeometry(QtCore.QRect(690, 490, 251, 16)) self.completed_search_bar.setObjectName("completed_search_bar") self.browser = QtWidgets.QPushButton(self.centralwidget) self.browser.setGeometry(QtCore.QRect(20, 500, 241, 81)) self.browser.setObjectName("browser") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(700, 510, 101, 16)) self.label.setObjectName("label") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 973, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.add_to_pending.clicked.connect(self.add_pending) def loadIncomplete(self): cursor.execute('''SELECT * FROM trickslist WHERE trick_status = "INCOMPLETE"''') for i in cursor: self.incomplete_list.addItem(i[0]) def loadComplete(self): cursor.execute('''SELECT * FROM trickslist WHERE trick_status = "COMPLETE"''') for i in cursor: self.completed_list.addItem(i[0]) def loadPending(self): cursor.execute('''SELECT * FROM trickslist WHERE trick_status = "PENDING"''') for i in cursor: self.pending_list.addItem(i[0]) def add_pending(self): trick = self.incomplete_list.currentItem().text() cursor.execute('''UPDATE trickslist SET trick_status = "PENDING" WHERE tricks = "%s"''' % trick) print(trick) database.commit() self.loadLists() def loadLists(self): self.pending_list.clear() self.incomplete_list.clear() self.completed_list.clear() self.loadComplete() self.loadIncomplete() self.loadPending() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.remove_from_pending.setText( _translate("MainWindow", "Remove from Pending")) self.add_to_pending.setText(_translate("MainWindow", "Add to Pending")) self.incomplete.setText(_translate("MainWindow", "Incomplete")) self.pending.setText(_translate("MainWindow", "Pending")) self.completed.setText(_translate("MainWindow", "Completed")) self.add_to_completed.setText( _translate("MainWindow", "Add to Completed")) self.remove_from_completed.setText( _translate("MainWindow", "Remove from Completed")) self.browser.setText(_translate("MainWindow", "View Trick in Browser")) self.label.setText(_translate("MainWindow", "Gui by Jaden Leake"))
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(920, 820) MainWindow.setMinimumSize(QSize(920, 820)) MainWindow.setMaximumSize(QSize(920, 820)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget) self.stackedWidget.setGeometry(QtCore.QRect(0, 0, 920, 820)) self.stackedWidget.setObjectName("stackedWidget") # #page0 # self.page0 = QtWidgets.QWidget() # self.page0.setObjectName("page0") # self.loading = QtWidgets.QWidget(self.page0) # self.loading.setGeometry(QtCore.QRect(0, 0, 920, 820)) # icon = QtGui.QIcon() # icon.addPixmap(QtGui.QPixmap("D:/Umbrella/dahyoung/umbrella2/logo/umbrella11.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # self.loading.setIcon(icon) # self.loading.setStyleSheet("background-color : #ffffff") # self.loading.setObjectName("loading") # self.stackedWidget.addWidget(self.page0) #page1 #Intro_frame self.page = QtWidgets.QWidget() self.page.setObjectName("page") self.intro_frame = QtWidgets.QFrame(self.page) self.intro_frame.setGeometry(QtCore.QRect(0, 0, 920, 820)) self.intro_frame.setStyleSheet("background-color : #000000") self.intro_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.intro_frame.setFrameShadow(QtWidgets.QFrame.Raised) self.intro_frame.setObjectName("intro_frame") self.intro_button = QtWidgets.QPushButton(self.intro_frame) self.intro_button.setGeometry(QtCore.QRect(0, 0, 920, 820)) self.intro_button.setObjectName("intro_button") # self.widget_main = QtWidgets.QWidget(self.intro_frame) # self.widget_main.setGeometry(QtCore.QRect(20, 480, 420, 250)) # self.widget_main.setObjectName("widget_main") # self.widget_1 = QtWidgets.QWidget(self.widget_main) # self.widget_1.setGeometry(QtCore.QRect(0, 0, 210, 125)) # self.widget_1.setStyleSheet("background-color : #ff0000") # self.widget_1.setObjectName("widget_1") # self.widget_2 = QtWidgets.QWidget(self.widget_main) # self.widget_2.setGeometry(QtCore.QRect(210, 0, 210, 125)) # self.widget_2.setStyleSheet("background-color : #0000ff") # self.widget_2.setObjectName("widget_2") # self.widget_3 = QtWidgets.QWidget(self.widget_main) # self.widget_3.setGeometry(QtCore.QRect(0, 125, 210, 125)) # self.widget_3.setStyleSheet("background-color : #ff8c00") # self.widget_3.setObjectName("widget_3") # self.widget_4 = QtWidgets.QWidget(self.widget_main) # self.widget_4.setGeometry(QtCore.QRect(210, 125, 210, 125)) # self.widget_4.setStyleSheet("background-color : #808080") # self.widget_4.setObjectName("widget_4") self.widget_main = QtWidgets.QWidget(self.intro_frame) self.widget_main.setGeometry(QtCore.QRect(20, 480, 420, 250)) self.widget_main.setObjectName("widget_main") self.widget_1 = QtWidgets.QPushButton(self.widget_main) self.widget_1.setGeometry(QtCore.QRect(0, 0, 210, 125)) self.widget_1.setStyleSheet("background-color : #ff0000") self.widget_1.setObjectName("widget_1") self.widget_2 = QtWidgets.QPushButton(self.widget_main) self.widget_2.setGeometry(QtCore.QRect(210, 0, 210, 125)) self.widget_2.setStyleSheet("background-color : #0000ff") self.widget_2.setObjectName("widget_2") self.widget_3 = QtWidgets.QPushButton(self.widget_main) self.widget_3.setGeometry(QtCore.QRect(0, 125, 210, 125)) self.widget_3.setStyleSheet("background-color : #ff8c00") self.widget_3.setObjectName("widget_3") self.widget_4 = QtWidgets.QPushButton(self.widget_main) self.widget_4.setGeometry(QtCore.QRect(210, 125, 210, 125)) self.widget_4.setStyleSheet("background-color : #808080") self.widget_4.setObjectName("widget_4") # self.listView_3 = QtWidgets.QListView(self.intro_frame) # self.listView_3.setGeometry(QtCore.QRect(20, 480, 420, 251)) # self.listView_3.setStyleSheet("background-color : #ffffff") # self.listView_3.setObjectName("listView_3") self.pushButton_3 = QtWidgets.QPushButton(self.intro_frame) self.pushButton_3.setGeometry(QtCore.QRect(150, 100, 301, 300)) # self.pushButton_3.setGeometry(QtCore.QRect(170, 0, 601, 321)) # icon = QtGui.QIcon() # icon.addPixmap(QtGui.QPixmap("D:/Umbrella/dahyoung/umbrella2/logo/rolling_umb.gif"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.movie = QMovie("logo/rolling_umb.gif") self.movie.setScaledSize(QtCore.QSize(200, 200)) self.label_23 = QtWidgets.QLabel(self.pushButton_3) self.label_23.setGeometry(QtCore.QRect(20, 20, 200, 200)) self.label_23.setMovie(self.movie) self.label_23.setText("") self.label_23.setObjectName("label_23") self.movie.start() # self.pushButton_3.setIcon(icon) # self.pushButton_3.setIconSize(QtCore.QSize(600, 231)) self.pushButton_3.setObjectName("pushButton_3") self.pushButton_4 = QtWidgets.QPushButton(self.intro_frame) self.pushButton_4.setGeometry(QtCore.QRect(400, 57, 400, 200)) icon_text = QtGui.QIcon() icon_text.addPixmap(QtGui.QPixmap("logo/text1.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton_4.setIcon(icon_text) self.pushButton_4.setIconSize(QtCore.QSize(400, 200)) self.pushButton_4.setObjectName("pushButton_4") #마스크 보유 현황 self.pushButton_5 = QtWidgets.QPushButton(self.intro_frame) self.pushButton_5.setGeometry(QtCore.QRect(420, 200, 350, 200)) icon_text1 = QtGui.QIcon() icon_text1.addPixmap(QtGui.QPixmap("logo/mask2.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton_5.setIcon(icon_text1) self.pushButton_5.setIconSize(QtCore.QSize(400, 200)) self.pushButton_5.setObjectName("pushButton_5") self.widget_graph = QtWidgets.QWidget(self.intro_frame) self.widget_graph.setGeometry(QtCore.QRect(460, 480, 420, 250)) self.widget_graph.setStyleSheet("background-color : #ffffff") self.widget_graph.setObjectName("listView_5") self.stackedWidget.addWidget(self.intro_frame) #page2 self.page_2 = QtWidgets.QWidget() self.page_2.setObjectName("page_2") self.frame = QtWidgets.QFrame(self.page_2) self.frame.setGeometry(QtCore.QRect(0, 0, 921, 630)) self.frame.setStyleSheet("background-color : #ffffff") self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.webEngineView = QtWebEngineWidgets.QWebEngineView(self.frame) self.webEngineView.setGeometry(QtCore.QRect(-1, 0, 921, 601)) self.webEngineView.setUrl(QtCore.QUrl("about:blank")) self.webEngineView.setObjectName("webEngineView") #stack1로 돌아가는 버튼 self.pushButton__image = QtWidgets.QPushButton(self.frame) self.pushButton__image.setGeometry(QtCore.QRect(0, 0, 30, 30)) # icon = QtGui.QIcon() # icon.addPixmap(QtGui.QPixmap("logo/umbrella.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # self.pushButton__image.setIcon(icon) # self.pushButton__image.setIconSize(QtCore.QSize(30, 30)) # self.pushButton__image.setObjectName("pushButton__image") self.movie2 = QMovie("logo/rolling_umb.gif") self.movie2.setScaledSize(QtCore.QSize(30, 30)) self.label_24 = QtWidgets.QLabel(self.pushButton__image) self.label_24.setGeometry(QtCore.QRect(0, 0, 30, 30)) self.label_24.setMovie(self.movie2) self.label_24.setText("") self.label_24.setObjectName("label_24") self.movie2.start() self.lineEdit = QtWidgets.QLineEdit(self.frame) self.lineEdit.setGeometry(QtCore.QRect(0, 600, 281, 31)) self.lineEdit.setObjectName("lineEdit") self.pushButton = QtWidgets.QPushButton(self.frame) self.pushButton.setGeometry(QtCore.QRect(281, 601, 101, 31)) self.pushButton.setObjectName("pushButton") self.pushButton2 = QtWidgets.QPushButton(self.frame) self.pushButton2.setGeometry(QtCore.QRect(381, 601, 101, 31)) self.pushButton2.setObjectName("pushButton2") self.pushButton3 = QtWidgets.QPushButton(self.frame) self.pushButton3.setGeometry(QtCore.QRect(481, 601, 101, 31)) self.pushButton3.setObjectName("pushButton3") #1개 미만 self.radio1 = QtWidgets.QRadioButton(self.frame) self.radio1.setGeometry(QtCore.QRect(600, 600, 71, 31)) self.radio1.setObjectName("radio1") self.radio2 = QtWidgets.QRadioButton(self.frame) self.radio2.setGeometry(QtCore.QRect(670, 600, 71, 31)) self.radio2.setObjectName("radio2") self.radio3 = QtWidgets.QRadioButton(self.frame) self.radio3.setGeometry(QtCore.QRect(750, 600, 71, 31)) self.radio3.setObjectName("radio3") self.radio4 = QtWidgets.QRadioButton(self.frame) self.radio4.setGeometry(QtCore.QRect(830, 600, 81, 31)) self.radio4.setObjectName("radio4") self.listWidget = QtWidgets.QListWidget(self.page_2) self.listWidget.setGeometry(QtCore.QRect(0, 630, 921, 191)) self.listWidget.setObjectName("listWidget") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 920, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.stackedWidget.addWidget(self.page_2) # self.statusbar = QtWidgets.QStatusBar(MainWindow) # self.statusbar.setObjectName("statusbar") # MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.stackedWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.radio1.setChecked(True) #graph self.page_3 = QtWidgets.QWidget() self.page_3.setObjectName("page_3") self.frame2 = QtWidgets.QFrame(self.page_3) self.frame2.setGeometry(QtCore.QRect(0, 0, 920, 820)) self.frame2.setStyleSheet("background-color : #ffffff") self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame2.setFrameShadow(QtWidgets.QFrame.Raised) self.frame2.setObjectName("frame2") self.comboBox = QtWidgets.QComboBox(self.frame2) self.comboBox.setGeometry(QtCore.QRect(29, 0, 201, 30)) self.comboBox.setObjectName("comboBox") self.graph2 = QtWidgets.QWidget(self.frame2) self.graph2.setGeometry(QtCore.QRect(0, 30, 920, 790)) self.graph2.setObjectName("graph2") # self.webEngineView2 = QtWebEngineWidgets.QWebEngineView(self.frame2) # self.webEngineView2.setGeometry(QtCore.QRect(200, 120, 720, 700)) # self.webEngineView2.setUrl(QtCore.QUrl("about:blank")) # self.webEngineView2.setObjectName("webEngineView2") #stack1로 돌아가는 버튼 self.pushButton__image2 = QtWidgets.QPushButton(self.frame2) self.pushButton__image2.setGeometry(QtCore.QRect(0, 0, 30, 30)) self.pushButton__image2.setObjectName("pushButton__image") self.movie3 = QMovie("logo/rolling_umb.gif") self.movie3.setScaledSize(QtCore.QSize(30, 30)) self.label_25 = QtWidgets.QLabel(self.pushButton__image2) self.label_25.setGeometry(QtCore.QRect(0, 0, 30, 30)) self.label_25.setMovie(self.movie2) self.label_25.setText("") self.label_25.setObjectName("label_24") self.movie3.start() self.stackedWidget.addWidget(self.page_3) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "이동")) self.pushButton2.setText(_translate("MainWindow", "판매처 탐색")) self.pushButton3.setText(_translate("MainWindow", "내 위치")) self.radio1.setText(_translate("MainWindow", "전체")) self.radio2.setText(_translate("MainWindow", "1개 ↑")) self.radio3.setText(_translate("MainWindow", "30개 ↑")) self.radio4.setText(_translate("MainWindow", "100개 ↑"))
class NoteMain(QMainWindow): def __init__(self, parent=None): super(NoteMain, self).__init__(parent) self.setWindowTitle("CSDN 同步笔记(author:rechard)") #os.path.dirname(os.path.realpath(__file__) 获取到当前文件的路径 #self.setWindowIcon(QtGui.QIcon(os.path.join(os.path.dirname(os.path.realpath(__file__)), "icon.png" ))) self.setWindowIcon(QIcon("./images/icon.png")) self.blogCache = BlogCache() self.browser = BrowserWidget() self.browser.cookieAdd.connect(self.on_browser_cookieAdd) self.split = QSplitter() self.articleList = ArticleList() self.articleList.itemClicked.connect(self.articleItemClick) self.initCategory() self.split.addWidget(self.articleList) self.split.addWidget(self.browser) self.toolbar = MDToolBarWidget(self.browser) self.split.addWidget(self.toolbar) self.split.setSizes([0, 0, 900, 0]) self.setCentralWidget(self.split) self.showMaximized() #self.setGeometry(200, 200, 800, 500) self.cookies = {} # 存放domain的key-value self.loginDone = False #self.loginSuccessInit() #点击article list里的选项 def articleItemClick(self, clickItem: ArticleItem): self.showArticleInLeftFrame(clickItem.getBlog()) def on_browser_cookieAdd(self, cookie): # 处理cookie添加的事件 name = cookie.name().data().decode('utf-8') # 先获取cookie的名字,再把编码处理一下 value = cookie.value().data().decode('utf-8') # 先获取cookie值,再把编码处理一下 self.cookies[name] = value if self.cookies.get('UserToken') and not self.loginDone: self.loginSuccessInit() def onLoadFinished(self, finished): if finished and self.cookies.get('UserToken') and not self.loginDone: self.loginSuccessInit() def loginSuccessInit(self): self.initMenu() self.loadAllBlogsCategories() self.loadAllDraftBlogCategories() self.statusBar = QStatusBar() self.setStatusBar(self.statusBar) self.loginDone = True self.browser.setHtml('welcome!') self.split.setSizes([250, 250, 900, 50]) # 显示文章到左边的显示框里 def showArticleInLeftFrame(self, blog: Blog = None): if blog != None: self.browser.setBlog(blog) self.browser.setTitle(blog.title) if blog.url == 'draft': self.showHtml(blog) else: self.backend = LoadArticleThread(blog, CSDNService(self.cookies)) self.backend.trigger.connect(self.showHtml) self.backend.start() def showHtml(self, data: Blog): searchTxt = self.searchTxt.text() html = data.content if len(searchTxt.strip()) > 0: html = html.replace( searchTxt, '<font style=\'background-color:yellow\'>' + searchTxt + '</font>') self.browser.setHtml(html) self.browser.setMD(data.mdText) # 加载loading 条 def startloading(self): self.imageLabel = QLabel() self.movie = QMovie("./images/loading.gif") self.imageLabel.setMovie(self.movie) self.movie.start() self.setCentralWidget(self.imageLabel) def stopLoading(self): self.setCentralWidget(self.browser) def initMenu(self): tb: QToolBar = self.addToolBar("toolbar") add = QAction(QIcon('./images/add.png'), '&新建草稿', self) add.setStatusTip('新建文章') tb.addAction(add) refreshAct = QAction(QIcon('./images/refresh.png'), '&同步文章', self) refreshAct.setShortcut('Ctrl+R') refreshAct.setStatusTip('从csdn同步文章...') tb.addAction(refreshAct) personal = QAction(QIcon('./images/personal.png'), '&个人信息', self) personal.setStatusTip('个人信息') tb.addAction(personal) help = QAction(QIcon('./images/help.png'), '&帮助', self) help.setStatusTip('帮助说明') tb.addAction(help) tb.actionTriggered[QAction].connect(self.windowaction) tb.setFloatable(False) logging.info("menu ini success") def windowaction(self, q): if q.text() == "&新建草稿": self.createDraft() elif q.text() == "&同步文章": self.reloadArticles() elif q.text() == "&个人信息": QMessageBox.about(self, "个人信息", "用户名:%s" % self.cookies['UN']) elif q.text() == "&帮助": QMessageBox.about( self, "帮助说明", ''' 同步csdn文章的一个笔记工具,模仿有道笔记的界面,使用到了python,pyqt5, sqllite等 ''') def createDraft(self): blog = Blog() blog.title = '无标题笔记' blog.category = 'draft' blog.categoryUrl = 'none' blog.content = '' blog.mdText = '' blog.url = 'draft' c = TreeWidgetItem(blog=blog) c.setText(0, blog.title) c.setIcon(0, QIcon("./images/draft.png")) self.draftArticles.addChild(c) # todo: how to focus on new created item BlogCache().saveArticlies([blog]) item = ListWidgetItem(blog=blog) item.setSizeHint(QSize(100, 80)) item.setIcon(QIcon("./images/draft.png")) item.setText(blog.title) self.articleList.addItem(item) def reloadArticles(self): service = CSDNService(self.cookies) #self.reloadPublish=ReloadBlogThread(url='https://blog.csdn.net/guo_xl',service=service,parent=self) self.reloadPublish = ReloadBlogThread(url='https://blog.csdn.net/' + self.cookies['UN'], service=service, parent=self) self.reloadPublish.start() self.reloadPublish.trigger.connect(self.handleReloadMessage) self.reloadDraft = ReloadDraftBlogThread(service=service) self.reloadDraft.start() self.reloadDraft.trigger.connect(self.handleDraftReloadMessage) self.statusBar.showMessage("博客加载中...") MessageTip("开始同步").show() #返回的data是个[],里面装了Blog对象 def handleDraftReloadMessage(self, data): if isinstance(data, str): self.statusBar.showMessage(data) if data == "加载完毕": self.loadAllDraftBlogCategories() elif isinstance(data, List): self.draftArticles.takeChildren() for blog in data: c = TreeWidgetItem(blog=blog) c.setText(0, blog.title) c.setIcon(0, QIcon("./images/draft.png")) self.draftArticles.addChild(c) elif isinstance(data, Blog): self.blogCache.saveArticlies([data]) def handleReloadMessage(self, data): if isinstance(data, str): self.statusBar.showMessage(data) if data == "加载完毕": self.loadAllBlogsCategories() elif isinstance(data, dict): list = data["data"] type = data["type"] if type == BlogLoadType.categories: self.handleDisplayCategories(list) elif type == BlogLoadType.subCategories: categoryName = data["categoryName"] logging.info("处理%s" % categoryName) #找到categoryName对应的menu item #坑爹,不要用publishArticlesCategory.takeChildren()移除所有的item count = self.publishArticlesCategory.childCount() i = 0 while i < count: c = self.publishArticlesCategory.child(i) i += 1 if categoryName == c.text(0): self.handleDisplaySubCategories(list, c) logging.info("处理完%s" % categoryName) return elif isinstance(data, Blog): self.blogCache.saveArticlies([data]) #记载草稿 def loadAllDraftBlogCategories(self): data = self.blogCache.searchAllDraft() self.draftArticles.takeChildren() for blog in data: c = TreeWidgetItem(blog=blog) c.setText(0, blog.title) c.setIcon(0, QIcon("./images/draft.png")) self.draftArticles.addChild(c) item = ListWidgetItem(blog=blog) item.setSizeHint(QSize(100, 80)) item.setIcon(QIcon("./images/draft.png")) item.setText(blog.title) self.articleList.addItem(item) #加载blog's all categories def loadAllBlogsCategories(self): # 注意这里写法 # 这样是错误的,为什么? # backend=BackendThread() # backend.start() # backend.articleCategory.connect(self.handleDisplay) data = self.blogCache.searchAllPublished() publicCategory = self.publishArticlesCategory publicCategory.takeChildren() for k, v in data.items(): child = QTreeWidgetItem() child.setText(0, v.get("category")) # title child.setText(1, v.get("categoryUrl")) # url child.setText(2, 'category') child.setIcon(0, QIcon("./images/folder_close.png")) publicCategory.addChild(child) for blog in v.get("blogs"): c = TreeWidgetItem(blog=blog) c.setText(0, blog.title) c.setIcon(0, QIcon("./images/blog_normal.png")) child.addChild(c) item = ListWidgetItem(blog=blog) item.setSizeHint(QSize(100, 80)) item.setIcon(QIcon("./images/blog_normal.png")) item.setText(blog.title) self.articleList.addItem(item) self.publishArticlesCategory.setDisabled(False) def handleDisplayCategories(self, data): publicCategory = self.publishArticlesCategory for item in data: if self.findCategoryByUrl(item["url"], publicCategory) == None: child = QTreeWidgetItem() child.setText(0, item["title"]) # title child.setText(1, item["url"]) # url child.setText(2, 'category') child.setIcon(0, QIcon("./images/folder_close.png")) publicCategory.addChild(child) def findCategoryByUrl(self, url, widget): total = widget.childCount() i = 0 while i < total: if widget.child(i).text(1) == url: return widget.child(i) i = i + 1 return None def initCategory(self): self.container = QWidget(self) layout = QVBoxLayout(self.container) self.tree = QTreeWidget() # 设置列数 self.tree.setColumnCount(3) self.tree.setColumnHidden(1, True) self.tree.setColumnHidden(2, True) # 设置头的标题 self.tree.setHeaderLabels(['title', 'url', 'category']) self.tree.setHeaderHidden(True) # 设置列宽 self.tree.setColumnWidth(0, 320) self.searchTxt = QLineEdit() self.searchTxt.setPlaceholderText("关键字查询") self.searchTxt.textChanged.connect(self.search) layout.addWidget(self.searchTxt) layout.addWidget(self.tree) self.initPublishArticle() self.initDraftArticle() self.tree.itemClicked.connect(self.onClicked) self.tree.itemCollapsed.connect(self.onCollapsed) self.tree.itemExpanded.connect(self.onExpended) self.split.addWidget(self.container) self.tree.setContextMenuPolicy(Qt.CustomContextMenu) self.tree.customContextMenuRequested.connect(self.onCustomContextMenu) def onCustomContextMenu(self, point): i = self.tree.indexAt(point) menu = QMenu() upload = QAction("上传到CSDN", self) menu.addAction(upload) t = time.time() k = menu.exec_(self.tree.mapToGlobal(point)) #If the menu hasn't been open for more than 0.6s, #assume user did not have time to properly react to it opening if time.time() - t < 0.6: return if k == upload: msg = QMessageBox() msg.setText("同步到csdn") msg.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel) r = msg.exec_() if r == QMessageBox.Yes: MessageTip("开始同步到csdn").show() item = self.tree.currentItem() ut = UpdateThread(item.getBlog(), CSDNService(self.cookies)) ut.update_proess_signal.connect(self.onUploaded) ut.start() def onUploaded(self, code: int): if (code == 200): win = MessageTip("发布到csdn成功") win.show() def onCollapsed(self, index: QModelIndex): index.setIcon(0, QIcon("./images/folder_open.png") ) if index.isExpanded() else index.setIcon( 0, QIcon("./images/folder_close.png")) def onExpended(self, index: QModelIndex): index.setIcon(0, QIcon("./images/folder_open.png") ) if index.isExpanded() else index.setIcon( 0, QIcon("./images/folder_close.png")) def search(self, data): result = self.blogCache.fuzzySearch(data) #public:QTreeWidgetItem=self.publishArticlesCategory # public # total=public.childCount() # i=0 # while i<total: # c=public.child(i) # ctotal=c.childCount() # j=0 # while j<ctotal: # if len(data)>0 and (not result or c.child(j).text(0) not in result): # c.child(j).setHidden(True) # else: # c.child(j).setHidden(False) # j=j+1 # i=i+1 i = 0 articleList: QListWidget = self.articleList total = articleList.count() while i < total: if len(data) > 0 and (not result or articleList.item(i).text() not in result): articleList.item(i).setHidden(True) else: articleList.item(i).setHidden(False) i = i + 1 def onClicked(self): try: item = self.tree.currentItem() if item != None: #None是root节点 if isinstance(item, TreeWidgetItem): self.showArticleInLeftFrame(item.getBlog()) except Exception as ex: logging.exception(ex) #加载category下的子category # def loadSubCategories(self, item:QTreeWidgetItem): # list=item.takeChildren() # list.clear() # #改成异步加载 # logging.info("loading sub category start") # self.backend=BackendThread(url=item.text(1),type=BlogLoadType.subCategories) # self.backend.trigger.connect(lambda data:self.handleDisplaySubCategories(data, item)) # self.backend.start() def handleDisplaySubCategories(self, articles, item): logging.info("loading %s subcategory" % item.text(0)) for i in articles: if self.findCategoryByUrl(i["url"], item) == None: c = QTreeWidgetItem() c.setText(0, i['title']) # title c.setText(1, i['url']) # url c.setText(2, 'article') c.setText(3, i['updateTime']) item.addChild(c) def initDraftArticle(self): self.draftArticles = QTreeWidgetItem(self.tree) self.draftArticles.setText(0, '草稿箱') self.draftArticles.setIcon(0, QIcon("./images/folder_close.png")) self.tree.addTopLevelItem(self.draftArticles) def initPublishArticle(self): self.publishArticlesCategory = QTreeWidgetItem(self.tree) self.publishArticlesCategory.setText(0, '公开文章') self.publishArticlesCategory.setIcon( 0, QIcon("./images/folder_close.png")) self.publishArticlesCategory.setDisabled(True) # self.label = QLabel('', self) # self.movie = QMovie("./images/loading.gif") # self.label.setMovie(self.movie) # self.movie.start() ### 设置节点的背景颜色 #brush_red = QBrush(Qt.red) #self.publishArticles.setBackground(0, brush_red) #brush_green = QBrush(Qt.green) #self.publishArticlesCategories.setBackground(1, brush_green) self.tree.addTopLevelItem(self.publishArticlesCategory) #异步加载文章 #self.statusBar.showMessage("博客加载中...") def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft())
class MainCode(QMainWindow, UI.Ui_MainWindow): def __init__(self): QMainWindow.__init__(self) UI.Ui_MainWindow.__init__(self) self.setupUi(self) self.stackedWidget.setCurrentIndex(0) if not (os.path.exists("process")): os.makedirs("process") # 程序启动即初始化栈数据结构 global s s = Stack() s.__init__() global lig lig = Lighting() global col col = Color() # 打开 self.open_.clicked.connect(self.open) # 储存 self.save_.clicked.connect(self.save) # 重置按钮 self.reset_.clicked.connect(self.reset) # 撤销按钮 self.undo_.clicked.connect(self.undo) # 裁剪 self.btn_cut.clicked.connect(self.cut_) # 旋转 self.rotate.clicked.connect(self.page_rotate_show) self.rotate_ensure.clicked.connect(self.rotate_) # 分页 self.editor.clicked.connect(self.page_0_show) self.btn_text.clicked.connect(self.page_1_show) self.btn_denoise.clicked.connect(self.page_2_show) self.btn_statistic.clicked.connect(self.page_3_show) self.btn_filter.clicked.connect(self.page_4_show) self.btn_cutout.clicked.connect(self.page_5_show) self.btn_face.clicked.connect(self.page_6_show) self.btn_sticker.clicked.connect(self.page_7_show) self.btn_change_face.clicked.connect(self.page_8_show) self.filter_more.clicked.connect(self.page_9_show) self.filter_back.clicked.connect(self.page_4_show) # 光效 self.brightness.sliderReleased.connect(self.bright_) self.contrast.sliderReleased.connect(self.contrast_) self.sharpness.sliderReleased.connect(self.sharpness_) # 色彩 self.saturate.sliderReleased.connect(self.saturate_) # 直方图 self.btn_rgb.clicked.connect(self.showRGB) self.btn_pixel.clicked.connect(self.showPixel) # 降噪 self.btn_gaussian.clicked.connect(self.gaussian_) self.btn_blur.clicked.connect(self.blur_) self.btn_smooth_more.clicked.connect(self.smooth_more_) # 文字 self.text_color.clicked.connect(self.text_color_) self.textEnsure.clicked.connect(self.text_) # 滤镜 self.filter_pencil.clicked.connect(self.pencil) self.filter_emboss.clicked.connect(self.emboss) self.filter_blur.clicked.connect(self.blur__) self.filter_smooth.clicked.connect(self.smooth) self.filter_sharpen.clicked.connect(self.sharpen) self.filter_edge.clicked.connect(self.edge) self.filter_sunny.clicked.connect(lambda :self.filter_more_("sunny")) self.filter_trip.clicked.connect(lambda: self.filter_more_("trip")) self.filter_sakura.clicked.connect(lambda: self.filter_more_("sakura")) self.filter_jiangnan.clicked.connect(lambda: self.filter_more_("jiang_nan")) self.filter_wangjiawei.clicked.connect(lambda: self.filter_more_("wangjiawei")) self.filter_prague.clicked.connect(lambda: self.filter_more_("prague")) # 抠图 self.cutout_auto.clicked.connect(self.autocutout_) self.cutout_manu.clicked.connect(self.manucutout_) # 人像 self.face_ensure.clicked.connect(self.face_) # 贴图 self.stick_select.clicked.connect(self.stick_open) self.stick_ensure.clicked.connect(self.stick_) # 换脸 self.change_face_select.clicked.connect(self.change_face_open) self.change_face_ensure.clicked.connect(self.changeface_) # 打开 def open(self): # 获取文件名及类型 filename, filetype = QFileDialog.getOpenFileName(self, "打开文件", "C:", "Files(*.png; *.jpg; *.jpeg; *.bmp; *.gif;)") if not filename == "": # 将打开的文件压入栈中 s.push(filename) # 在lable中展示 self.show_() # 储存 def save(self): # 被保存的文件的路径 path = s.peek() # 栈中有元素时 if not path == None: img = Image.open(path) # 保存的路径 save_path, file_type = QFileDialog.getSaveFileName(self, "文件保存", "C:", "All Files (*);;Files (*.png);;Files (*.jpg);;Files (" "*.jpeg);;Files (*.bmp);;Files (*.gif)") if not save_path == "": img.save(save_path) # 分页 # 光效页 def page_0_show(self): self.stackedWidget.setCurrentIndex(0) # 文字页 def page_1_show(self): self.stackedWidget.setCurrentIndex(1) # 降噪页 def page_2_show(self): self.stackedWidget.setCurrentIndex(2) # 统计页 def page_3_show(self): self.stackedWidget.setCurrentIndex(3) # 滤镜页 def page_4_show(self): self.stackedWidget.setCurrentIndex(4) # 抠图页 def page_5_show(self): self.stackedWidget.setCurrentIndex(5) # 人像页 def page_6_show(self): self.stackedWidget.setCurrentIndex(6) # 贴图页 def page_7_show(self): self.stackedWidget.setCurrentIndex(7) # 换脸页 def page_8_show(self): self.stackedWidget.setCurrentIndex(8) # 更多滤镜页 def page_9_show(self): self.stackedWidget.setCurrentIndex(9) # 旋转页 def page_rotate_show(self): self.stackedWidget_2.setCurrentIndex(1) # 展示图片 def show_(self): # 获取此时栈顶元素 path = s.peek() img = Image.open(path) img_type = img.format width, height = img.size if img_type == "PNG" or "JPG" or "BMP" or "JPEG": if width <= 1200 and height <= 750: # 居中显示图片 self.display.setAlignment(Qt.AlignCenter) self.display.setPixmap(QPixmap(path)) # 等比例压缩图片 else: f1 = 1.0 * 1200 / width f2 = 1.0 * 750 / height factor = min(f1, f2) new_width = int(width * factor) new_height = int(height * factor) self.make_duplicate() img = Image.open(s.peek()) out = img.resize((new_width, new_height), Image.ANTIALIAS) out.save(s.peek()) self.display.setAlignment(Qt.AlignCenter) self.display.setPixmap(QPixmap(s.peek())) if img_type == "GIF": self.movie = QMovie(s.peek()) self.display.setMovie(self.movie) self.movie.start() # 重置图片 def reset(self): if not s.is_empty(): if not s.size() == 1: s.reset() self.show_() # 撤销 def undo(self): if not s.is_empty(): if not s.size() == 1: # 删除栈顶元素 s.pop() self.show_() # 为栈顶文件制作副本 def make_duplicate(self): # 复制当前栈顶文件到img img = Image.open(s.peek()) # 获得文件名并重新制作为 文件名 + (1) + .格式 filename = s.peek() filename = filename.split("/") filename = filename[-1] filename = filename.split(".") filename = filename[0] + "(1)" + "." + filename[-1] # 副本的储存路径 = process/(相对路径) + 重新制作后的文件名 path = "process/" + filename # 储存副本 img.save(path) # 副本文件的路径入栈 s.push(path) # 功能接口区 # 缩放接口 def wheelEvent(self, event): if not s.is_empty(): self.make_duplicate() path = s.peek() angle = event.angleDelta() / 8 angleY = angle.y() # 竖直滚过的距离 if angleY > 0: img = QImage(path) result = img.scaled(img.width() * 1.1, img.height() * 1.1) self.display.setPixmap(QPixmap(result)) result.save(path) else: # 滚轮下滚 img = QImage(path) result = img.scaled(img.width() * 0.9, img.height() * 0.9) self.display.setPixmap(QPixmap(result)) result.save(path) # 裁剪接口 def cut_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() Cut.main(path) self.show_() # 旋转接口 def rotate_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() angle = self.rotate_angle.value() img = Image.open(path) outcome = img.rotate(angle) outcome.save(path) self.show_() # 光效接口 def bright_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() value = self.brightness.value() lig.bright(path, value) self.show_() def contrast_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() value = self.contrast.value() lig.contrast(path, value) self.show_() def sharpness_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() value = self.sharpness.value() lig.sharpness(path, value) self.show_() # 色彩接口 def saturate_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() value = self.saturate.value() col.saturate(path, value) self.show_() # 降噪接口 def gaussian_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() den = Denoise() den.gaussian(path) self.show_() def blur_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() den = Denoise() den.blur(path) self.show_() def smooth_more_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() den = Denoise() den.smooth_more(path) self.show_() # 直方图 def showRGB(self): if s.is_empty(): self.open() else: img = cv.imread(s.peek(), cv.IMREAD_COLOR) color_ = ('b', 'g', 'r') for i, colors in enumerate(color_): histr = cv.calcHist([img], [i], None, [256], [0, 256]) plt.plot(histr, color=colors) plt.xlim([0, 256]) plt.show() def showPixel(self): if s.is_empty(): self.open() else: p = cv.imread(s.peek(), -1) plt.hist(p.ravel(), 256, [0, 256]) plt.show() cv.waitKey(0) cv.destroyAllWindows() # 文字接口 def text_color_(self): global text_r, text_g, text_b color = QColorDialog.getColor() if color.isValid(): temp = color.name() temp = temp[1:] text_r = int(temp[0:2], 16) text_g = int(temp[2:4], 16) text_b = int(temp[4:6], 16) def text_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() content = self.textEdit.toPlainText() fontScale = int(self.text_fontScale.value()) color = (text_b, text_g, text_r) x = int(self.text_x.toPlainText()) y = int(self.text_y.toPlainText()) thickness = int(self.text_thickess.value()) txt = Text() txt.addText(path, content, fontScale, x, y, color, thickness) self.show_() # 滤镜接口 def pencil(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() flt = Filter() flt.pencil(path) self.show_() def emboss(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() flt = Filter() flt.emboss(path) self.show_() def blur__(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() flt = Filter() flt.blur(path) self.show_() def smooth(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() flt = Filter() flt.smooth(path) self.show_() def edge(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() flt = Filter() flt.edge(path) self.show_() def sharpen(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() flt = Filter() flt.sharpen(path) self.show_() def filter_more_(self, filter_type): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() flt = Filter() flt.filter_more(path, filter_type) self.show_() # 抠图接口 def autocutout_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() co = AutoCutout co.AutoCutout(path) self.show_() def manucutout_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() ManuCutout.main(path) self.show_() # 人像接口 def face_(self): if s.is_empty(): self.open() else: self.make_duplicate() path = s.peek() whitening = self.whitening.value() smoothing = self.smoothing.value() thinface = self.thinface.value() shrink_face = self.shrink_face.value() enlarge_eye = self.enlarge_eye.value() remove_eyebrow = self.remove_eyebrow.value() p = Portrait() p.face_beautify(path, whitening, smoothing, thinface, shrink_face, enlarge_eye, remove_eyebrow) self.show_() # 贴图接口 def stick_open(self): filename, filetype = QFileDialog.getOpenFileName(self, "打开文件", "C:", "Files(*.png; *.jpg; *.jpeg; *.bmp; *.gif;)") self.stick_address.setPlainText(filename) def stick_(self): path_stick = self.stick_address.toPlainText() if path_stick == "": self.stick_open() else: self.make_duplicate() path = s.peek() x = int(self.stick_x.toPlainText()) y = int(self.stick_y.toPlainText()) img1 = Image.open(path) img2 = Image.open(path_stick) img1.paste(img2, (x, y)) img1.save(path) self.show_() # 换脸接口 def change_face_open(self): filename, filetype = QFileDialog.getOpenFileName(self, "打开文件", "C:", "Files(*.png; *.jpg; *.jpeg; *.bmp; *.gif;)") self.change_face_address.setPlainText(filename) def changeface_(self): path_change_face = self.change_face_address.toPlainText() if path_change_face == "": self.change_face_open() else: self.make_duplicate() path = s.peek() cf = ChangeFace cf.merge_face(path, path_change_face) self.show_() def closeEvent(self, event): if os.path.exists("process"): shutil.rmtree("process")
class SplashScreen(QSplashScreen): """PyQt 启动界面""" def __init__(self, name, image='', widget=None, above=False): super(SplashScreen, self).__init__() self.m_clients = set() self.m_movie = None self.m_server = None self.m_image = image self.m_widget = widget self.m_alignment = Qt.AlignHCenter | Qt.AlignBottom self.m_color = Qt.black self.initSplash(name, above) self.initPixmap() self.initWidget() def setAlignment(self, alignment): """设置文本位置 :param alignment: Qt.AlignmentFlag """ if isinstance(alignment, Qt.AlignmentFlag): self.m_alignment = alignment def setColor(self, color): """设置文本颜色 :param color: Qt.GlobalColor, QColor, QGradient """ if isinstance(color, (Qt.GlobalColor, QColor, QGradient)): self.m_color = color def showMessage(self, message, progress=0, alignment=None, color=None): """设置进度文本 :param message: 纯文本或html文本 :param progress: 进度条值 :param alignment: 对齐方式 :param color: 文字颜色 """ if self.m_widget and hasattr(self.m_widget, 'labelMessage'): label = getattr(self.m_widget, 'labelMessage', None) progressbar = getattr(self.m_widget, 'labelProgress', None) if progressbar and isinstance(progress, int): progressbar.setValue(progress) if message is not None: if hasattr(label, 'setHtml'): label.setHtml(message) return elif hasattr(label, 'setText'): label.setText(message) return elif message is not None: super(SplashScreen, self).showMessage(message, alignment or self.m_alignment, color or self.m_color) def mousePressEvent(self, event): """取消默认的鼠标点击隐藏 :param event: QMouseEvent """ event.ignore() def initSplash(self, name, above=False): """初始化启动画面 :param name: local server name :param above: stays on top """ # 鼠标 self.setCursor(Qt.WaitCursor) # 是否置顶 if above: self.setWindowFlags( self.windowFlags() | Qt.WindowStaysOnTopHint) # 创建本地server self.m_server = QLocalServer(self) if self.m_server.listen(self.getName(name)): self.m_server.newConnection.connect(self.slotNewConnection) def initPixmap(self): """加载背景图""" if self.m_image.endswith('.gif'): self.m_movie = QMovie(self.m_image, b'gif', self) self.m_movie.frameChanged.connect( lambda _: self.setPixmap(self.m_movie.currentPixmap())) self.m_movie.start() else: self.setPixmap(QPixmap(self.m_image)) def initWidget(self): if self.m_widget and callable(self.m_widget): self.m_widget = self.m_widget() if not isinstance(self.m_widget, QWidget): return layout = QVBoxLayout(self) layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.m_widget) def slotNewConnection(self): """新客户端连接""" socket = self.m_server.nextPendingConnection() socket.readyRead.connect(self.slotReadyRead) socket.disconnected.connect(self.slotDisconnected) self.m_clients.add(socket) def slotReadyRead(self): """收到数据""" socket = self.sender() if not socket: return while 1: message = socket.readLine().data() if not (message and message.endswith(b'\n')): break message = message.strip(b'\n').decode('utf-8', errors='ignore') try: message = json.loads(message) print('recv:', message) text = message.get('text', None) progress = message.get('progress', None) except Exception as e: print(e) break if text == 'exit': self.close() QApplication.instance().quit() break elif text == progress is None: break else: self.showMessage(text, progress) def slotDisconnected(self): """客户端断开连接""" socket = self.sender() if socket: socket.deleteLater() if socket in self.m_clients: self.m_clients.remove(socket) if len(self.m_clients) == 0: self.close() QApplication.instance().quit() @classmethod def getName(cls, name=None): if not name or len(str(name)) == 0: name = hashlib.md5( os.path.dirname(sys.argv[0]).encode()).hexdigest() return str(name) @classmethod def connect(cls, single=False): """连接启动器 :param single: 如果是单实例则客户端必须由启动器启动 """ name = os.environ.get('SplashConnectName', None) if not name: if single: # 单实例客户端必须由启动器启动 sys.exit(-1) return cls.client = QLocalSocket() cls.client.connectToServer(name) @classmethod def disconnect(cls): if hasattr(cls, 'client'): cls.client.close() @classmethod def sendMessage(cls, message): """发送json消息 :param message: json消息,必须\n结尾 """ if not hasattr(cls, 'client'): return if not message.endswith('\n'): message += '\n' print('send:', message) cls.client.write(message.encode()) cls.client.flush() @classmethod def start(cls, path, image, widget=None, single=False, name=None, above=False, alignment=None, color=None): """ :param path: 客户端路径 :param image: 背景图片 :param widget: 自定义的UI层 :param single: 是否单实例,默认 False :param name: 单实例唯一名 :param above: 是否置顶 :param alignment: 文字对齐位置 :param color: 文本颜色 """ name = cls.getName(name) os.environ['SplashConnectName'] = name # 单实例检测 if single: s = QLocalSocket() s.connectToServer(name) if s.waitForConnected(): # 应用已经启动则退出 s.close() s.deleteLater() print('application is already running') sys.exit(0) app = QApplication(sys.argv) # 启动客户端并将参数传递 QProcess.startDetached(path, sys.argv[1:]) # 显示启动界面 w = SplashScreen(name, image, widget, above) w.setAlignment(alignment) w.setColor(color) w.show() sys.exit(app.exec_())
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(370, 600) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(85, 85, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(85, 85, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) MainWindow.setPalette(palette) font = QtGui.QFont() font.setFamily("Consolas") font.setPointSize(9) MainWindow.setFont(font) MainWindow.setMouseTracking(False) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(160, 70, 41, 20)) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(70, 130, 251, 16)) font = QtGui.QFont() font.setFamily("Consolas") font.setPointSize(12) self.label_2.setFont(font) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(140, 180, 41, 20)) self.label_3.setObjectName("label_3") self.voiceFig = QtWidgets.QLabel(self.centralwidget) self.voiceFig.setGeometry(QtCore.QRect(100, 10, 161, 120)) self.voiceFig.setText("") self.gif = QMovie("resource\\file\\voice3.gif") self.voiceFig.setMovie(self.gif) self.gif.start() self.voiceFig.setScaledContents(True) self.voiceFig.setObjectName("voiceFig") self.siriGif = QtWidgets.QLabel(self.centralwidget) self.siriGif.setGeometry(QtCore.QRect(-250, 150, 850, 77)) self.siriGif.setText("") self.gif = QMovie("resource\\file\\voice2.gif") self.siriGif.setMovie(self.gif) self.gif.start() self.siriGif.setScaledContents(True) self.siriGif.setObjectName("voiceFig") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(90, 245, 241, 31)) self.label_4.setWordWrap(True) self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(90, 280, 221, 51)) self.label_5.setWordWrap(True) self.label_5.setObjectName("label_5") self.label_6 = QtWidgets.QLabel(self.centralwidget) self.label_6.setGeometry(QtCore.QRect(90, 325, 251, 41)) self.label_6.setWordWrap(True) self.label_6.setObjectName("label_6") self.label_7 = QtWidgets.QLabel(self.centralwidget) self.label_7.setGeometry(QtCore.QRect(90, 370, 251, 41)) self.label_7.setWordWrap(True) self.label_7.setObjectName("label_7") self.label_8 = QtWidgets.QLabel(self.centralwidget) self.label_8.setGeometry(QtCore.QRect(90, 420, 261, 41)) self.label_8.setWordWrap(True) self.label_8.setObjectName("label_8") self.label_9 = QtWidgets.QLabel(self.centralwidget) self.label_9.setGeometry(QtCore.QRect(40, 240, 31, 31)) self.label_9.setText("") self.label_9.setPixmap(QtGui.QPixmap("resource\\file\\1.jpg")) self.label_9.setScaledContents(True) self.label_9.setObjectName("label_9") self.label_10 = QtWidgets.QLabel(self.centralwidget) self.label_10.setGeometry(QtCore.QRect(40, 290, 31, 31)) self.label_10.setText("") self.label_10.setPixmap(QtGui.QPixmap("resource\\file\\2.jpg")) self.label_10.setScaledContents(True) self.label_10.setObjectName("label_10") self.label_11 = QtWidgets.QLabel(self.centralwidget) self.label_11.setGeometry(QtCore.QRect(40, 370, 31, 31)) self.label_11.setText("") self.label_11.setPixmap(QtGui.QPixmap("resource\\file\\4.jpg")) self.label_11.setScaledContents(True) self.label_11.setObjectName("label_11") self.label_12 = QtWidgets.QLabel(self.centralwidget) self.label_12.setGeometry(QtCore.QRect(40, 330, 31, 31)) self.label_12.setText("") self.label_12.setPixmap(QtGui.QPixmap("resource\\file\\3.jpg")) self.label_12.setScaledContents(True) self.label_12.setObjectName("label_12") self.label_13 = QtWidgets.QLabel(self.centralwidget) self.label_13.setGeometry(QtCore.QRect(40, 420, 31, 31)) self.label_13.setText("") self.label_13.setPixmap(QtGui.QPixmap("resource\\file\\5.jpg")) self.label_13.setScaledContents(True) self.label_13.setObjectName("label_13") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 370, 24)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Siri")) self.label.setText(_translate("MainWindow", "1")) self.label_2.setText(_translate("MainWindow", "Hi! How can I help?")) self.label_3.setText(_translate("MainWindow", "1")) self.label_4.setText(_translate("MainWindow", "1. Enjoy music by saying \"Music\"")) self.label_5.setText(_translate("MainWindow", "2. Take some notes by saying \"Notepad\"")) self.label_6.setText(_translate("MainWindow", "3. Do math work by saying \"Calculator\"")) self.label_7.setText(_translate("MainWindow", "4. Get weather in Shanghai by saing \"Weather\"")) self.label_8.setText(_translate("MainWindow", "5. Open WeChat by saying \"Chat\"")) def helpUi(self): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("MainWindow","Hi! How can I help?")) def listeningUi(self): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("MainWindow","I am listening!")) def playMusicUi(self): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("MainWindow","Play Music Now!")) def openNotebookUi(self): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("MainWindow","Open Notebook Now!")) def openCalculator(self): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("MainWindow", "Open Calculator Now!")) def openWeatherWeb(self): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("MainWindow", "Open Weather Web Now!")) def openWeChat(self): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("MainWindow", "Open the WeChat Now!")) def notCatchUi(self): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("MainWindow","I didn't catch that."))
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(314, 462) MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(60, 280, 201, 51)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(14) self.label_3.setFont(font) self.label_3.setStyleSheet("color: rgb(0, 117, 210);") self.label_3.setWordWrap(True) self.label_3.setObjectName("label_3") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(60, 250, 201, 21)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(14) self.label_2.setFont(font) self.label_2.setStyleSheet("color: rgb(0, 117, 210);") self.label_2.setWordWrap(True) self.label_2.setObjectName("label_2") self.voiceFig = QtWidgets.QLabel(self.centralwidget) self.voiceFig.setGeometry(QtCore.QRect(70, 50, 161, 121)) self.voiceFig.setText("") self.gif = QMovie("icon/voice.gif") self.voiceFig.setMovie(self.gif) self.gif.start() self.voiceFig.setScaledContents(True) self.voiceFig.setObjectName("voiceFig") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(70, 160, 161, 21)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(14) font.setStyleStrategy(QtGui.QFont.PreferAntialias) self.label.setFont(font) self.label.setStyleSheet("color: rgb(0, 117, 210);") self.label.setTextFormat(QtCore.Qt.AutoText) self.label.setWordWrap(True) self.label.setObjectName("label") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(60, 330, 201, 51)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(14) self.label_4.setFont(font) self.label_4.setStyleSheet("color: rgb(0, 117, 210);") self.label_4.setWordWrap(True) self.label_4.setObjectName("label_4") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Voice Assistant")) self.label_3.setText( _translate("MainWindow", "1. Enjoy music by saying \"Play music\"")) self.label_2.setText(_translate("MainWindow", "You can:")) self.label.setText(_translate("MainWindow", "Hi! How can I help?")) self.label_4.setText( _translate("MainWindow", "2. Take some notes by saying \"Open file\"")) def listeningUi(self): _translate = QtCore.QCoreApplication.translate self.label.setText(_translate("MainWindow", "I am listening!")) def playMusicUi(self): _translate = QtCore.QCoreApplication.translate self.label.setText(_translate("MainWindow", "Playing Music Now!")) def openFileUi(self): _translate = QtCore.QCoreApplication.translate self.label.setText(_translate("MainWindow", "Opening File Now!")) def notCatchUi(self): _translate = QtCore.QCoreApplication.translate self.label.setText(_translate("MainWindow", "I didn't catch that."))
class HomeWidget(QWidget, Ui_Home): metaThreadPool = QThreadPool() def __init__(self, parent): super().__init__(parent) self.setupUi(self) self.userInput.textChanged.connect(self.urlChanged) self.download.clicked.connect(self.startDownload) self.loadingGif = QMovie(":/icons/loading.gif") self.description.setReadOnly(True) def setConfig(self, config): self.config = config def startMetaDownloadThread(self): url = self.userInput.text() # Start loading gif self.clearMetaInfo() self.startLoadingAnimation() meta = MetaInformation(url) meta.signal.metaDownloaded.connect(self.loadMetaInfo) meta.signal.unableToRetrieveMeta.connect(self.noMetaInformationFound) self.metaThreadPool.start(meta) def startDownload(self): # validate(self.userInput.text()) url = self.userInput.text() dl = Downloader(url, self.config["saveDirectory"], self.config["youtubedl"]) self.metaThreadPool.start(dl) self.userInput.clear() self.clearMetaInfo() def startLoadingAnimation(self): self.image.setMovie(self.loadingGif) self.loadingGif.start() def stopLoadingAnimation(self): self.image.setMovie(None) self.loadingGif.stop() def clearMetaInfo(self): self.title.setText("...") # Description self.description.setText(""" <p> ... </p> """) self.image.clear() @pyqtSlot(str) def urlChanged(self, text): # FIXME validate url later self.startMetaDownloadThread() # FIXME Find a better way to parse unicode to html format def convertDescToHtml(self, desc): html = "<p>" for char in desc: if char == '\n': html += "</p><p>" html += char html += "</p>" return html @pyqtSlot(dict) def loadMetaInfo(self, meta): self.stopLoadingAnimation() print("Loaded meta information") # Title self.title.setText(meta["title"]) # Description self.description.setText(self.convertDescToHtml(meta["description"])) # Image (load from a byte array) pic = QPixmap() pic.loadFromData(meta["thumbnail"]) pic = pic.scaledToWidth(self.width() * 0.75) self.image.setPixmap(pic) @pyqtSlot(str) def noMetaInformationFound(self, url): if url: print("No meta information found for " + url) else: print("No meta information found and no url provided.")
def __init__(self, parent=None): super(Widget, self).__init__(parent) self.setWindowTitle("Pandora bedrijfs informatie systeem login scherm") self.setWindowIcon(QIcon('./images/logos/logo.jpg')) self.setFont(QFont('Arial', 10)) self.setStyleSheet("background-color: #D9E1DF") grid = QGridLayout() grid.setSpacing(20) self.email = QLabel() emailEdit = QLineEdit() emailEdit.setStyleSheet("background: #F8F7EE") emailEdit.setFixedWidth(200) emailEdit.setFont(QFont("Arial",10)) emailEdit.textChanged.connect(self.emailChanged) self.Wachtwoord = QLabel() wachtwEdit = QLineEdit() wachtwEdit.setStyleSheet("background: #F8F7EE") wachtwEdit.setEchoMode(QLineEdit.Password) wachtwEdit.setFixedWidth(200) wachtwEdit.setFont(QFont("Arial",10)) wachtwEdit.textChanged.connect(self.wachtwChanged) lbl = QLabel() pixmap = QPixmap('./images/logos/verbinding.jpg') lbl.setPixmap(pixmap) grid.addWidget(lbl, 0, 0, 1, 2) lblinfo = QLabel(' Pandora login') grid.addWidget(lblinfo, 0, 1, 1, 2, Qt.AlignLeft) lblinfo.setStyleSheet("color:rgba(45, 83, 115, 255); font: 25pt Comic Sans MS") logo = QLabel() pixmap = QPixmap('./images/logos/logo.jpg') logo.setPixmap(pixmap) grid.addWidget(logo , 0, 2, 1, 1, Qt.AlignRight) pandora = QLabel() movie = QMovie('./images/logos/pyqt5.gif') pandora.setMovie(movie) movie.start() grid.addWidget(pandora, 1 ,0, 1, 3, Qt.AlignCenter) grid.addWidget(QLabel('emailadres'), 3, 1) grid.addWidget(emailEdit, 3, 2) grid.addWidget(QLabel('Wachtwoord'), 4, 1) grid.addWidget(wachtwEdit, 4, 2) self.setLayout(grid) self.setGeometry(600, 250, 150, 150) applyBtn = QPushButton('Login') applyBtn.clicked.connect(self.accept) grid.addWidget(applyBtn, 5, 1, 1 , 2, Qt.AlignRight) applyBtn.setFont(QFont("Arial",10)) applyBtn.setFixedWidth(90) applyBtn.setStyleSheet("color: black; background-color: gainsboro") cancelBtn = QPushButton('Afsluiten') cancelBtn.clicked.connect(lambda: sys.exit(totZiens())) grid.addWidget(cancelBtn, 5, 2) cancelBtn.setFont(QFont("Arial",10)) cancelBtn.setFixedWidth(90) cancelBtn.setStyleSheet("color: black; background-color: gainsboro") nwBtn = QPushButton('Nieuw Account') nwBtn.clicked.connect(lambda: maakAccount(self)) grid.addWidget(nwBtn, 5, 0, 1, 2, Qt.AlignRight) nwBtn.setFont(QFont("Arial",10)) nwBtn.setFixedWidth(140) nwBtn.setStyleSheet("color: black; background-color: gainsboro") infoBtn = QPushButton('Informatie') infoBtn.clicked.connect(lambda: info()) grid.addWidget(infoBtn, 5, 0, 1, 2) infoBtn.setFont(QFont("Arial",10)) infoBtn.setFixedWidth(120) infoBtn.setStyleSheet("color: black; background-color: gainsboro") grid.addWidget(QLabel('\u00A9 2017 all rights reserved [email protected]'), 6, 0, 1, 3, Qt.AlignCenter)
class Ui_Mine4(object): def myshow(self): exec('self.widget.show()') exec('self.widget_2.show()') def mytr(self, year, top): make_a_snapshot("wct%d.html" % (year * 100 + top), ("wct%d.png" % (year * 100 + top))) make_a_snapshot("t4%d.html" % (year * 100 + top), ("t4%d.png" % (year * 100 + top))) def click3(self): year = int(self.comboBox.currentText()) top = int(self.comboBox_2.currentText()) try: os.remove('wct%d.html' % (year * 100 + top)) os.remove('t4%d.html' % (year * 100 + top)) os.remove('wct%d.png' % (year * 100 + top)) os.remove('t4%d.png' % (year * 100 + top)) except: pass def click2(self): year = int(self.comboBox.currentText()) top = int(self.comboBox_2.currentText()) t1 = threading.Thread(target=self.myshow) t2 = threading.Thread(target=self.mytr, args=(year, top)) conn = pymysql.connect(host='localhost', user='******', password='******', port=3306, db='maoyan', charset='utf8mb4') sql = "select year,actor1,actor2,actor3,actor4 from films" db_0 = pd.read_sql(sql, conn) db = db_0[(db_0.year == year)] dict_ = dict( Counter(db['actor1'].append(db['actor2']).append( db['actor3']).append(db['actor4']).dropna()).most_common(top)) x = list(dict_.keys()) y = list(dict_.values()) top_Bar = pyecharts.Bar(width=500) top_Bar.add("", x, y, mark_line=['max'], xaxis_interval=0, is_labal_show=True) top_Bar.render("t4%d.html" % (year * 100 + top)) value10 = [965, 847, 582, 555, 550, 462, 366, 360, 282, 273] value = value10[0:top] word = WordCloud(width=700) word.add("", x, value, word_size_range=[20, 100]) word.render("wct%d.html" % (year * 100 + top)) self.widget.load(QUrl('file:///wct%d.html' % (year * 100 + top))) #self.widget.show() self.widget_2.load(QUrl('file:///t4%d.html' % (year * 100 + top))) t1.start() t2.start() #self.widget_2.show() #top_Bar.render("t4%d.png" % (year * 100 + top)) #word.render("wct%d.png" % (year * 100 + top)) def click1(self): self.form.close() Form1 = QtWidgets.QMainWindow() self.ui = Mine.Ui_Mine() self.ui.setupUi(Form1) Form1.show() def setupUi(self, Mine4): Mine4.setObjectName("Mine4") Mine4.resize(1347, 790) Mine4.setStyleSheet("border-image: url(:/M6.jpg);") Mine4.setWindowFlags(Qt.FramelessWindowHint) self.form = Mine4 self.centralwidget = QtWidgets.QWidget(Mine4) self.centralwidget.setObjectName("centralwidget") self.widget = QtWebEngineWidgets.QWebEngineView(self.centralwidget) self.widget.setGeometry(QtCore.QRect(0, 270, 601, 501)) self.widget.setObjectName("widget") self.comboBox = QtWidgets.QComboBox(self.centralwidget) self.comboBox.setGeometry(QtCore.QRect(360, 0, 151, 51)) self.comboBox.setAutoFillBackground(False) self.comboBox.setStyleSheet("font: 30pt \"隶书\";\n" "color: rgb(255, 0, 0);") self.comboBox.setObjectName("comboBox") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(290, 0, 72, 51)) self.label.setStyleSheet("font: 20pt \"隶书\";\n" "color: rgb(255, 0, 0);") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(530, 0, 111, 51)) self.label_2.setStyleSheet("font: 30pt \"Agency FB\";\n" "color: rgb(255, 0, 0);") self.label_2.setObjectName("label_2") self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(110, 0, 71, 111)) self.pushButton_3.setStyleSheet("font: 20pt \"隶书\";\n" "color: rgb(255, 0, 0);") self.pushButton_3.setObjectName("pushButton_3") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(20, 0, 71, 111)) font = QtGui.QFont() font.setFamily("方正舒体") font.setPointSize(20) font.setBold(False) font.setItalic(False) font.setWeight(50) self.pushButton.setFont(font) self.pushButton.setStyleSheet("font: 20pt \"隶书\";\n" "color:rgb(255, 0, 0)") self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(200, 0, 81, 111)) self.pushButton_2.setStyleSheet("font: 20pt \"隶书\";\n" "color: rgb(255, 0, 0);") self.pushButton_2.setObjectName("pushButton_2") self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget) self.comboBox_2.setGeometry(QtCore.QRect(620, 0, 151, 51)) self.comboBox_2.setStyleSheet("font: 30pt \"隶书\";\n" "color: rgb(255, 0, 0);") self.comboBox_2.setObjectName("comboBox_2") self.comboBox_2.addItem("") self.comboBox_2.addItem("") self.comboBox_2.addItem("") """ self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(850, 30, 171, 181)) self.label_3.setText("") self.gif = QMovie('M14.gif') self.label_3.setMovie(self.gif) self.gif.start() self.label_3.setObjectName("label_3") """ self.widget_2 = QtWebEngineWidgets.QWebEngineView(self.centralwidget) self.widget_2.setGeometry(QtCore.QRect(680, 270, 601, 481)) self.widget_2.setObjectName("widget_2") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(1090, 20, 191, 181)) self.label_4.setText("") self.label_4.setObjectName("label_4") self.gif = QMovie('M20.gif') self.label_4.setMovie(self.gif) self.gif.start() Mine4.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(Mine4) self.menubar.setGeometry(QtCore.QRect(0, 0, 1347, 26)) self.menubar.setObjectName("menubar") Mine4.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(Mine4) self.statusbar.setObjectName("statusbar") Mine4.setStatusBar(self.statusbar) self.retranslateUi(Mine4) self.pushButton.clicked.connect(self.click1) self.pushButton_3.clicked.connect(self.click2) self.pushButton_2.clicked.connect(self.click3) QtCore.QMetaObject.connectSlotsByName(Mine4) def retranslateUi(self, Mine4): _translate = QtCore.QCoreApplication.translate Mine4.setWindowTitle(_translate("Mine4", "欢迎使用喵眼!")) self.comboBox.setItemText(0, _translate("Mine4", "2015")) self.comboBox.setItemText(1, _translate("Mine4", "2016")) self.comboBox.setItemText(2, _translate("Mine4", "2017")) self.comboBox.setItemText(3, _translate("Mine4", "2018")) self.label.setText(_translate("Mine4", "年份")) self.label_2.setText(_translate("Mine4", "Top")) self.pushButton_3.setText(_translate("Mine4", "查\n" "看")) self.pushButton.setText(_translate("Mine4", "返\n" "回")) self.pushButton_2.setText(_translate("Mine4", "不\n" "保\n" "存")) self.comboBox_2.setItemText(0, _translate("Mine4", "3")) self.comboBox_2.setItemText(1, _translate("Mine4", "5")) self.comboBox_2.setItemText(2, _translate("Mine4", "10"))
class PhotoBooth(Ui_PhotoBooth): def __init__(self): super(PhotoBooth, self).__init__() self.camera = Camera() self.initUI() self.status = 0 #self.relais=relais(('light','fanCam','fanPrinter','')) def initUI(self): self.full = False self.MainWindow = QtWidgets.QMainWindow() self.setupUi(self.MainWindow) self.movie = QMovie('ressources\Spinner-1s-400px_white.gif') self.loading.setMovie(self.movie) self.movie.start() self.buttonExit.clicked.connect(lambda: self.CloseWindow()) self.buttonRestart.clicked.connect(lambda: self.ShowCam()) self.buttonPrinter.clicked.connect(lambda: self.send2printer()) self.buttonDecrease.clicked.connect(lambda: self.changeNbPrint(-1)) self.buttonIncrease.clicked.connect(lambda: self.changeNbPrint(1)) self.buttonCancel.clicked.connect(lambda: self.modeVeille()) self.veilleButton.clicked.connect(lambda: self.ShowCam()) self.buttonPhoto.clicked.connect(lambda: self.StartCountdown()) self.widgetPrint.hide() self.widgetPhoto.hide() self.warning.hide() self.countdown.hide() self.getComptPrint() self.MainWindow.show() self.ShowCam() if DEVELOPERMODE: rect = win32gui.GetWindowRect( win32gui.FindWindow(None, 'PhotoBooth')) win32gui.MoveWindow(win32gui.FindWindow(None, 'PhotoBooth'), rect[0] + 3000, rect[1], rect[2] + 3000, rect[3], True) else: self.widgetDevelopper.hide() self.fullScreen() #@pyqtSlot(QImage) def setImage(self, image): self.camView.setPixmap(QPixmap.fromImage(image)) def fullScreen(self): if self.full: self.MainWindow.showNormal() else: self.MainWindow.showFullScreen() self.full = not self.full #self.MainWindow.resize(1920, 1080) #self.centralwidget.resize(1920,1080) #self.background.resize(1920,1080) def CloseWindow(self): self.StopCam() self.MainWindow.close() def showPhoto(self): #pixmap = QPixmap(self.lastPhoto.path) pixmap = self.lastPhoto.QImage #pixmap=pixmap.scaledToWidth(self.lastPhoto.width) self.viewer.setPixmap(pixmap) self.widgetPhoto.hide() self.widgetPrint.show() self.changeNbPrint(0) def StartCountdown(self): self.countdown.setText( QtCore.QCoreApplication.translate("MainWindow", '10')) self.countdown.show() self.buttonPhoto.hide() self.th.StartCountdown(10) def ShowCam(self): #self.camView.setText(QtCore.QCoreApplication.translate("PhotoBooth", "654 photos restantes")) self.veilleButton.hide() self.widgetPrint.hide() self.widgetPhoto.show() self.lookUp.hide() self.th = Thread() self.th.changePixmap.connect(self.setImage) self.th.init(self) self.th.start() def StopCam(self): self.camView.clear() self.widgetPhoto.hide() try: self.th.stop() except: pass def TakePhoto(self): oldPic = photo() self.camera.Trigger() self.StopCam() self.countdown.setText( QtCore.QCoreApplication.translate("MainWindow", '0')) self.countdown.hide() self.buttonPhoto.show() self.lastPhoto = photo() while self.lastPhoto.path == oldPic.path: self.lastPhoto = photo() if self.lastPhoto.isDarker(1600): pass #self.relais.ON('light') self.showPhoto() def modeVeille(self): self.StopCam() self.veilleButton.show() def changeNbPrint(self, i): if i == 0: # Init self.nbPrint = 1 else: self.nbPrint = min(max(1, self.nbPrint + i), 6) self.nbPrintLabel.setText( QtCore.QCoreApplication.translate("MainWindow", str(self.nbPrint))) def send2printer(self): for i in range(self.nbPrint): printer(self.lastPhoto) self.setComptPrint(self.nbPrint) self.ShowCam() def getComptPrint(self): file1 = open("compteur.txt", "r") self.comptPrint = int(file1.read()) file1.close self.compteur.setText( QtCore.QCoreApplication.translate( "MainWindow", str(self.comptPrint) + ' photos restantes')) def setComptPrint(self, n): self.comptPrint -= n file1 = open("compteur.txt", "w") file1.write(str(self.comptPrint)) file1.close self.compteur.setText( QtCore.QCoreApplication.translate( "MainWindow", str(self.comptPrint) + ' photos restantes')) file2 = open("Printlog.csv", "a") line = [] line.append(str(datetime.now())) line.append(self.lastPhoto.name) line.append(str(n)) file2.write(';'.join(line)) file2.close
def set_loading(self): loader = QMovie(appctxt.get_resource("animations/loader.gif")) self.preview_box.setMovie(loader) loader.jumpToFrame(0) self.preview_box.resize(loader.currentImage().size()) loader.start()
class SlideshowMediaWindow(QDialog): def __init__(self, parent, area=None, *args, **kwargs): "parent: parent widget" "area: top-left-x(to screen), top-left-y(to screen), width, height" super(SlideshowMediaWindow, self).__init__(parent, *args, **kwargs) self.setWindowTitle("Slideshow External Media Window") sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.setSizePolicy(sizePolicy) self.setAttribute(Qt.WA_DeleteOnClose, on=True) self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint) self.setSizeGripEnabled(True) self.layout = QVBoxLayout() self.media_container = QLabel(self) self.media_container.setAttribute(Qt.WA_NativeWindow, on=True) # self.media_container.setFrameShape(QFrame.NoFrame) sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) sizePolicy.setHeightForWidth( self.media_container.sizePolicy().hasHeightForWidth()) self.media_container.setSizePolicy(sizePolicy) self.media_container.setAlignment(Qt.AlignCenter) self.media_container.setStyleSheet("background-color: black;") self.layout.addWidget(self.media_container) self.layout.setContentsMargins(1, 1, 1, 1) self.setLayout(self.layout) self.area = area if any(area): self.resize(area[2], area[3]) self.move(area[0], area[1]) else: self.resize(400, 300) self.mouse_pos = [0, 0] self.allow_resize_mouse_press = False self.pic_image = None self.media_container.setScaledContents(False) self.media_container.original_resizeEvent = self.media_container.resizeEvent def media_container_resizeEvent(event): if self.pic_image and isinstance(self.pic_image, QPixmap): if self.pic_image.width() > self.media_container.width() - 2 \ and self.pic_image.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.width() target_height = self.pic_image.height() scaled_image = self.pic_image.scaled( target_width, target_height, aspectRatioMode=Qt.KeepAspectRatio, transformMode=Qt.FastTransformation) self.media_container.setPixmap(scaled_image) elif self.pic_image and isinstance(self.pic_image, QMovie): if self.pic_image.original_size.width() > self.media_container.width() - 2 \ and self.pic_image.original_size.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.original_size.width() target_height = self.pic_image.original_size.height() scaled_size = self.pic_image.original_size.scaled( target_width, target_height, Qt.KeepAspectRatio) self.pic_image.setScaledSize(scaled_size) else: self.media_container.original_resizeEvent(event) self.media_container.resizeEvent = media_container_resizeEvent self.show() self.last_media_path = "" self.media_show_completed_notice = None # this should be a function to be called like self.stop_media_show() self.stop_media_show = lambda: None self.gif_completed_notice = threading.Event() def show_video(self, path): self.stop_media_show() self.media_container.clear() # some say the winId change all the time...so... mplayer_extended.setup(int(self.media_container.winId())) self.media_show_completed_notice = mplayer_extended.play(path) logger.debug("ext-media-win showed video: %s" % path) self.last_media_path = path self.stop_media_show = mplayer_extended.stop def show_pic(self, path): self.stop_media_show() self.media_container.clear() if not path.lower().endswith(".gif"): self.pic_image = QPixmap(path) if self.pic_image.width() > self.media_container.width() - 2 \ and self.pic_image.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.width() target_height = self.pic_image.height() scaled_image = self.pic_image.scaled( target_width, target_height, aspectRatioMode=Qt.KeepAspectRatio, transformMode=Qt.SmoothTransformation) self.media_container.setPixmap(scaled_image) logger.debug("ext-media-win showed pic: %s" % path) self.stop_media_show = lambda: None self.media_show_completed_notice = None else: self.last_media_path = path self.pic_image = QMovie(path, QByteArray(), self) if not self.pic_image.isValid(): self.media_show_completed_notice = None return self.pic_image.setCacheMode(QMovie.CacheAll) self.pic_image.jumpToNextFrame() self.pic_image.original_size = self.pic_image.currentPixmap().size( ) if self.pic_image.original_size.width() > self.media_container.width() - 2 \ and self.pic_image.original_size.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.original_size.width() target_height = self.pic_image.original_size.height() scaled_size = self.pic_image.original_size.scaled( target_width, target_height, Qt.KeepAspectRatio) self.pic_image.setScaledSize(scaled_size) self.pic_image.setSpeed(100) self.media_container.setMovie(self.pic_image) self.media_show_completed_notice = self.gif_completed_notice self.media_show_completed_notice.clear() def frameChanged_Handler(frameNumber): if frameNumber >= self.pic_image.frameCount() - 1: self.pic_image.stop() self.media_show_completed_notice.set() self.pic_image.frameChanged.connect(frameChanged_Handler) self.pic_image.start() logger.debug("ext-media-win showed gif: %s" % path) def stop_gif(): try: self.pic_image.stop() self.media_show_completed_notice.set() except Exception: pass self.stop_media_show = stop_gif def contextMenuEvent(self, event): m = QMenu(self) item = m.addAction("Stop Media") item.triggered.connect(self.stop_media_show) item = m.addAction("Exit Media Window") item.triggered.connect(self.close) m.popup(QCursor.pos()) def mousePressEvent(self, event): self.mouse_pos[0] = event.x() self.mouse_pos[1] = event.y() if event.globalX() < self.x() + self.frameGeometry().width() - 20 \ or event.globalY() < self.y() + self.frameGeometry().height() - 20: self.allow_resize_mouse_press = True else: self.allow_resize_mouse_press = True super().mousePressEvent(event) def mouseReleaseEvent(self, event): self.allow_resize_mouse_press = False super().mouseReleaseEvent(event) def mouseMoveEvent(self, event): if self.allow_resize_mouse_press: self.move(event.globalX() - self.mouse_pos[0], event.globalY() - self.mouse_pos[1]) super().mouseMoveEvent(event) def mouseDoubleClickEvent(self, event): self.setWindowState(self.windowState() ^ Qt.WindowFullScreen) super().mouseDoubleClickEvent(event) def keyPressEvent(self, event): if event.key() == Qt.Key_F11: self.setWindowState(self.windowState() ^ Qt.WindowFullScreen) else: super().keyPressEvent(event) def closeEvent(self, event): self.stop_media_show() self.area[0] = self.x() self.area[1] = self.y() self.area[2] = self.width() self.area[3] = self.height() event.accept()
class MainWindow(QMainWindow): """ Main Application Window""" def __init__(self): super(MainWindow, self).__init__() # event dispatcher self.dispatcher = Dispatcher.instance() # translations self.translate = QtCore.QCoreApplication.translate self.interval = 'daily' self.hjson_value = None # thread which runs rsnapshot self.worker = Worker() # is rsnapshot still running? self.busy = False # connect to events self.dispatcher.error.connect(self.command_error) self.dispatcher.command_complete.connect(self.command_complete) # Install the custom output stream sys.stdout = EmittingStream(text_written=self.log_command) # init ui self.init_ui() def closeEvent(self, event): """ Do not close the app if rsnapshot is still running """ if not self.busy: event.accept() else: event.ignore() QMessageBox.warning( self, 'Feed Checker', self.translate("MainWindow", "You badass, I'm still running!"), QMessageBox.Ok) def init_ui(self): # styles ssh_file = style() with open(ssh_file, "r") as fh: self.setStyleSheet(fh.read()) # dimensions and positioning self.resize(800, 500) self.center() # window props self.setWindowTitle('Feed Checker') self.setWindowIcon(QIcon(icon('icon.png'))) # system tray icon self.tray_icon = QSystemTrayIcon(self) self.tray_icon.setIcon(QIcon(icon('icon.png'))) quit_action = QAction(self.translate('MainWindow', 'Quit'), self) quit_action.triggered.connect(qApp.quit) tray_menu = QMenu() tray_menu.addAction(quit_action) self.tray_icon.setContextMenu(tray_menu) self.tray_icon.show() # info infoAct = QAction(QIcon(icon('info-icon.png')), 'Exit', self) infoAct.triggered.connect(self.open_info_dialog) # toolbar self.toolbar = self.addToolBar('Toolbar') self.toolbar.addAction(infoAct) # layout self.wid = QWidget(self) self.setCentralWidget(self.wid) self.main_layout = QVBoxLayout() self.main_layout.setSpacing(20) self.init_ui_body() self.wid.setLayout(self.main_layout) # show self.show() def center(self): """ Place the window in the center of the screen """ qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def init_ui_body(self): """ The ui body """ # text info (displays rsnapshot output) self.text_info = QTextEdit() self.text_info.setReadOnly(True) self.text_info.setText('choose an hjson file, gringo!') # start button self.start_button = QLabel('<img src="%s" />' % icon('start-icon.png')) self.start_button.mousePressEvent = self.start self.start_button.setFixedSize(128, 136) # select file self.hjson_button = QPushButton( self.translate('MainWindow', 'choose hjson file')) self.hjson_button.clicked.connect(self.choose_hjson) self.hjson_button.setProperty('buttonClass', 'hjsonButton') self.hjson_button.setFixedSize(200, 40) self.hjson_value_label = QLabel('') self.hjson_value_label.setProperty('labelClass', 'hjsonValue') # loading icon self.loading_movie = QMovie(icon('loader.gif')) self.loading = QLabel() self.loading.setAlignment(QtCore.Qt.AlignCenter) self.loading.setMovie(self.loading_movie) self.loading.setHidden(True) # add all the stuff to the layout self.main_layout.addWidget(self.start_button) self.main_layout.addWidget(self.hjson_button) self.main_layout.addWidget(self.hjson_value_label) self.main_layout.addWidget(self.loading) self.main_layout.addWidget(self.text_info) self.main_layout.setAlignment(self.start_button, QtCore.Qt.AlignCenter) self.main_layout.setAlignment(self.hjson_button, QtCore.Qt.AlignCenter) self.main_layout.setAlignment(self.hjson_value_label, QtCore.Qt.AlignCenter) def open_info_dialog(self): """ opens the info window """ info_dialog = InfoDialog() info_dialog.exec_() def choose_hjson(self): fname = QFileDialog.getOpenFileName( self, self.translate('MainWindow', 'Open file'), os.path.expanduser('~')) if fname[0]: self.hjson_value = fname[0] self.hjson_value_label.setText(self.hjson_value) self.text_info.setText( 'what are you waiting for? Push the button asshole!') def start(self, event): """ Starts the check if not yet busy """ if not self.hjson_value: QMessageBox.information( self, 'Feed Checker', self.translate( 'MainWindow', 'F**k, have you understood you must select an hjson file?' ), QMessageBox.Ok) elif not self.busy: self.set_busy(True) self.text_info.setText( 'starting checking feeds, keep calm and drink water...\n') self.worker.run_check(self.hjson_value) def log_command(self, text): """ Logs sys.stdout in the text field """ cursor = self.text_info.textCursor() cursor.movePosition(QTextCursor.End) cursor.insertText(text) self.text_info.setTextCursor(cursor) self.text_info.ensureCursorVisible() def command_error(self, message): """ Used to filter rsnapshot errors and perform actions or display info in some cases """ if message == 'error-cannot-find-dest': reply = QMessageBox.warning( self, 'Feed Checker', self.translate('MainWindow', '''An error occurred.'''), QMessageBox.Ok) if reply == QMessageBox.Ok: self.text_info.setText('ready...') def command_complete(self, returncode): """ rsnapshot command complete """ self.set_busy(False) # success with or without warnings if returncode == 0 or returncode == 2: # save last sync # show success dialog text, ok = QInputDialog.getText( self, self.translate('MainWindow', 'Ok buddy'), self.translate( 'MainWindow', 'If you want to save the corrected hjson list enter the file path and press enter, otherwise 🖕' )) if ok: corrected_hjson = self.worker.get_corrected_hjson() with open(text, 'w') as outfile: json.dump(corrected_hjson, outfile, sort_keys=True, indent=4, ensure_ascii=False) def set_busy(self, busy): """ Is the application busy? """ if busy: self.hjson_button.setDisabled(True) self.loading.setHidden(False) self.loading_movie.start() else: self.hjson_button.setDisabled(False) self.loading.setHidden(True) self.loading_movie.stop() self.busy = busy
class App(QWidget): #variables to store folders to backup source_folder = None destination_folder = None def __init__(self): super().__init__() self.title = 'ROBOCOPY Backup GUI' self.left = 10 self.top = 10 self.width = 500 self.height = 500 self.setWindowIcon(QtGui.QIcon('icon.png')) self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.movie = QMovie('cool.gif') self.movie.frameChanged.connect(self.repaint) self.movie.start() #Colors self.setAutoFillBackground(True) palette = QPalette() palette.setColor(QPalette.ButtonText, Qt.darkCyan) palette.setColor(self.backgroundRole(), Qt.darkGray) self.setPalette(palette) #buttons source_button = QPushButton('Source Folder', self) destination_button = QPushButton('Destination Folder', self) source_button.move(20, 20) destination_button.move(140, 20) copy_button = QPushButton('Start Copying', self) copy_button.move(260, 20) done_button = QPushButton('Click to Close', self) done_button.move(380, 20) source_button.resize(100, 40) destination_button.resize(100, 40) copy_button.resize(100, 40) done_button.resize(100, 40) #clicked buttons source_button.clicked.connect(self.select_source_folder) destination_button.clicked.connect(self.select_destination_folder) copy_button.clicked.connect(self.copying) done_button.clicked.connect(self.done) self.show() def select_source_folder(self): App.source_folder = QFileDialog.getExistingDirectory( self, 'SELECT DIRECTORY').strip() def select_destination_folder(self): App.destination_folder = QFileDialog.getExistingDirectory( self, 'SELECT DIRECTORY').strip() def copying(self): subprocess.run( ["robocopy", App.source_folder, App.destination_folder, "/S"]) def done(self): sys.exit(1) def paintEvent(self, event): currentFrame = self.movie.currentPixmap() frameRect = currentFrame.rect() frameRect.moveCenter(self.rect().center()) if frameRect.intersects(event.rect()): painter = QPainter(self) painter.drawPixmap(frameRect.left(), frameRect.top(), currentFrame)
class WaitForTextOnPage(QDialog): """Wait until specific text is present on a page.""" ACCEPTED = QDialog.Accepted REJECTED = QDialog.Rejected WAIT_TIME_EXPIRED = 3 def __init__(self, parent, url, text, wait_time=150, monitor=False): """ Parameters ---------- parent The parent of this dialog window. url: str The url of the page to check for 'text'. text: str The text to search for on the page. wait_time: int The time to wait for the text to be present. default = 150 seconds Returns ------- QDialog.Accepted if the text is found. QDialog.Rejected if dialog is cancelled. WaitForTextOnPage.WAIT_TIME_EXPIRED if 'wait_time' has elapsed. """ super().__init__(parent) settings = QSettings() self.url = url self.text = text self.wait_time = wait_time self.monitor = monitor self.is_running = False self.request_timeout = int(settings.value("main/request_timeout")) self.check_interval = 10 self.check_interval_remaining = self.check_interval self.setWindowTitle("Low Amperage Boot") self.main_layout = QVBoxLayout() self.serial_label_layout = QHBoxLayout() self.message_label_layout = QHBoxLayout() self.lbl_hourglass = QLabel() self.movie_hourglass = QMovie( r"laboot\resources\images\animations\activity_green_fast.gif") self.lbl_hourglass.setMovie(self.movie_hourglass) self.lbl_hourglass.setAlignment(Qt.AlignHCenter) self.lbl_serial_detect = QLabel( f"Serial number {self.text} was not detected.") font = self.lbl_serial_detect.font() font.setPointSize(10) self.lbl_serial_detect.setFont(font) self.lbl_serial_detect.setAlignment(Qt.AlignHCenter) text = ("Monitoring collector for refresh of serial numbers." if monitor else "Waiting for collector to refresh serial numbers.") self.lbl_main_message = QLabel(text) self.lbl_main_message.setFont(font) self.lbl_main_message.setAlignment(Qt.AlignHCenter) self.lbl_separator = QLabel("_" * 50) self.lbl_separator.setAlignment(Qt.AlignHCenter) btns = QDialogButtonBox() btns.setStandardButtons(QDialogButtonBox.Cancel) btns.rejected.connect(lambda: self.done(WaitForTextOnPage.REJECTED)) self.main_layout.addWidget(self.lbl_hourglass, Qt.AlignHCenter) self.serial_label_layout.addWidget(self.lbl_serial_detect, Qt.AlignCenter) self.main_layout.addLayout(self.serial_label_layout, stretch=1) self.message_label_layout.addWidget(self.lbl_main_message, Qt.AlignCenter) self.main_layout.addLayout(self.message_label_layout, stretch=1) self.main_layout.addWidget(self.lbl_separator, Qt.AlignCenter) self.main_layout.addWidget(btns) self.check_page_timer = QTimer(self) self.check_page_timer.timeout.connect(self._check_page) self.setLayout(self.main_layout) def start(self): self.open() self.is_running = True self.movie_hourglass.start() self.check_page_timer.start(self.check_interval * 1000) # time to spend waiting for the collector to update QTimer(self).singleShot(self.wait_time * 1000, self.stop) def stop(self): self.check_page_timer.stop() self.done(WaitForTextOnPage.WAIT_TIME_EXPIRED) def _check_page(self): in_source: List[str] = self._get_source_as_list( self.url, self.request_timeout) if self._find(self.text, in_source): self.done(WaitForTextOnPage.ACCEPTED) @staticmethod def _get_source_as_list(url: str, timeout: int = 5) -> List[str]: r = requests.get(url, timeout=timeout) return r.text.split("\n") @staticmethod def _find(text: str, source: List[str]) -> bool: for line in source: if text in line.strip(): return True return False
class InformationWindow(QWidget): def __init__(self): QWidget.__init__(self, ctx.mainScreen) self.setObjectName("InformationWindow") self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setFixedHeight(50) self.setMaximumWidth(800) self.setStyleSheet(""" QFrame#frame { border: 1px solid rgba(255,255,255,30); /*border-radius: 4px;*/ background-color: rgba(0,0,0,100);} QLabel { border:none; color:#FFFFFF;} QProgressBar { border: 1px solid white;} QProgressBar::chunk { background-color: #F1610D; width: 0.5px;} """) self.gridlayout = QGridLayout(self) self.frame = QFrame(self) self.frame.setObjectName("frame") self.horizontalLayout = QHBoxLayout(self.frame) self.horizontalLayout.setContentsMargins(10, 0, 10, 0) # Spinner self.spinner = QLabel(self.frame) self.spinner.setMinimumSize(QSize(16, 16)) self.spinner.setMaximumSize(QSize(16, 16)) self.spinner.setIndent(6) self.movie = QMovie(':/images/working.mng') self.spinner.setMovie(self.movie) self.movie.start() self.horizontalLayout.addWidget(self.spinner) # Message self.label = QLabel(self.frame) self.label.setAlignment(Qt.AlignCenter) self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.icon = QLabel(self.frame) self.icon.setFixedWidth(16) self.icon.setFixedHeight(16) self.horizontalLayout.setSpacing(10) self.horizontalLayout.addWidget(self.icon) self.horizontalLayout.addWidget(self.label) self.gridlayout.addWidget(self.frame,0,0,1,1) def update(self, message, type=None, spinner=False): fontMetric = self.label.fontMetrics() textWidth = fontMetric.width(message) if type: self.icon.show() if type == "error": self.icon.setPixmap(QPixmap(":/gui/pics/dialog-error.png")) self.setStyleSheet(" QFrame#frame {background-color: rgba(255,0,0,100);} ") elif type == "warning": self.icon.setPixmap(QPixmap(":/gui/pics/dialog-warning.png")) self.setStyleSheet(" QFrame#frame {background-color: rgba(0,0,0,100);} ") self.setFixedWidth(textWidth + self.icon.width() + 50) self.label.setText(message) else: self.icon.hide() self.setStyleSheet(" QFrame#frame {background-color: rgba(0,0,0,100);} ") self.setFixedWidth(textWidth + self.icon.width() + 100) self.label.setText(message) self.spinner.setVisible(spinner) self.move(ctx.mainScreen.width()/2 - self.width()/2, ctx.mainScreen.height() - self.height()/2 - 50) self.show() def refresh(self): ctx.mainScreen.processEvents() def show(self): QWidget.show(self) self.refresh() def hide(self): QWidget.hide(self) self.refresh()
class MainGui(QMainWindow, Ui_MainWindow): sig_recorder_abort_workers = pyqtSignal() sig_inference_abort_workers = pyqtSignal() btn_flag = 0 def __init__(self, parent=None): super(MainGui, self).__init__(parent) self.setupUi(self) self.initial_ui() # Make any cross object connections. self._connectSignals() QThread.currentThread().setObjectName( 'main') # threads can be named, useful for log output self.__threads = None def _connectSignals(self): ## 放btn connect function self.startBtn.clicked.connect(self.btn_event) self.resetBtn.clicked.connect(self.reset_event) def initial_ui(self): # place the window self.move(200, 100) self.setWindowTitle('Deepspeech with PyQt') # PushButton self.startBtn.setEnabled(True) # GraphicsView self.graphicsView.paused = False self.graphicsView.logScale = False self.graphicsView.showPeaks = False self.graphicsView.downsample = True self.graphicsView.p1 = self.graphicsView.addPlot() self.graphicsView.p1.setLabel('bottom', 'RowData', 'PCM') self.graphicsView.p1.setYRange(0, 300) self.infoText.setDisabled(True) self.infereceText.setDisabled(True) # set start icon self.startBtn.setIcon(QtGui.QIcon('record.png')) self.startBtn.setIconSize(QtCore.QSize(100, 100)) # set reset icon self.resetBtn.setIcon(QtGui.QIcon('reset.png')) self.resetBtn.setIconSize(QtCore.QSize(120, 120)) self.resetBtn.setDisabled(True) # set waiting gif self.movie = QMovie("wait.gif", QtCore.QByteArray(), self) self.movie.setCacheMode(QtGui.QMovie.CacheAll) self.movie.setSpeed(100) self.statusLabel.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.movie.setCacheMode(QtGui.QMovie.CacheAll) self.statusLabel.setMovie(self.movie) self.movie.start() self.statusLabel.hide() def get_spectrum(self, data): T = 1.0 / RATE N = data.shape[0] Pxx = (1. / N) * np.fft.fft(data) f = np.fft.fftfreq(N, T) Pxx = np.fft.fftshift(Pxx) f = np.fft.fftshift(f) return f.tolist(), (np.absolute(Pxx)).tolist() def btn_event(self): if (self.btn_flag == 0): self.btn_flag = 1 self.startBtn.setIcon(QtGui.QIcon('stop.png')) self.startBtn.setIconSize(QtCore.QSize(100, 100)) self.__threads = [] # create a recorder object record = Recorder() record_thread = QThread() record_thread.setObjectName('record thread') self.__threads.append( (record_thread, record)) # need to store worker too otherwise will be gc'd record.moveToThread(record_thread) # get progress messages from worker: record.sig_step.connect(self.on_recorder_worker_step) # control worker: self.sig_recorder_abort_workers.connect(record.abort) # get read to start worker:record record_thread.started.connect(record.work) record_thread.start( ) # this will emit 'started' and start thread's event loop else: self.btn_flag = 0 self.startBtn.setIcon(QtGui.QIcon('record.png')) self.startBtn.setIconSize(QtCore.QSize(100, 100)) self.sig_recorder_abort_workers.emit() print('Asking each worker to abort') for record_thread, record in self.__threads: # note nice unpacking by Python, avoids indexing record_thread.quit( ) # this will quit **as soon as thread event loop unblocks** record_thread.wait( ) # <- so you need to wait for it to *actually* quit self.startBtn.setDisabled(True) self.statusLabel.show() inference = Inference() inference_thread = QThread() inference_thread.setObjectName('Inference Thread') self.__threads.append( (inference_thread, inference)) # need to store worker too otherwise will be gc'd inference.moveToThread(inference_thread) inference.sig_result.connect(self.on_inference_worker_end) self.sig_inference_abort_workers.connect(inference.abort) inference_thread.started.connect(inference.work) inference_thread.start( ) # this will emit 'started' and start thread's event loop def reset_event(self): # stop inference thread for inference_thread, inference in self.__threads: # note nice unpacking by Python, avoids indexing inference_thread.quit( ) # this will quit **as soon as thread event loop unblocks** inference_thread.wait( ) # <- so you need to wait for it to *actually* quit self.resetBtn.setDisabled(True) self.startBtn.setEnabled(True) self.infoText.clear() self.infoText.setDisabled(True) self.infereceText.clear() self.infereceText.setDisabled(True) self.graphicsView.p1.clear() @pyqtSlot(np.ndarray) def on_recorder_worker_step(self, r_data): # draw gui chart f, Pxx = self.get_spectrum(r_data) self.graphicsView.p1.plot(x=f, y=Pxx, clear=True) @pyqtSlot(str) def on_inference_worker_end(self, str): self.statusLabel.hide() self.infoText.setEnabled(True) self.infereceText.setEnabled(True) result = str.split('\n') print('%%%%%%%%% : ', result[3]) self.infereceText.setPlainText(result[3]) self.infoText.setPlainText(str) self.resetBtn.setEnabled(True)
class CalculationWindow(QFrame): def __init__(self, calc_func: Callable[[Params, CalcTracker], None], back_window: Callable): super().__init__() self._calc_func = calc_func self._back_window = back_window self._calc_tracker = CalcTracker() self._calc_tracker.finished.connect(self._done_calculation) self._calc_tracker.error.connect(self._error_calculation) button_bar = QFrame() button_layout = QHBoxLayout() self._back_button = QPushButton('Back') self._back_button.setFixedSize(QSize(100, 30)) self._back_button.setDisabled(True) self._back_button.clicked.connect(self._on_back) button_layout.addWidget(self._back_button, alignment=Qt.AlignRight) button_bar.setLayout(button_layout) self._center_bar = QFrame() loading_layout = QVBoxLayout() self._loading_label = QLabel() self._loading_movie = QMovie(str(LOADING_SPINNER)) self._loading_label.setMovie(self._loading_movie) loading_layout.addWidget(self._loading_label) self._center_bar.setLayout(loading_layout) layout = QVBoxLayout() layout.addWidget(self._center_bar, alignment=Qt.AlignCenter) layout.addWidget(button_bar, alignment=Qt.AlignBottom) self.setLayout(layout) def start(self, params: Params): self._loading_label.show() self._loading_movie.start() self._calc_func(params, self._calc_tracker) def _on_back(self): self._back_window() def _done_calculation(self, result: Result): self._loading_movie.stop() self._loading_label.hide() self._back_button.setDisabled(False) group_canvas = self._plot_group_scatter(result) graphs_list, canvases = self._plot_group_routes(result) all_canvas = self._plot_combined_route(result, graphs_list) self._save_graphs(group_canvas, canvases, all_canvas) tabs = [('Groups', group_canvas), ('Routes', all_canvas)] for i, c in enumerate(canvases): tabs.append((f"Route {i}", c)) self._show_graph_tabs(tabs) def _save_graphs(self, group_canvas, route_canvases, all_canvas): try: if not OUTPUT_PATH.exists(): OUTPUT_PATH.mkdir() for i, canvas in enumerate(route_canvases): canvas.fig.savefig(str(OUTPUT_PATH / SINGLE_ROUTE_CANVAS_NAME.format(group_num=i))) group_canvas.fig.savefig(str(GROUP_CANVAS_PATH)) all_canvas.fig.savefig(str(ALL_ROUTES_CANVAS_PATH)) except Exception as e: dialogs.show_error_dialog(self, e) def _error_calculation(self, exception: Exception): self._loading_movie.stop() self._loading_label.hide() dialogs.show_error_dialog(self, exception) self._on_back() def _plot_group_routes(self, result: Result): canvases = [] graphs_list = [] for group_num, list_of_address_in_short_path in enumerate(result.list_of_address_in_short_path): sc = MplCanvas(self, width=5, height=4, dpi=100) G = plot_group_route(group_num, list_of_address_in_short_path, sc.axes) canvases.append(sc) graphs_list.append(G) return graphs_list, canvases def _plot_combined_route(self, result: Result, graphs_list): sc = MplCanvas(self, width=5, height=4, dpi=100) plot_combined_route(result, graphs_list, sc.axes) return sc def _plot_group_scatter(self, result: Result): # https://www.learnpyqt.com/tutorials/plotting-matplotlib/ sc = MplCanvas(self, width=5, height=4, dpi=100) plot_group_scatter(result, sc.axes) return sc def _show_graph_tabs(self, graphs): tab_root = QTabWidget() # https://pythonspot.com/pyqt5-tabs/ for name, graph in graphs: tab_root.addTab(graph, name) layout = QHBoxLayout() layout.addWidget(tab_root) switch_layout(self._center_bar, layout)
ui_screen.box76.setPlainText(str(a[8][3])) ui_screen.box77.setPlainText(str(a[8][4])) ui_screen.box78.setPlainText(str(a[8][5])) ui_screen.box79.setPlainText(str(a[8][6])) ui_screen.box80.setPlainText(str(a[8][7])) ui_screen.box81.setPlainText(str(a[8][8])) QMessageBox.information(mainscreen, "Puzzle Solved Successfully", "Sudoku puzzle has been solved") else: QMessageBox.warning(mainscreen, 'Invalid puzzle', 'Provided sudoku puzzle is unsolvable') if __name__ == "__main__": mainscreen.show() ui_main.Start_Button.clicked.connect(shownextscreen) ui_main.Quit_Button.clicked.connect(app.exit) ui_main.About.clicked.connect(showabout) ui_screen.pushButton.clicked.connect(startsolving) ui_screen.back_button.clicked.connect(solverback) ui_screen.clear_button.clicked.connect(clear) ui_about.Back_Button.clicked.connect(aboutback) loader_img = QMovie("res/bggold.gif") ui_main.background.setMovie(loader_img) loader_img.setScaledSize(ui_main.background.size()) loader_img.start() sys.exit(app.exec_())
def __init__(self): QMainWindow.__init__(self) # super(MainWindow, self).__init__() # QApplication.processEvents() # QCoreApplication.processEvents() self.setFixedSize(1000, 500) self.setWindowTitle(" Sound Classification v3.0 ") self.setWindowIcon(QIcon("assets/icon.png")) # disable the windows title bar. #---------------------------------------------------------------------- #self.setWindowFlags(Qt.FramelessWindowHint) #self.setWindowFlags(Qt.CustomizeWindowHint) #-------------------------------------------------------------------------------------------- # This part is for the window postion. # At First geometry will be null, so by default the window appear on the center of the screen. # Next, when training window get closed the last postion will be saved and in that position # this window will appear. #-------------------------------------------------------------------------------------------- self.settings = QSettings(" ", " ") if not self.settings.value("geometry") == None: self.restoreGeometry(self.settings.value("geometry")) if not self.settings.value("windowState") == None: self.restoreState(self.settings.value("windowState")) # if background image is not available then takin color as background. #---------------------------------------------------------------------- if (os.path.exists('assets/main_background.jpg') == True): # Setting background Image. oImage = QImage("assets/main_background.jpg") sImage = oImage.scaled(QSize(1000, 500)) palette = QPalette() palette.setBrush(10, QBrush(sImage)) self.setPalette(palette) else: # Background Color. color = QColor("#3484A9") self.setAutoFillBackground(True) p = self.palette() p.setColor(self.backgroundRole(), color) self.setPalette(p) # defining all labels here. #---------------------------------------------------------------------- self.Label_sbg_title = QLabel(self) self.Label_sbg_l = QLabel(self) self.Label_sbg_l1 = QLabel(self) self.Label_sbg_l2 = QLabel(self) self.Label_sbg_l3 = QLabel(self) self.Label_sbg_l4 = QLabel(self) self.Label_sbg_l11 = QLabel(self) self.Label_sbg_l21 = QLabel(self) self.Label_sbg_l31 = QLabel(self) self.Label_sbg_l41 = QLabel(self) self.Label_sbg_x = QLabel(self) self.Label_sbg_r = QLabel(self) self.Label_sbg_r1 = QLabel(self) self.Label_sbg_r2 = QLabel(self) self.Label_copyright = QLabel(self) self.Label_predict1 = QLabel(self) self.Label_accu1 = QLabel(self) self.Label_date = QLabel(self) self.Label_avg_freq = QLabel(self) self.Label_predict11 = QLabel(self) self.Label_predict12 = QLabel(self) self.Label_predict13 = QLabel(self) self.Label_predict14 = QLabel(self) self.Label_predict15 = QLabel(self) self.button_advance = QPushButton("Go To Advance Settings", self) self.button_train = QPushButton("TRAINING", self) self.button_stop = QPushButton("STOP", self) self.button_start = QPushButton("START", self) # setting title text image here 'SOUND CLASSIFICATION'. #---------------------------------------------------------------------- if (os.path.exists('assets/title.png') == True): self.Label_title_ani = QLabel(self) self.Label_title_ani.resize(900, 150) self.Label_title_ani.move(100, 1) movie = QMovie("assets/title.png") self.Label_title_ani.setMovie(movie) movie.start() else: self.Label_title_ani = QLabel(self) self.Label_title_ani.setText("SOUND CLASSIFICATION") self.Label_title_ani.setStyleSheet( "color:#000000; font-weight:bold; font-size:50px") self.Label_title_ani.resize(900, 150) self.Label_title_ani.move(170, 1) # Defining blur label here. #---------------------------------------------------------------------- self.label_blur_img = QLabel(self) # Running the display time here. #---------------------------------------------------------------------- self.threadTimeDisplay() # calling init function here. #---------------------------------------------------------------------- self.initUI() # calling stylesheet here. #---------------------------------------------------------------------- from Gunshot_Recognition_CSS import styleSheetMain self.setStyleSheet(styleSheetMain)
class GitNote(QWidget, GitNoteUi.Ui_Form_note): def __init__(self, parent=None): super(GitNote, self).__init__(parent) self.setupUi(self) self.initUi() self.show() self.updateUiAfterShow() def initUi(self): if not main.gitExist: self.mycloneGit() # 界面配置 self.configfile = os.path.join(main.gitNoteHome, "config.json") self.initInterface() self.pushButton_update.clicked.connect(self.myupdateGit) self.treeWidget_tree.clicked.connect(self.onTreeClicked) self.treeWidget_tree.customContextMenuRequested.connect( self.menuTreeContextClicked) self.listWidget_list.clicked.connect(self.clickedListView) self.listWidget_list.customContextMenuRequested.connect( self.menuListContextClicked) #self.treeWidget_tree.addTopLevelItem(root) # set window background color self.setAutoFillBackground(True) self.listfileDir = main.gitNoteNoteHome self.viewfileName = "" self.viewTexts = "" self.plainTextEdit_markdown.hide() self.plainTextEdit_markdown.setTabStopDistance( QFontMetricsF(self.plainTextEdit_markdown.font()).width(' ') * 4) self.saveStatus = False self.createStatus = False self.pushButton_save.clicked.connect(self.clickedButtonSave) self.plainTextEdit_markdown.textChanged.connect(self.textChangedEdit) self.pushButton_save.setEnabled(False) self.updateListView(self.listfileDir) self.newDirName = "" self.pushButton_addpicture.setEnabled(False) self.pushButton_addpicture.clicked.connect(self.choosePictures) self.insertPictures = [] # 设置更新图标 icon = QIcon() icon.addPixmap( QPixmap(os.path.join(os.path.dirname(__file__), "loading.png")), QIcon.Normal, QIcon.Off) self.pushButton_update.setIcon(icon) saveicon = QIcon() saveicon.addPixmap( QPixmap(os.path.join(os.path.dirname(__file__), "edit.ico")), QIcon.Normal, QIcon.Off) self.pushButton_save.setIcon(saveicon) addpicturicon = QIcon() addpicturicon.addPixmap( QPixmap(os.path.join(os.path.dirname(__file__), "addpicture.png")), QIcon.Normal, QIcon.Off) self.pushButton_addpicture.setIcon(addpicturicon) # 保存打开时的文本 self.oldTexts = "" # 更新恢复 self.movietimer = QTimer(self) self.movietimer.start(500) self.movietimer.timeout.connect(self.movieTimeout) # 配置 configicon = QIcon() configicon.addPixmap( QPixmap(os.path.join(os.path.dirname(__file__), "config.ico")), QIcon.Normal, QIcon.Off) self.toolButton_config.setIcon(configicon) toolmenu = QMenu() toolmenu.addAction("设置字体", self.setFont) toolmenu.addAction("默认主题", self.whiteTheme) toolmenu.addAction("暗黑主题", self.blackTheme) self.toolButton_config.setMenu(toolmenu) self.toolButton_config.setPopupMode(QToolButton.MenuButtonPopup) # 转换 convertico = QIcon( os.path.join(os.path.dirname(__file__), "convert.ico")) self.toolButton_functions.setIcon(convertico) convertmenu = QMenu() convertmenu.addAction("另存为pdf文件", self.viewToPdf) self.toolButton_functions.setMenu(convertmenu) def viewToPdf(self): if not self.pushButton_save.isEnabled( ) and not self.pushButton_addpicture.isEnabled(): return filename, filetype = QFileDialog.getSaveFileName( self, "文件保存", str(pathlib.Path.home()), "PdfFiles (*.pdf)") if filename != "": if filename[-4:] != '.pdf': oldfilename = filename filename = filename + '.pdf' if os.path.exists( filename) and not os.path.exists(oldfilename): replay = QMessageBox.question( self, "文件覆盖警告", "文件" + os.path.basename(filename) + "已存在,确定覆盖?", QMessageBox.Yes, QMessageBox.No) if replay == QMessageBox.No: return markdown = mistune.Markdown() pdfkit.from_string( '<head><meta charset="UTF-8"></head>' + markdown(self.showRealPictures(self.viewTexts)), filename) #print(markdown(self.showRealPictures(self.viewTexts))) def initInterface(self): self.interfacedata = {'theme': 'white'} if not os.path.exists(self.configfile): self.whiteTheme() return with open(self.configfile, 'r') as f: self.interfacedata = json.load(f) if 'theme' in self.interfacedata and self.interfacedata[ 'theme'] == 'black': self.blackTheme() else: self.whiteTheme() if 'font' in self.interfacedata: font = QFont() font.fromString(self.interfacedata['font']) self.plainTextEdit_markdown.setFont(font) self.textEdit_show.setFont(font) def whiteTheme(self): self.dirIcon = QIcon(os.path.join(os.path.dirname(__file__), "dir.ico")) self.addTopDirs() pBack = self.palette() pBack.setColor(self.backgroundRole(), QColor(239, 235, 231)) self.setPalette(pBack) self.treeWidget_tree.setStyleSheet( 'background-color: rgb(255, 255, 255);color: rgb(0, 0, 0)') self.listWidget_list.setStyleSheet( "QListWidget{background-color: rgb(255, 255, 255);color: rgb(0, 0, 0);}" "QListWidget::item { border-bottom: 0.5px dotted black; margin-bottom:10px;}" "QListWidget::item:!selected{}" "QListWidget::item:selected:active{background:#FFFFFF;color:#19649F;border-width:-1;}" "QListWidget::item:selected{background:#FFFFFF;color:#19649F;}") self.lineEdit_title.setStyleSheet( 'background-color: rgb(255, 255, 255);color: rgb(0, 0, 0)') self.plainTextEdit_markdown.setStyleSheet( 'background-color: rgb(255, 255, 255);color: rgb(0, 0, 0)') self.textEdit_show.setStyleSheet( 'background-color: rgb(255, 255, 255);color: rgb(0, 0, 0)') if self.interfacedata['theme'] != 'white': self.interfacedata['theme'] = 'white' with open(self.configfile, 'w') as f: json.dump(self.interfacedata, f) def blackTheme(self): self.dirIcon = QIcon( os.path.join(os.path.dirname(__file__), "blackdir.ico")) self.addTopDirs() pBack = self.palette() pBack.setColor(self.backgroundRole(), QColor(51, 51, 51)) self.setPalette(pBack) self.treeWidget_tree.setStyleSheet( 'background-color: rgb(51, 51, 51);color: rgb(200, 200, 200);') self.listWidget_list.setStyleSheet( "QListWidget{background-color: rgb(37, 37, 38);color: rgb(200, 200, 200);}" "QListWidget::item { border-bottom: 0.5px dotted white; margin-bottom:10px;}" ) self.lineEdit_title.setStyleSheet( 'background-color: rgb(30, 30, 30);color: rgb(200, 200, 200)') self.plainTextEdit_markdown.setStyleSheet( 'background-color: rgb(30, 30, 30);color: rgb(200, 200, 200)') self.textEdit_show.setStyleSheet( 'background-color: rgb(30, 30, 30);color: rgb(200, 200, 200)') if self.interfacedata['theme'] != 'black': self.interfacedata['theme'] = 'black' with open(self.configfile, 'w') as f: json.dump(self.interfacedata, f) def setFont(self): font, ok = QFontDialog.getFont() if ok: self.plainTextEdit_markdown.setFont(font) self.textEdit_show.setFont(font) self.interfacedata['font'] = font.toString() with open(self.configfile, 'w') as f: json.dump(self.interfacedata, f) def movieTimeout(self): global movieStatus if movieStatus: movieStatus = False self.setUpdateBack() def closeEvent(self, event): if self.saveStatus: unsavereturn = self.saveNote(False) if not unsavereturn: replay = QMessageBox.question(self, "未保存警告", "有未保存的未命名笔记,确定退出?", QMessageBox.Yes, QMessageBox.No) if replay == QMessageBox.Yes: event.accept() return elif replay == QMessageBox.No: event.ignore() return #self.saveNote(True) event.accept() def keyPressEvent(self, event): if (event.key() == Qt.Key_O): if QApplication.keyboardModifiers() == Qt.ControlModifier: self.pushButton_save.clicked.emit() def choosePictures(self): pictures, ok = QFileDialog.getOpenFileNames( self, "选取图片", str(pathlib.Path.home()), "Picture Files (*.png | *.jpg | *.jpeg | *.gif | *.ico | *.svg)") for eachfile in pictures: basenamewith = os.path.basename(eachfile) basename, suffix = os.path.splitext(basenamewith) i = 0 while os.path.exists( os.path.join(self.showTextDir, basename + "-" + str(i) + suffix)): i = i + 1 lastbasename = basename + "-" + str(i) + suffix self.insertPictures.append(lastbasename) self.plainTextEdit_markdown.insertPlainText("\n![](" + lastbasename + ")\n") lastname = os.path.join(self.showTextDir, lastbasename) shutil.copyfile(eachfile, lastname) time.sleep(0.01) def moveDirToDir(self): dir_choose = QFileDialog.getExistingDirectory(self, "选择目标文件夹", main.gitNoteNoteHome) if self.listfileDir in dir_choose: QMessageBox.information(self, "警告", "文件夹不能移动到当前目录和子目录!", QMessageBox.Yes) return targetDir = self.getTargetName(dir_choose, os.path.basename(self.listfileDir)) if os.path.exists(self.listfileDir): shutil.move(self.listfileDir, targetDir) if self.listfileDir in self.viewfileName: self.lineEdit_title.clear() self.plainTextEdit_markdown.clear() self.textEdit_show.clear() self.listfileDir = main.gitNoteNoteHome self.addTopDirs() self.listWidget_list.clear() self.pushButton_save.setEnabled(False) def deleteDir(self): countNotes = 0 for dirpath, dirnames, filenames in os.walk(self.listfileDir): for eachone in filenames: if os.path.splitext(eachone)[1] == ".md": countNotes = countNotes + 1 replay = QMessageBox.warning( self, "警告", "文件夹 " + os.path.basename(os.path.normpath(self.listfileDir)) + "下有" + str(countNotes) + "篇笔记,您确定要删除吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if replay == QMessageBox.Yes and os.path.exists(self.listfileDir): shutil.rmtree(self.listfileDir) if self.listfileDir in self.viewfileName: self.lineEdit_title.clear() self.plainTextEdit_markdown.clear() self.textEdit_show.clear() self.listfileDir = main.gitNoteNoteHome self.addTopDirs() self.listWidget_list.clear() self.pushButton_save.setEnabled(False) def getPicturesInOneNote(self, filename): pictures = [] tmpf = open(filename, "r", encoding='UTF-8') tmpviewTexts = tmpf.read() tmpf.close() multilines = tmpviewTexts.split("\n") for eachline in multilines: if "![](" in eachline and ")" in eachline.split("![](")[1]: shotfile = (eachline.split("![](")[1]).split(")")[0] realfile = os.path.join(self.listfileDir, shotfile) if os.path.exists(realfile): pictures.append(realfile) return pictures def deleteNote(self): if not os.path.exists(self.listmenufilename): return basename = os.path.basename(self.listmenufilename) realname = os.path.splitext(basename)[0] replay = QMessageBox.warning(self, "警告", "您确定要删除笔记 " + realname + " 吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if replay == QMessageBox.Yes: # 先删除里面的图片 pictures = self.getPicturesInOneNote(self.listmenufilename) for eachpicture in pictures: os.remove(eachpicture) # 然后删除markdown文件和更新控件显示 os.remove(self.listmenufilename) self.addTopDirs() if os.path.exists(self.listfileDir): self.updateListView(self.listfileDir) if self.listmenufilename.strip() == self.viewfileName.strip(): self.clearNoteShow() self.listmenufilename = "" def createRootDir(self): newDirName, ok = QInputDialog.getText(self, "创建新文件夹", "文件夹名") if len(newDirName) > 0: newWholeDirName = os.path.join(main.gitNoteNoteHome, newDirName) if not os.path.exists(newWholeDirName): os.mkdir(newWholeDirName) self.addTopDirs() def createDir(self): newDirName, ok = QInputDialog.getText(self, "创建新文件夹", "文件夹名") if len(newDirName) > 0: newWholeDirName = os.path.join(self.listfileDir, newDirName) if not os.path.exists(newWholeDirName): os.mkdir(newWholeDirName) self.addTopDirs() def menuListContextClicked(self, pos): item = self.listWidget_list.itemAt(pos) if item: itemCount = item.text() filename = (itemCount.split("\n"))[0] #self.viewfileName = os.path.join(self.listfileDir, filename) #if self.viewfileName[-3:] != ".md": # self.viewfileName = self.viewfileName + ".md" self.listmenufilename = os.path.join(self.listfileDir, filename) if self.listmenufilename[-3:] != ".md": self.listmenufilename = self.listmenufilename + ".md" self.listmenu = QMenu() self.listmenu.addAction("删除笔记", self.deleteNote) self.listmenu.addAction("移动笔记", self.moveNoteToDir) self.listmenu.addAction("重命名笔记", self.renameNote) self.listmenu.exec_(self.listWidget_list.mapToGlobal(pos)) def clearNoteShow(self): self.pushButton_save.setEnabled(False) self.lineEdit_title.clear() self.lineEdit_title.setReadOnly(True) self.pushButton_addpicture.setEnabled(False) self.plainTextEdit_markdown.clear() self.plainTextEdit_markdown.hide() self.textEdit_show.clear() self.viewfileName = "" def renameNote(self): newname, ok = QInputDialog.getText(self, "笔记重命名", "请输入新名:") newname = newname + ".md" if ok: newfilepath = os.path.join(self.listfileDir, newname) if os.path.exists(newfilepath): QMessageBox.warning(self, "警告", "笔记已存在,请重新命名", QMessageBox.Yes, QMessageBox.Yes) return if os.path.exists(self.listmenufilename): shutil.move(self.listmenufilename, newfilepath) if self.viewfileName.strip() == self.listmenufilename.strip(): realname = os.path.splitext(newname)[0] self.lineEdit_title.setText(realname) self.viewfileName = newfilepath if os.path.exists(self.listfileDir): self.updateListView(self.listfileDir) def getTargetName(self, targetDir, basenamewith): if os.path.exists(os.path.join(targetDir, basenamewith)): basename, suffix = os.path.splitext(basenamewith) i = 0 while os.path.exists( os.path.join(targetDir, basename + "-" + str(i) + suffix)): i = i + 1 basenamewith = basename + "-" + str(i) + suffix return os.path.join(targetDir, basenamewith) def replacePictureName(self, viewTexts, basename, newbasename): multilines = viewTexts.split("\n") newViewTexts = "" for eachline in multilines: if "![](" in eachline and ")" in eachline.split("![](")[1] and ( eachline.split("![](")[1]).split(")")[0] == basename: newViewTexts = newViewTexts + "![](" + newbasename + ")\n" else: newViewTexts = newViewTexts + eachline + "\n" return newViewTexts def moveNoteToDir(self): dir_choose = QFileDialog.getExistingDirectory(self, "选择目标文件夹", main.gitNoteNoteHome) if main.gitNoteNoteHome in dir_choose and os.path.dirname( self.listmenufilename) != dir_choose: # 移动图片 tmpf = open(self.listmenufilename, "r", encoding='UTF-8') tmpviewTexts = tmpf.read() tmpf.close() pictures = self.getPicturesInOneNote(self.listmenufilename) for eachpicture in pictures: basename = os.path.basename(eachpicture) targetfilename = self.getTargetName(dir_choose, basename) if os.path.exists(eachpicture): shutil.move(eachpicture, targetfilename) newbasename = os.path.basename(targetfilename) tmpviewTexts = self.replacePictureName(tmpviewTexts, basename, newbasename) tmpf = open(self.listmenufilename, "w", encoding='UTF-8') tmpf.write(tmpviewTexts) tmpf.close() # 移动日记文件 basename = os.path.basename(self.listmenufilename) targetfilename = self.getTargetName(dir_choose, basename) if os.path.exists(self.listmenufilename): shutil.move(self.listmenufilename, targetfilename) if self.viewfileName.strip() == self.listmenufilename.strip(): self.viewfileName = "" self.clearNoteShow() self.addTopDirs() if os.path.exists(self.listfileDir): self.updateListView(self.listfileDir) def renameDir(self): newname, ok = QInputDialog.getText(self, "笔记重命名", "请输入新名:") if ok: if self.listfileDir[-1] == '/' or self.listfileDir[-1] == '\\': self.listfileDir = self.listfileDir[:-1] newDir = os.path.join(os.path.dirname(self.listfileDir), newname) if os.path.exists(newDir): QMessageBox.warning(self, "警告", "文件夹已存在,请重新命名", QMessageBox.Yes, QMessageBox.Yes) return else: shutil.move(self.listfileDir, newDir) self.listfileDir = newDir self.addTopDirs() self.updateListView(self.listfileDir) self.clearNoteShow() def menuTreeContextClicked(self, pos): item = self.treeWidget_tree.itemAt(pos) if item: self.listfileDir = item.text(1) self.updateListView(self.listfileDir) self.treemenu = QMenu() self.treemenu.addAction("新建笔记", self.createNote) self.treemenu.addAction("新建日记", self.createDiaryNote) self.treemenu.addAction("新建文件夹", self.createDir) self.treemenu.addAction("删除文件夹", self.deleteDir) self.treemenu.addAction("移动文件夹", self.moveDirToDir) self.treemenu.addAction("重命名文件夹", self.renameDir) self.treemenu.exec_(self.treeWidget_tree.mapToGlobal(pos)) else: self.listfileDir = main.gitNoteNoteHome self.treerootmenu = QMenu() self.treerootmenu.addAction("新建Root文件夹", self.createRootDir) self.treerootmenu.exec_(self.treeWidget_tree.mapToGlobal(pos)) def createNote(self): self.insertPictures = [] if self.saveStatus: self.saveNote(True) self.saveStatus = True saveicon = QIcon() saveicon.addPixmap( QPixmap(os.path.join(os.path.dirname(__file__), "save.ico")), QIcon.Normal, QIcon.Off) self.pushButton_save.setIcon(saveicon) self.pushButton_save.setEnabled(True) self.pushButton_addpicture.setEnabled(True) self.createStatus = True self.lineEdit_title.setReadOnly(False) self.lineEdit_title.clear() self.plainTextEdit_markdown.clear() self.plainTextEdit_markdown.show() self.textEdit_show.clear() self.lineEdit_title.setFocus() self.oldTexts = "" self.showTextDir = self.listfileDir def createDiaryNote(self): today = str(time.strftime("%Y-%m-%d", time.localtime())) self.createNote() self.lineEdit_title.setText(today) self.plainTextEdit_markdown.setFocus() def clickedListView(self, qmodelindex): item = self.listWidget_list.currentItem() if not item: return if self.saveStatus or self.createStatus: self.saveNote(True) itemCount = item.text() filename = (itemCount.split("\n"))[0] self.pushButton_save.setEnabled(True) self.viewfileName = os.path.join(self.listfileDir, filename) if self.viewfileName[-3:] != ".md": self.viewfileName = self.viewfileName + ".md" self.lineEdit_title.setText(filename) tmpf = open(self.viewfileName, "r", encoding='UTF-8') self.viewTexts = tmpf.read() tmpf.close() self.showTextDir = self.listfileDir #self.textEdit_show.setText(markdown2.markdown(self.showRealPictures(self.viewTexts))) #self.textEdit_show.setHtml(markdown2.markdown(self.showRealPictures(self.viewTexts))) markdown = mistune.Markdown() markdownTxt = markdown(self.showRealPictures(self.viewTexts)) markdownTxt = markdownTxt.replace("\n<", "$&$&$&").strip() markdownTxt = markdownTxt.replace("\n", r"<br>") markdownTxt = markdownTxt.replace("$&$&$&", "\n<") if self.interfacedata['theme'] == 'black': markdownTxt = markdownTxt.replace( "<code>", r'<code style="color:rgb(0,215,215)">') else: markdownTxt = markdownTxt.replace( "<code>", r'<code style="color:rgb(0,0,255)">') self.textEdit_show.setHtml(markdownTxt) self.textEdit_show.moveCursor(QTextCursor.Start) def showRealPictures(self, inputtext): multilines = inputtext.split("\n") realtext = "" for eachline in multilines: if "![](" in eachline and ")" in eachline.split("![](")[1]: shotfile = (eachline.split("![](")[1]).split(")")[0] realfile = os.path.join(self.showTextDir, shotfile) #realtext = realtext + "![](" + realfile + ")\n" realtext = realtext + '<img src="' + realfile + '" />\n' else: realtext = realtext + eachline + "\n" return realtext def textChangedEdit(self): self.viewTexts = self.plainTextEdit_markdown.toPlainText() #therealmd = self.showRealPictures(self.viewTexts) #self.textEdit_show.clear() #self.textEdit_show.setText(markdown2.markdown(therealmd)) #self.textEdit_show.setHtml(markdown2.markdown(therealmd)) #renderer = HighlightRenderer() #markdown = mistune.Markdown(renderer=renderer) markdown = mistune.Markdown() markdownTxt = markdown(self.showRealPictures(self.viewTexts)) markdownTxt = markdownTxt.replace("\n<", "$&$&$&").strip() markdownTxt = markdownTxt.replace("\n", r"<br>") markdownTxt = markdownTxt.replace("$&$&$&", "\n<") if self.interfacedata['theme'] == 'black': markdownTxt = markdownTxt.replace( "<code>", r'<code style="color:rgb(0,215,215)">') else: markdownTxt = markdownTxt.replace( "<code>", r'<code style="color:rgb(0,0,255)">') self.textEdit_show.setHtml(markdownTxt) #markdown = mistune.Markdown() #self.textEdit_show.setHtml(markdown(self.showRealPictures(self.viewTexts))) self.textEdit_show.moveCursor(QTextCursor.End) def clickedButtonSave(self): if not self.saveStatus: # 编辑 if len(self.viewfileName) > 1: # 更新已有的图片 self.insertPictures = [] multilines = self.viewTexts.split("\n") for eachline in multilines: if "![](" in eachline and ")" in eachline.split("![](")[1]: shotfile = (eachline.split("![](")[1]).split(")")[0] self.insertPictures.append(shotfile) self.saveStatus = True self.plainTextEdit_markdown.setPlainText(self.viewTexts) self.plainTextEdit_markdown.show() saveicon = QIcon() saveicon.addPixmap( QPixmap(os.path.join(os.path.dirname(__file__), "save.ico")), QIcon.Normal, QIcon.Off) self.pushButton_save.setIcon(saveicon) self.pushButton_addpicture.setEnabled(True) self.oldTexts = self.viewTexts else: #保存 self.pushButton_addpicture.setEnabled(False) self.saveNote(True) self.textEdit_show.moveCursor(QTextCursor.Start) def saveNote(self, checkwarning): if len(self.lineEdit_title.text()) < 1: if checkwarning: QMessageBox.information(self, "警告", "请输入记录名!", QMessageBox.Yes) return False if self.createStatus: self.viewfileName = os.path.join( self.showTextDir, self.lineEdit_title.text().strip()) self.lineEdit_title.setReadOnly(True) if self.viewfileName[-3:] != ".md": self.viewfileName = self.viewfileName + ".md" self.saveStatus = False self.plainTextEdit_markdown.hide() saveicon = QIcon() saveicon.addPixmap( QPixmap(os.path.join(os.path.dirname(__file__), "edit.ico")), QIcon.Normal, QIcon.Off) self.pushButton_save.setIcon(saveicon) self.lineEdit_title.setReadOnly(True) if len(self.viewfileName) > 1: if not self.createStatus and self.oldTexts == self.viewTexts: return True tmpf = open(self.viewfileName, "w", encoding='UTF-8') tmpf.write(self.viewTexts) tmpf.close() self.updateListView(self.listfileDir) #pictures for eachpicture in self.insertPictures: if eachpicture not in self.viewTexts and os.path.exists( os.path.join(self.listfileDir, eachpicture)): os.remove(os.path.join(self.listfileDir, eachpicture)) #self.treeWidget_tree.clear() #self.updateTreeItemName() if self.createStatus: self.createStatus = False self.addTopDirs() return True def updateUiAfterShow(self): self.treeWidget_tree.setColumnWidth(0, 100) def mycloneGit(self): if not main.gitExist: self.movie = QMovie( os.path.join(os.path.dirname(__file__), "loading.gif"), QByteArray(), self) self.movie.frameChanged.connect(self.setButtonIcon) self.movie.start() main.updateStatus = True self.cloneThread = CloneThread() self.cloneThread.start() def myupdateGit(self): if main.updateStatus: return else: main.updateStatus = True self.setUpdateStatus() self.updateThread = UpdateThread() self.updateThread.start() def setUpdateBack(self): self.movie = None icon = QIcon() icon.addPixmap( QPixmap(os.path.join(os.path.dirname(__file__), "loading.png")), QIcon.Normal, QIcon.Off) self.pushButton_update.setIcon(icon) self.addTopDirs() self.treeWidget_tree.expandAll() main.updateStatus = False #self.pushButton_update.setText("更新") def setButtonIcon(self): if self.movie: self.pushButton_update.setIcon(QIcon(self.movie.currentPixmap())) def setUpdateStatus(self): self.movie = QMovie( os.path.join(os.path.dirname(__file__), "loading.gif"), QByteArray(), self) self.movie.frameChanged.connect(self.setButtonIcon) self.movie.start() #self.pushButton_update.setText("更新中") def addTopDirs(self): self.treeWidget_tree.clear() files = os.listdir(main.gitNoteNoteHome) for eachone in files: eachone_d = os.path.join(main.gitNoteNoteHome, eachone) if os.path.isdir(eachone_d) and eachone[0] != '.': item = QTreeWidgetItem(self.treeWidget_tree) countMd = self.countMdFiles(eachone_d) dirName = eachone if countMd > 0: dirName = eachone + " (" + str(countMd) + ")" item.setText(0, dirName) item.setText(1, eachone_d) item.setIcon(0, self.dirIcon) self.showDirs(eachone_d, item) self.treeWidget_tree.expandAll() def showDirs(self, filepath, item): files = os.listdir(filepath) for eachone in files: eachone_d = os.path.join(filepath, eachone) if os.path.isdir(eachone_d) and eachone[0] != '.': childitem = QTreeWidgetItem(item) countMd = self.countMdFiles(eachone_d) dirName = eachone if countMd > 0: dirName = eachone + " (" + str(countMd) + ")" childitem.setText(0, dirName) childitem.setText(1, eachone_d) childitem.setIcon(0, self.dirIcon) self.showDirs(eachone_d, childitem) def updateTreeItemName(self): baseName = self.treeItem.text(0).split('(')[0] countMd = self.countMdFiles(self.treeItem.text(1)) dirName = baseName if countMd > 0: dirName = dirName + " (" + str(countMd) + ")" self.treeItem.setText(0, dirName) def countMdFiles(self, filepath): files = os.listdir(filepath) number = 0 for eachone in files: eachone_d = os.path.join(filepath, eachone) if not os.path.isdir(eachone_d) and eachone_d[-3:] == ".md": number = number + 1 return number def onTreeClicked(self, qmodelindex): self.treeItem = self.treeWidget_tree.currentItem() if self.treeItem.text(1) != self.listfileDir: self.listfileDir = self.treeItem.text(1) self.updateListView(self.listfileDir) def updateListView(self, fileDir): self.listWidget_list.clear() if fileDir == main.gitNoteNoteHome: return self.fileList = self.traverseDir(fileDir) for eachone in self.fileList: tmpitem = QListWidgetItem(eachone[0]) #if len(eachone[2]) > 1: # tmpitem.setIcon(QIcon(eachone[2])) #tmpitem.setTextAlignment(Qt.AlignLeft) #tmpitem.setSizeHint(QSize(150, 100)) self.listWidget_list.addItem(tmpitem) def traverseDir(self, filepath): files = os.listdir(filepath) fileList = [] for eachone in files: eachone_d = os.path.join(filepath, eachone) if not os.path.isdir(eachone_d) and eachone_d[-3:] == ".md": tmpfileinfo = [] tmpfileinfo.append(eachone[:-3] + "\n" + self.read20words(eachone_d)) tmpfileinfo.append(os.path.getmtime(eachone_d)) #tmpfileinfo.append(self.addPictureToList(eachone_d)) fileList.append(tmpfileinfo) if len(fileList) > 1: fileList.sort(key=operator.itemgetter(1), reverse=True) return fileList def addPictureToList(self, filepath): returnStr = " " readHandle = open(filepath, "r", encoding='UTF-8') while True: oneline = readHandle.readline() if oneline: if "![](" in oneline and ")" in oneline.split("![](")[1]: shotfile = (oneline.split("![](")[1]).split(")")[0] realfile = os.path.join(self.listfileDir, shotfile) if os.path.exists(realfile): returnStr = realfile else: break readHandle.close() return returnStr def read20words(self, filepath): returnStr = "" readHandle = open(filepath, "r", encoding='UTF-8') while True: oneline = readHandle.readline() returnStr = returnStr + oneline.strip() if oneline and len(returnStr) < 20: oneline = readHandle.readline() returnStr = returnStr + oneline.strip() else: break readHandle.close() if len(returnStr) > 10: returnStr = returnStr[:10] + "\n" + returnStr[10:] returnStr = returnStr + "\n" + self.timeStampToTime( os.path.getmtime(filepath)) return returnStr def timeStampToTime(self, timestamp): timeStruct = time.localtime(timestamp) return time.strftime("%Y-%m-%d %H:%M:%S", timeStruct)
class SystemTrayIcon(QMainWindow): def __init__(self, parent=None): super(SystemTrayIcon, self).__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.settings = QSettings() self.language = self.settings.value('Language') or '' self.temp_decimal_bool = self.settings.value('Decimal') or False # initialize the tray icon type in case of first run: issue#42 self.tray_type = self.settings.value('TrayType') or 'icon&temp' cond = conditions.WeatherConditions() self.temporary_city_status = False self.conditions = cond.trans self.clouds = cond.clouds self.wind = cond.wind self.wind_dir = cond.wind_direction self.wind_codes = cond.wind_codes self.inerror = False self.tentatives = 0 self.baseurl = 'http://api.openweathermap.org/data/2.5/weather?id=' self.accurate_url = 'http://api.openweathermap.org/data/2.5/find?q=' self.forecast_url = ('http://api.openweathermap.org/data/2.5/forecast/' 'daily?id=') self.day_forecast_url = ('http://api.openweathermap.org/data/2.5/' 'forecast?id=') self.wIconUrl = 'http://openweathermap.org/img/w/' apikey = self.settings.value('APPID') or '' self.appid = '&APPID=' + apikey self.forecast_icon_url = self.wIconUrl self.timer = QTimer(self) self.timer.timeout.connect(self.refresh) self.menu = QMenu() self.citiesMenu = QMenu(self.tr('Cities')) self.tempCityAction = QAction(self.tr('&Temporary city'), self) self.refreshAction = QAction(self.tr('&Update'), self) self.settingsAction = QAction(self.tr('&Settings'), self) self.aboutAction = QAction(self.tr('&About'), self) self.exitAction = QAction(self.tr('Exit'), self) self.exitAction.setIcon(QIcon(':/exit')) self.aboutAction.setIcon(QIcon(':/info')) self.refreshAction.setIcon(QIcon(':/refresh')) self.settingsAction.setIcon(QIcon(':/configure')) self.tempCityAction.setIcon(QIcon(':/tempcity')) self.citiesMenu.setIcon(QIcon(':/bookmarks')) self.menu.addAction(self.settingsAction) self.menu.addAction(self.refreshAction) self.menu.addMenu(self.citiesMenu) self.menu.addAction(self.tempCityAction) self.menu.addAction(self.aboutAction) self.menu.addAction(self.exitAction) self.settingsAction.triggered.connect(self.config) self.exitAction.triggered.connect(qApp.quit) self.refreshAction.triggered.connect(self.manual_refresh) self.aboutAction.triggered.connect(self.about) self.tempCityAction.triggered.connect(self.tempcity) self.systray = QSystemTrayIcon() self.systray.setContextMenu(self.menu) self.systray.activated.connect(self.activate) self.systray.setIcon(QIcon(':/noicon')) self.systray.setToolTip(self.tr('Searching weather data...')) self.notification = '' self.notification_temp = 0 self.notifications_id = '' self.systray.show() # The dictionnary has to be intialized here. If there is an error # the program couldn't become functionnal if the dictionnary is # reinitialized in the weatherdata method self.weatherDataDico = {} # The traycolor has to be initialized here for the case when we cannot # reach the tray method (case: set the color at first time usage) self.traycolor = '' self.refresh() def icon_loading(self): self.gif_loading = QMovie(":/loading") self.gif_loading.frameChanged.connect(self.update_gif) self.gif_loading.start() def update_gif(self): gif_frame = self.gif_loading.currentPixmap() self.systray.setIcon(QIcon(gif_frame)) def manual_refresh(self): self.tentatives = 0 self.refresh() def cities_menu(self): # Don't add the temporary city in the list if self.temporary_city_status: return self.citiesMenu.clear() cities = self.settings.value('CityList') or [] if type(cities) is str: cities = eval(cities) try: current_city = (self.settings.value('City') + '_' + self.settings.value('Country') + '_' + self.settings.value('ID')) except: # firsttime run,if clic cancel in setings without any city configured pass # Prevent duplicate entries try: city_toadd = cities.pop(cities.index(current_city)) except: city_toadd = current_city finally: cities.insert(0, city_toadd) # If we delete all cities it results to a '__' if (cities is not None and cities != '' and cities != '[]' and cities != ['__']): if type(cities) is not list: # FIXME sometimes the list of cities is read as a string (?) # eval to a list cities = eval(cities) # Create the cities list menu for city in cities: action = QAction(city, self) action.triggered.connect(partial(self.changecity, city)) self.citiesMenu.addAction(action) else: self.empty_cities_list() @pyqtSlot(str) def changecity(self, city): cities_list = self.settings.value('CityList') logging.debug('Cities' + str(cities_list)) if cities_list is None: self.empty_cities_list() if type(cities_list) is not list: # FIXME some times is read as string (?) cities_list = eval(cities_list) prev_city = (self.settings.value('City') + '_' + self.settings.value('Country') + '_' + self.settings.value('ID')) citytoset = '' # Set the chosen city as the default for town in cities_list: if town == city: ind = cities_list.index(town) citytoset = cities_list[ind] citytosetlist = citytoset.split('_') self.settings.setValue('City', citytosetlist[0]) self.settings.setValue('Country', citytosetlist[1]) self.settings.setValue('ID', citytosetlist[2]) if prev_city not in cities_list: cities_list.append(prev_city) self.settings.setValue('CityList', cities_list) logging.debug(cities_list) self.refresh() def empty_cities_list(self): self.citiesMenu.addAction(self.tr('Empty list')) def refresh(self): self.inerror = False self.window_visible = False self.systray.setIcon(QIcon(':/noicon')) if hasattr(self, 'overviewcity'): # if visible, it has to ...remain visible # (try reason) Prevent C++ wrapper error try: if not self.overviewcity.isVisible(): # kills the reference to overviewcity # in order to be refreshed self.overviewcity.close() del self.overviewcity else: self.overviewcity.close() self.window_visible = True except: pass self.systray.setToolTip(self.tr('Fetching weather data ...')) self.city = self.settings.value('City') or '' self.id_ = self.settings.value('ID') or None if self.id_ is None: # Clear the menu, no cities configured self.citiesMenu.clear() self.empty_cities_list() # Sometimes self.overviewcity is in namespace but deleted try: self.overviewcity.close() except: e = sys.exc_info()[0] logging.error('Error closing overviewcity: ' + str(e)) pass self.timer.singleShot(2000, self.firsttime) self.id_ = '' self.systray.setToolTip(self.tr('No city configured')) return # A city has been found, create the cities menu now self.cities_menu() self.country = self.settings.value('Country') or '' self.unit = self.settings.value('Unit') or 'metric' self.suffix = ('&mode=xml&units=' + self.unit + self.appid) self.interval = int(self.settings.value('Interval') or 30)*60*1000 self.timer.start(self.interval) self.update() def firsttime(self): self.temp = '' self.wIcon = QPixmap(':/noicon') self.systray.showMessage( 'meteo-qt:\n', self.tr('No city has been configured yet.') + '\n' + self.tr('Right click on the icon and click on Settings.')) def update(self): if hasattr(self, 'downloadThread'): if self.downloadThread.isRunning(): logging.debug('remaining thread...') return logging.debug('Update...') self.icon_loading() self.wIcon = QPixmap(':/noicon') self.downloadThread = Download( self.wIconUrl, self.baseurl, self.forecast_url, self.day_forecast_url, self.id_, self.suffix) self.downloadThread.wimage['PyQt_PyObject'].connect(self.makeicon) self.downloadThread.finished.connect(self.tray) self.downloadThread.xmlpage['PyQt_PyObject'].connect(self.weatherdata) self.downloadThread.forecast_rawpage.connect(self.forecast) self.downloadThread.day_forecast_rawpage.connect(self.dayforecast) self.downloadThread.uv_signal.connect(self.uv) self.downloadThread.error.connect(self.error) self.downloadThread.done.connect(self.done, Qt.QueuedConnection) self.downloadThread.start() def uv(self, value): self.uv_coord = value def forecast(self, data): self.forecast_data = data def dayforecast(self, data): self.dayforecast_data = data def instance_overviewcity(self): try: self.inerror = False if hasattr(self, 'overviewcity'): logging.debug('Deleting overviewcity instance...') del self.overviewcity self.overviewcity = overview.OverviewCity( self.weatherDataDico, self.wIcon, self.forecast_data, self.dayforecast_data, self.unit, self.forecast_icon_url, self.uv_coord, self) self.overviewcity.closed_status_dialogue.connect(self.remove_object) except: self.inerror = True e = sys.exc_info()[0] logging.error('Error: ' + str(e)) logging.debug('Try to create the city overview...\nAttempts: ' + str(self.tentatives)) return 'error' def remove_object(self): del self.overviewcity def done(self, done): if done == 0: self.inerror = False elif done == 1: self.inerror = True logging.debug('Trying to retrieve data ...') self.timer.singleShot(10000, self.try_again) return if hasattr(self, 'updateicon'): # Keep a reference of the image to update the icon in overview self.wIcon = self.updateicon if hasattr(self, 'forecast_data'): if hasattr(self, 'overviewcity'): # Update also the overview dialog if open if self.overviewcity.isVisible(): # delete dialog to prevent memory leak self.overviewcity.close() self.instance_overviewcity() self.overview() elif self.window_visible is True: self.instance_overviewcity() self.overview() else: self.inerror = True self.try_create_overview() else: self.try_again() def try_create_overview(self): logging.debug('Tries to create overview :' + str(self.tentatives)) instance = self.instance_overviewcity() if instance == 'error': self.inerror = True self.refresh() else: self.tentatives = 0 self.inerror = False self.tooltip_weather() def try_again(self): self.nodata_message() logging.debug('Attempts: ' + str(self.tentatives)) self.tentatives += 1 self.timer.singleShot(5000, self.refresh) def nodata_message(self): nodata = QCoreApplication.translate( "Tray icon", "Searching for weather data...", "Tooltip (when mouse over the icon") self.systray.setToolTip(nodata) self.notification = nodata def error(self, error): logging.error('Error:\n' + str(error)) self.nodata_message() self.timer.start(self.interval) self.inerror = True def makeicon(self, data): image = QImage() image.loadFromData(data) self.wIcon = QPixmap(image) # Keep a reference of the image to update the icon in overview self.updateicon = self.wIcon def weatherdata(self, tree): if self.inerror: return self.tempFloat = tree[1].get('value') self.temp = ' ' + str(round(float(self.tempFloat))) + '°' self.temp_decimal = '{0:.1f}'.format(float(self.tempFloat)) + '°' self.meteo = tree[8].get('value') meteo_condition = tree[8].get('number') try: self.meteo = self.conditions[meteo_condition] except: logging.debug('Cannot find localisation string for' 'meteo_condition:' + str(meteo_condition)) pass clouds = tree[5].get('name') clouds_percent = tree[5].get('value') + '%' try: clouds = self.clouds[clouds] clouds = self.conditions[clouds] except: logging.debug('Cannot find localisation string for clouds:' + str(clouds)) pass wind = tree[4][0].get('name').lower() try: wind = self.wind[wind] wind = self.conditions[wind] except: logging.debug('Cannot find localisation string for wind:' + str(wind)) pass wind_codes = tree[4][2].get('code') try: wind_codes = self.wind_codes[wind_codes] except: logging.debug('Cannot find localisation string for wind_codes:' + str(wind_codes)) pass wind_dir = tree[4][2].get('name') try: wind_dir = self.wind_dir[tree[4][2].get('code')] except: logging.debug('Cannot find localisation string for wind_dir:' + str(wind_dir)) pass self.city_weather_info = (self.city + ' ' + self.country + ' ' + self.temp_decimal + ' ' + self.meteo) self.tooltip_weather() self.notification = self.city_weather_info self.weatherDataDico['City'] = self.city self.weatherDataDico['Country'] = self.country self.weatherDataDico['Temp'] = self.tempFloat + '°' self.weatherDataDico['Meteo'] = self.meteo self.weatherDataDico['Humidity'] = (tree[2].get('value'), tree[2].get('unit')) self.weatherDataDico['Wind'] = ( tree[4][0].get('value'), wind, str(int(float(tree[4][2].get('value')))), wind_codes, wind_dir) self.weatherDataDico['Clouds'] = (clouds_percent + ' ' + clouds) self.weatherDataDico['Pressure'] = (tree[3].get('value'), tree[3].get('unit')) self.weatherDataDico['Humidity'] = (tree[2].get('value'), tree[2].get('unit')) self.weatherDataDico['Sunrise'] = tree[0][2].get('rise') self.weatherDataDico['Sunset'] = tree[0][2].get('set') rain_value = tree[7].get('value') if rain_value == None: rain_value = '' self.weatherDataDico['Precipitation'] = (tree[7].get('mode'), rain_value) def tooltip_weather(self): self.systray.setToolTip(self.city_weather_info) def tray(self): temp_decimal = eval(self.settings.value('Decimal') or 'False') try: if temp_decimal: temp_tray = self.temp_decimal else: temp_tray = self.temp except: # First time launch return if self.inerror or not hasattr(self, 'temp'): logging.critical('Cannot paint icon!') if hasattr(self, 'overviewcity'): try: # delete dialog to prevent memory leak self.overviewcity.close() except: pass return try: self.gif_loading.stop() except: # In first time run the gif is not animated pass logging.debug('Paint tray icon...') # Place empty.png here to initialize the icon # don't paint the T° over the old value icon = QPixmap(':/empty') self.traycolor = self.settings.value('TrayColor') or '' self.fontsize = self.settings.value('FontSize') or '18' self.tray_type = self.settings.value('TrayType') or 'icon&temp' pt = QPainter() pt.begin(icon) if self.tray_type != 'temp': pt.drawPixmap(0, -12, 64, 64, self.wIcon) pt.setFont(QFont('sans-sertif', int(self.fontsize))) pt.setPen(QColor(self.traycolor)) if self.tray_type == 'icon&temp': pt.drawText(icon.rect(), Qt.AlignBottom | Qt.AlignCenter, str(temp_tray)) if self.tray_type == 'temp': pt.drawText(icon.rect(), Qt.AlignCenter, str(temp_tray)) pt.end() if self.tray_type == 'icon': self.systray.setIcon(QIcon(self.wIcon)) else: self.systray.setIcon(QIcon(icon)) try: if not self.overviewcity.isVisible(): notifier = self.settings.value('Notifications') or 'True' notifier = eval(notifier) if notifier: temp = int(re.search('\d+', self.temp_decimal).group()) if temp != self.notification_temp or self.id_ != self.notifications_id: self.notifications_id = self.id_ self.notification_temp = temp self.systray.showMessage('meteo-qt', self.notification) except: logging.debug('OverviewCity has been deleted' + 'Download weather information again...') self.try_again() return self.restore_city() self.tentatives = 0 self.tooltip_weather() logging.info('Actual weather status for: ' + self.notification) def restore_city(self): if self.temporary_city_status: logging.debug('Restore the default settings (city)' + 'Forget the temporary city...') for e in ('ID', self.id_2), ('City', self.city2), ('Country', self.country2): self.citydata(e) self.temporary_city_status = False def activate(self, reason): if reason == 3: if self.inerror or self.id_ is None or self.id_ == '': return try: if hasattr(self, 'overviewcity') and self.overviewcity.isVisible(): self.overviewcity.hide() else: self.overviewcity.hide() # If dialog closed by the "X" self.done(0) self.overview() except: self.done(0) self.overview() elif reason == 1: self.menu.popup(QCursor.pos()) def overview(self): if self.inerror or len(self.weatherDataDico) == 0: return self.overviewcity.show() def config_save(self): logging.debug('Config saving...') city = self.settings.value('City'), id_ = self.settings.value('ID') country = self.settings.value('Country') unit = self.settings.value('Unit') traycolor = self.settings.value('TrayColor') tray_type = self.settings.value('TrayType') fontsize = self.settings.value('FontSize') language = self.settings.value('Language') decimal = self.settings.value('Decimal') self.appid = '&APPID=' + self.settings.value('APPID') or '' if language != self.language and language is not None: self.systray.showMessage('meteo-qt:',QCoreApplication.translate( "System tray notification", "The application has to be restarted to apply the language setting", '')) self.language = language # Check if update is needed if traycolor is None: traycolor = '' if (self.traycolor != traycolor or self.tray_type != tray_type or self.fontsize != fontsize or decimal != self.temp_decimal): self.tray() if (city[0] == self.city and id_ == self.id_ and country == self.country and unit == self.unit): return else: logging.debug('Apply changes from settings...') self.refresh() def config(self): dialog = settings.MeteoSettings(self.accurate_url, self.appid, self) dialog.applied_signal.connect(self.config_save) if dialog.exec_() == 1: self.config_save() logging.debug('Update Cities menu...') self.cities_menu() def tempcity(self): # Prevent to register a temporary city # This happen when a temporary city is still loading self.restore_city() dialog = searchcity.SearchCity(self.accurate_url, self.appid, self) self.id_2, self.city2, self.country2 = (self.settings.value('ID'), self.settings.value('City'), self.settings.value('Country')) dialog.id_signal[tuple].connect(self.citydata) dialog.city_signal[tuple].connect(self.citydata) dialog.country_signal[tuple].connect(self.citydata) if dialog.exec_(): self.temporary_city_status = True self.systray.setToolTip(self.tr('Fetching weather data...')) self.refresh() def citydata(self, what): self.settings.setValue(what[0], what[1]) logging.debug('write ' + str(what[0]) + ' ' + str(what[1])) def about(self): title = self.tr("""<b>meteo-qt</b> v{0} <br/>License: GPLv3 <br/>Python {1} - Qt {2} - PyQt {3} on {4}""").format( __version__, platform.python_version(), QT_VERSION_STR, PYQT_VERSION_STR, platform.system()) image = ':/logo' text = self.tr("""<p>Author: Dimitrios Glentadakis <a href="mailto:[email protected]">[email protected]</a> <p>A simple application showing the weather status information on the system tray. <p>Website: <a href="https://github.com/dglent/meteo-qt"> https://github.com/dglent/meteo-qt</a> <br/>Data source: <a href="http://openweathermap.org/"> OpenWeatherMap</a>. <br/>This software uses icons from the <a href="http://www.kde.org/">Oxygen Project</a>. <p>To translate meteo-qt in your language or contribute to current translations, you can use the <a href="https://www.transifex.com/projects/p/meteo-qt/"> Transifex</a> platform. <p>If you want to report a dysfunction or a suggestion, feel free to open an issue in <a href="https://github.com/dglent/meteo-qt/issues"> github</a>.""") contributors = QCoreApplication.translate("About dialog", """ Pavel Fric<br/> [cs] Czech translation <p>Jürgen <a href="mailto:[email protected]">[email protected]</a><br/> [de] German translation <p>Peter Mattern <a href="mailto:[email protected]">[email protected]</a><br/> [de] German translation, Project <p>Dimitrios Glentadakis <a href="mailto:[email protected]">[email protected]</a><br/> [el] Greek translation <p>Ozkar L. Garcell <a href="mailto:[email protected]">[email protected]</a><br/> [es] Spanish translation <p>Laurene Albrand <a href="mailto:[email protected]">[email protected]</a><br/> [fr] French translation <p>Rémi Verschelde <a href="mailto:[email protected]">[email protected]</a><br/> [fr] French translation, Project <p>Daniel Napora <a href="mailto:[email protected]">[email protected]</a><br/> Tomasz Przybył <a href="mailto:[email protected]">[email protected]</a><br/> [pl] Polish translation <p>Artem Vorotnikov <a href="mailto:[email protected]">[email protected]</a><br/> [ru] Russian translation <p>Atilla Öntaş <a href="mailto:[email protected]">[email protected]</a><br/> [tr] Turkish translation <p>Yuri Chornoivan <a href="mailto:[email protected]">[email protected]</a><br/> [uk] Ukrainian translation <p>You-Cheng Hsieh <a href="mailto:[email protected]">[email protected]</a><br/> [zh_TW] Chinese (Taiwan) translation <p>pmav99<br/> Project""", "List of contributors") dialog = about_dlg.AboutDialog(title, text, image, contributors, self) dialog.exec_()
class FileViewWindow(QMainWindow): def __init__(self, controller: 'Controller') -> None: super().__init__() self._message_area: Optional[MessageArea] = None self.controller = controller self.actions = self.controller.actions self.make_window() self.make_menubar() self.make_toolbar() self.addToolBarBreak() self.make_location_toolbar() self.make_filter_toolbar() self.make_search_toolbar() self.make_shortcut() self.file_view.setFocus() self.resize(1024, 768) self.move(QCursor.pos().x() - self.width() / 2, QCursor.pos().y() - self.height() / 2) self.addAction(self.actions.rename) def closeEvent(self, ev): self.controller.on_exit() def make_shortcut(self): shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_L), self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(self.controller.show_location_toolbar) def show_filter(): self.file_filter.setFocus(Qt.ShortcutFocusReason) self.filter_toolbar.show() shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_K), self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(show_filter) shortcut = QShortcut(QKeySequence(Qt.Key_F3), self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(self.controller.show_search) shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_F), self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(self.controller.show_search) shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_W), self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(self.controller.close_window) shortcut = QShortcut(QKeySequence(Qt.ALT + Qt.Key_Up), self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(self.controller.parent_directory) shortcut = QShortcut(Qt.Key_Home, self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(lambda: self.file_view.ensureVisible(0, 0, 1, 1)) shortcut = QShortcut(Qt.Key_End, self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect( lambda: self.file_view.ensureVisible( 0, self.file_view._layout.get_bounding_rect().height(), 1, 1)) shortcut = QShortcut(Qt.Key_PageUp, self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(lambda: self.file_view.scroll_by(0, -self.file_view.viewport().height())) shortcut = QShortcut(Qt.Key_PageDown, self) shortcut.setContext(Qt.WindowShortcut) shortcut.activated.connect(lambda: self.file_view.scroll_by(0, self.file_view.viewport().height())) def make_window(self): self.setWindowTitle("dt-fileview") self.setWindowIcon(QIcon(resource_filename("dirtools", "fileview/dt-fileview.svg"))) self.vbox = QVBoxLayout() self.vbox.setContentsMargins(0, 0, 0, 0) self.file_view = FileView(self.controller) self.search_lineedit = SearchLineEdit(self.controller) self.location_lineedit = LocationLineEdit(self.controller) self.location_buttonbar = LocationButtonBar(self.controller) self.file_filter = FilterLineEdit(self.controller) # self.file_filter.setText("File Pattern Here") self.file_view.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.status_bar = self.statusBar() self.info = QLabel("") self.status_bar.addPermanentWidget(self.info) self.vbox.addWidget(self.file_view, Qt.AlignLeft) self._message_area = MessageArea() self._message_area.hide() self.vbox.addWidget(self._message_area) vbox_widget = QWidget() vbox_widget.setLayout(self.vbox) self.setCentralWidget(vbox_widget) def hide_filter(self): self.filter_toolbar.hide() def make_filter_toolbar(self): hbox = QHBoxLayout() form = QFormLayout() label = QLabel("Filter:") label.setBuddy(self.file_filter) form.addRow(label, self.file_filter) form.setContentsMargins(0, 0, 0, 0) hbox.addLayout(form) help_button = QPushButton("Help") help_button.clicked.connect(self.controller.show_filter_help) hbox.addWidget(help_button) hbox.setContentsMargins(0, 0, 0, 0) widget = QWidget() widget.setLayout(hbox) self.filter_toolbar = QToolBar("Filter") self.filter_toolbar.addWidget(widget) self.addToolBar(Qt.BottomToolBarArea, self.filter_toolbar) self.filter_toolbar.hide() def make_search_toolbar(self): hbox = QHBoxLayout() form = QFormLayout() label = QLabel("Search:") label.setBuddy(self.search_lineedit) form.addRow(label, self.search_lineedit) form.setContentsMargins(0, 0, 0, 0) hbox.addLayout(form) help_button = QPushButton("Help") help_button.clicked.connect(self.controller.show_search_help) hbox.addWidget(help_button) hbox.setContentsMargins(0, 0, 0, 0) widget = QWidget() widget.setLayout(hbox) self.search_toolbar = QToolBar("Search") self.search_toolbar.addWidget(widget) self.addToolBar(Qt.TopToolBarArea, self.search_toolbar) self.search_toolbar.hide() def make_location_toolbar(self): self.location_toolbar = self.addToolBar("Location") widget = QWidget() form = QFormLayout() label = Label("Location:") label.clicked.connect(self.controller.show_location_toolbar) def show_location_menu(pos): self.controller.on_context_menu(label.mapToGlobal(pos)) label.setContextMenuPolicy(Qt.CustomContextMenu) label.customContextMenuRequested.connect(show_location_menu) both = QVBoxLayout() both.addWidget(self.location_buttonbar) both.addWidget(self.location_lineedit) form.addRow(label, both) form.setContentsMargins(0, 0, 0, 0) widget.setLayout(form) self.location_toolbar.addWidget(widget) self.addToolBarBreak(Qt.TopToolBarArea) def make_group_menu(self): menu = QMenu("Group Options") menu.addAction(self.actions.group_by_none) menu.addAction(self.actions.group_by_day) menu.addAction(self.actions.group_by_directory) menu.addAction(self.actions.group_by_duration) return menu def make_sort_menu(self): menu = QMenu("Sort Options") menu.addSeparator().setText("Sort Options") menu.addAction(self.actions.sort_directories_first) menu.addAction(self.actions.sort_reversed) menu.addSeparator().setText("Sort by") menu.addAction(self.actions.sort_by_name) menu.addAction(self.actions.sort_by_size) menu.addAction(self.actions.sort_by_ext) menu.addAction(self.actions.sort_by_date) menu.addAction(self.actions.sort_by_duration) menu.addAction(self.actions.sort_by_aspect_ratio) menu.addAction(self.actions.sort_by_framerate) menu.addAction(self.actions.sort_by_area) menu.addAction(self.actions.sort_by_user) menu.addAction(self.actions.sort_by_group) menu.addAction(self.actions.sort_by_permission) menu.addAction(self.actions.sort_by_random) return menu def make_view_menu(self): menu = QMenu("View Options") menu.addSeparator().setText("View Options") menu.addAction(self.actions.show_abspath) menu.addAction(self.actions.show_basename) menu.addSeparator() menu.addAction(self.actions.toggle_timegaps) return menu def make_menubar(self): self.menubar = self.menuBar() file_menu = self.menubar.addMenu('&File') file_menu.addAction(self.actions.new_window) file_menu.addAction(self.actions.parent_directory) file_menu.addAction(self.actions.debug) file_menu.addAction(self.actions.save_as) file_menu.addSeparator() file_menu.addAction(self.actions.exit) edit_menu = self.menubar.addMenu('&Edit') # edit_menu.addAction(self.actions.undo) # edit_menu.addAction(self.actions.redo) # edit_menu.addSeparator() edit_menu.addAction(self.actions.edit_cut) edit_menu.addAction(self.actions.edit_copy) edit_menu.addAction(self.actions.edit_paste) edit_menu.addSeparator() edit_menu.addAction(self.actions.edit_select_all) edit_menu.addSeparator() edit_menu.addAction(self.actions.show_preferences) view_menu = self.menubar.addMenu('&View') view_menu.addSeparator().setText("View Style") view_menu.addAction(self.actions.view_detail_view) view_menu.addAction(self.actions.view_icon_view) view_menu.addAction(self.actions.view_small_icon_view) view_menu.addSeparator().setText("Filter") view_menu.addAction(self.actions.show_hidden) view_menu.addAction(self.actions.show_filtered) view_menu.addSeparator().setText("Path Options") view_menu.addAction(self.actions.show_abspath) view_menu.addAction(self.actions.show_basename) view_menu.addSeparator().setText("Sort Options") view_menu.addAction(self.actions.sort_directories_first) view_menu.addAction(self.actions.sort_reversed) view_menu.addAction(self.actions.sort_by_name) view_menu.addAction(self.actions.sort_by_size) view_menu.addAction(self.actions.sort_by_ext) view_menu.addAction(self.actions.sort_by_duration) view_menu.addAction(self.actions.sort_by_aspect_ratio) view_menu.addAction(self.actions.sort_by_framerate) view_menu.addAction(self.actions.sort_by_area) view_menu.addAction(self.actions.sort_by_user) view_menu.addAction(self.actions.sort_by_group) view_menu.addAction(self.actions.sort_by_permission) view_menu.addAction(self.actions.sort_by_random) view_menu.addSeparator().setText("Zoom") view_menu.addAction(self.actions.zoom_in) view_menu.addAction(self.actions.zoom_out) view_menu.addSeparator() self.bookmarks_menu = Menu('&Bookmarks') self.menubar.addMenu(self.bookmarks_menu) def create_bookmarks_menu(): bookmarks = self.controller.app.bookmarks entries = bookmarks.get_entries() self.bookmarks_menu.clear() if self.controller.location is None: action = self.bookmarks_menu.addAction(QIcon.fromTheme("user-bookmarks"), "Can't bookmark file lists") action.setEnabled(False) elif self.controller.location in entries: self.bookmarks_menu.addAction( QIcon.fromTheme("edit-delete"), "Remove This Location's Bookmark", lambda loc=self.controller.location: bookmarks.remove(loc)) else: self.bookmarks_menu.addAction( QIcon.fromTheme("bookmark-new"), "Bookmark This Location", lambda loc=self.controller.location: bookmarks.append(loc)) self.bookmarks_menu.addSeparator() self.bookmarks_menu.addDoubleAction( QIcon.fromTheme("folder"), "View Bookmarks", lambda: self.controller.set_location(Location("bookmarks", "/", [])), lambda: self.controller.new_controller().set_location(Location("bookmarks", "/", []))) self.bookmarks_menu.addSeparator() icon = QIcon.fromTheme("folder") for entry in entries: action = self.bookmarks_menu.addDoubleAction( icon, entry.as_url(), lambda entry=entry: self.controller.set_location(entry), lambda entry=entry: self.controller.app.show_location(entry)) if not entry.exists(): action.setEnabled(False) self.bookmarks_menu.aboutToShow.connect(create_bookmarks_menu) self.history_menu = Menu('&History') self.menubar.addMenu(self.history_menu) def create_history_menu(): history = self.controller.app.location_history self.history_menu.clear() self.history_menu.addAction(self.actions.back) self.history_menu.addAction(self.actions.forward) self.history_menu.addSeparator() self.history_menu.addDoubleAction( QIcon.fromTheme("folder"), "View File History", self.controller.show_file_history, lambda: self.controller.new_controller().show_file_history()) self.history_menu.addSection("Location History") entries = history.get_unique_entries(35) make_history_menu_entries(self.controller, self.history_menu, entries) self.history_menu.aboutToShow.connect(create_history_menu) help_menu = self.menubar.addMenu('&Help') help_menu.addAction(self.actions.about) def make_toolbar(self): self.toolbar = self.addToolBar("FileView") button = ToolButton() button.setDefaultAction(self.actions.parent_directory) button.sig_middle_click.connect(lambda: self.controller.parent_directory(new_window=True)) button.setIcon(self.actions.parent_directory.icon()) self.toolbar.addWidget(button) self.toolbar.addSeparator() self.toolbar.addAction(self.actions.home) self.toolbar.addSeparator() history_back_btn = ToolButton() history_back_btn.setDefaultAction(self.actions.back) history_back_btn.setContextMenuPolicy(Qt.CustomContextMenu) history_back_btn.customContextMenuRequested.connect( lambda pos: self.controller.show_history_context_menu(history_back_btn, False)) self.toolbar.addWidget(history_back_btn) history_forward_btn = ToolButton() history_forward_btn.setDefaultAction(self.actions.forward) history_forward_btn.setContextMenuPolicy(Qt.CustomContextMenu) history_forward_btn.customContextMenuRequested.connect( lambda pos: self.controller.show_history_context_menu(history_forward_btn, False)) self.toolbar.addWidget(history_forward_btn) self.toolbar.addSeparator() self.toolbar.addAction(self.actions.reload) self.toolbar.addAction(self.actions.prepare) # self.toolbar.addSeparator() # self.toolbar.addAction(self.actions.undo) # self.toolbar.addAction(self.actions.redo) self.toolbar.addSeparator() self.toolbar.addAction(self.actions.show_hidden) button = QToolButton() button.setIcon(QIcon.fromTheme("view-restore")) button.setMenu(self.make_view_menu()) button.setPopupMode(QToolButton.InstantPopup) self.toolbar.addWidget(button) button = QToolButton() button.setIcon(QIcon.fromTheme("view-sort-ascending")) button.setMenu(self.make_sort_menu()) button.setPopupMode(QToolButton.InstantPopup) self.toolbar.addWidget(button) button = QToolButton() button.setIcon(QIcon.fromTheme("view-sort-ascending")) button.setMenu(self.make_group_menu()) button.setPopupMode(QToolButton.InstantPopup) self.toolbar.addWidget(button) self.toolbar.addSeparator() self.toolbar.addAction(self.actions.view_icon_view) self.toolbar.addAction(self.actions.view_small_icon_view) self.toolbar.addAction(self.actions.view_detail_view) self.toolbar.addSeparator() self.toolbar.addAction(self.actions.zoom_in) self.toolbar.addAction(self.actions.zoom_out) self.toolbar.addSeparator() self.toolbar.addAction(self.actions.lod_in) self.toolbar.addAction(self.actions.lod_out) self.toolbar.addSeparator() self.toolbar.addAction(self.actions.crop_thumbnails) # Spacer to force right alignment for all following widget spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.toolbar.addWidget(spacer) self.toolbar.addAction(self.actions.debug) self.toolbar.addAction(self.controller.app.actions.enable_filesystem) # Loading icon self.loading_movie = QMovie(resource_filename("dirtools", "fileview/icons/gears.gif")) self.loading_label = QLabel() self.toolbar.addWidget(self.loading_label) def show_loading(self): self.show_info("Loading...") self.loading_label.setMovie(self.loading_movie) self.loading_movie.start() self.loading_label.show() def hide_loading(self): self.show_info("") self.loading_movie.stop() self.loading_label.setMovie(None) self.loading_label.setVisible(False) def zoom_in(self): self.file_view.zoom_in() def zoom_out(self): self.file_view.zoom_out() def set_location(self, location: Location): self.location_lineedit.set_location(location) self.location_buttonbar.set_location(location) self.setWindowTitle("{} - dt-fileview".format(location.as_human())) def set_file_list(self): self.location_lineedit.set_unused_text() def show_info(self, text): self.info.setText(" " + text) def show_current_filename(self, filename): # FIXME: this causes quite substantial keyboard lag when # scrolling with PageUp/Down self.status_bar.showMessage(filename)
def __init__(self, state, device): super().__init__() self.state = state self.invalidated = False self.cnt = 0 self.acc_values = (0, 0, 0, 0, 0, 0, 0) self.network = QNetworkAccessManager() view = QGraphicsView() view.setRenderHint(QPainter.Antialiasing) scene = QGraphicsScene() scene.addPixmap(QPixmap("chair.png").scaledToWidth(150)) pen = QPen(QColor.fromRgb(0x28, 0x30, 0x39), 3) self.sonic = scene.addRect(QRectF(65, 20, 20, 10), pen, QBrush(Qt.white)) self.lback = scene.addEllipse(QRectF(30, 50, 20, 20), pen, QBrush(Qt.white)) self.rback = scene.addEllipse(QRectF(100, 50, 20, 20), pen, QBrush(Qt.white)) self.lhip = scene.addPolygon( QPolygonF([ QPointF(30, 170), QPointF(50, 170), QPointF(50, 160), QPointF(30, 160) ]), pen, QBrush(Qt.white)) self.rhip = scene.addPolygon( QPolygonF([ QPointF(100, 170), QPointF(120, 170), QPointF(120, 160), QPointF(100, 160) ]), pen, QBrush(Qt.white)) self.lthigh = scene.addEllipse(QRectF(30, 200, 20, 10), pen, QBrush(Qt.white)) self.rthigh = scene.addEllipse(QRectF(100, 200, 20, 10), pen, QBrush(Qt.white)) self.displays = [ self.lhip, self.lthigh, self.lback, self.rhip, self.rthigh, self.rback, self.sonic ] view.setScene(scene) view.setFixedWidth(150) view.setMinimumHeight(400) view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setWindowTitle("센서 조정") self.setWindowIcon(QIcon('icon.png')) self.setGeometry(300, 300, 560, 600) self.label = QLabel() self.label.setProperty("class", "big") self.label.setAlignment(Qt.AlignHCenter) movie = QMovie("loader.gif") movie.start() busy_label = QLabel() busy_label.setMovie(movie) busy_label.setAlignment(Qt.AlignHCenter) layout = QVBoxLayout() layout.addStretch(1) layout.addWidget(self.label) layout.addWidget(view) layout.setAlignment(view, Qt.AlignHCenter) layout.addWidget(busy_label) layout.addStretch(1) layout.setContentsMargins(50, 50, 50, 50) layout.setSpacing(20) frame = QWidget() frame.setLayout(layout) frame.setProperty("class", "frame") main_layout = QVBoxLayout() main_layout.addWidget(frame) main_layout.setContentsMargins(0, 0, 0, 0) self.setLayout(main_layout) self.setProperty("class", "root") self.setContentsMargins(0, 0, 0, 0) self.setAttribute(Qt.WA_TranslucentBackground) self.device_changed(device.is_connected()) device.connectedChanged.connect(self.device_changed) device.updateNumber.connect(self.sensor_update)
class ImageViewerCenter(QScrollArea): topZoneEntered = Signal() topZoneLeft = Signal() leftZoneEntered = Signal() leftZoneLeft = Signal() def __init__(self, *args, **kwargs): super(ImageViewerCenter, self).__init__(*args, **kwargs) self.zoomMode = ZOOM_FACTOR self.zoomFactor = 1 self.moving = None imgWidget = QLabel() imgWidget.setMouseTracking(True) imgWidget.setAlignment(Qt.AlignCenter) self.setWidget(imgWidget) self.setAlignment(Qt.AlignCenter) self.setMouseTracking(True) self.setFrameShape(self.NoFrame) self.setWidgetResizable(True) pal = QPalette() pal.setColor(QPalette.Window, Qt.black) self.setPalette(pal) self.leftZone = False self.topZone = False self.file = None self.movie = None ### events def mousePressEvent(self, ev): self.moving = (ev.pos().x(), ev.pos().y()) self.movingScrolls = (self.horizontalScrollBar().value(), self.verticalScrollBar().value()) def mouseReleaseEvent(self, ev): self.moving = False def mouseMoveEvent(self, ev): if self.moving: p = ev.pos() self.horizontalScrollBar().setValue(self.movingScrolls[0] - (p.x() - self.moving[0])) self.verticalScrollBar().setValue(self.movingScrolls[1] - (p.y() - self.moving[1])) else: newLeft = (ev.x() < 30) if newLeft and not self.leftZone: self.leftZoneEntered.emit() elif self.leftZone and not newLeft: self.leftZoneLeft.emit() self.leftZone = newLeft newTop = (ev.y() < 30) if newTop and not self.topZone: self.topZoneEntered.emit() elif self.topZone and not newTop: self.topZoneLeft.emit() self.topZone = newTop def resizeEvent(self, ev): super(ImageViewerCenter, self).resizeEvent(ev) if self.zoomMode != ZOOM_FACTOR: self._rebuildZoom() def keyPressEvent_(self, ev): if ev.key() not in (Qt.Key_PageUp, Qt.Key_PageDown): QScrollArea.keyPressEvent(self, ev) def keyReleaseEvent_(self, ev): if ev.key() == Qt.Key_PageUp: self.imageviewer.prevImage_s() elif ev.key() == Qt.Key_PageDown: self.imageviewer.nextImage_s() else: QScrollArea.keyReleaseEvent(self, ev) ### public def setZoomMode(self, mode): self.zoomMode = mode self._rebuildZoom() def setZoomFactor(self, factor): self.zoomFactor = factor self.setZoomMode(ZOOM_FACTOR) def multiplyZoomFactor(self, factor): self.setZoomFactor(self.zoomFactor * factor) def setFile(self, file): self.file = file if file.lower().endswith('.gif'): self.movie = QMovie(file) self.widget().setMovie(self.movie) self.movie.finished.connect(self.movie.start) self.movie.start() else: self.movie = None self.originalPixmap = QPixmap(file) self._rebuildZoom() ### def _rebuildZoom(self): if self.movie: return if self.zoomMode == ZOOM_FACTOR: if self.zoomFactor == 1: self._setPixmap(self.originalPixmap) else: self._setPixmap(self._getScaledPixmap(self.originalPixmap.size() * self.zoomFactor)) elif self.zoomMode == ZOOM_FITALL: newpix = self._getScaledPixmap(self.viewport().size()) self._setPixmap(newpix) self.zoomFactor = newpix.size().width() / float(self.originalPixmap.size().width()) elif self.zoomMode == ZOOM_FITCUT: newpix = self._getScaledPixmap(self.viewport().size(), Qt.KeepAspectRatioByExpanding) self._setPixmap(newpix) self.zoomFactor = newpix.size().width() / float(self.originalPixmap.size().width()) def _getScaledPixmap(self, size, mode=Qt.KeepAspectRatio): return self.originalPixmap.scaled(size, mode, Qt.SmoothTransformation) def _setPixmap(self, pixmap): self.widget().setPixmap(pixmap)
''' Created on 2016年4月26日 @author: Irony."[讽刺] @site: irony.iask.in @email: [email protected] @file: test.test_gif.py @description: ''' from PyQt5.QtWidgets import QApplication, QLabel from PyQt5.QtGui import QMovie __Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: [email protected]" __Copyright__ = "Copyright (c) 2015 Irony.\"[讽刺]" __Version__ = "Version 1.0" app = QApplication([]) label = QLabel() move = QMovie("../data/lolita/kiana-3.gif") label.setMovie(move) move.start() label.show() app.exec_()
class CardHolder(QWidget): resized = QtCore.pyqtSignal(int, int) moved_to_front = QtCore.pyqtSignal(int) DEFAULT_SPINNER_NAME = 'spinner.gif' DEFAULT_MAX_OVERLAPPED_CARDS = 4 DEFAULT_BORDER_WIDTH = 5 DEFAULT_BACKGROUND_COLOR = QColor(Qt.red) DEFAULT_BORDER_RADIUS = 10 DEFAULT_RATE_OF_CARD_WIDTH_DECLINE = 10 DEFAULT_RATE_OF_CARD_Y_MULTIPLICATOR = 6 CARD_TRESHOLD = 6 MAX_CARD_ROLLING_RATE = 10 FAST_FORWARD_NUMBER = 5 def __init__(self, parent, get_new_card_method, get_collected_cards_method, refresh_list_listener=None, select_card_method=None, goes_higher_method=None): """ Represents a CardHolder widget Input: parent: The widget which contains this CardHolder get_new_card_method: Method to create the appearing Card get_collected_cards_method: Method to collect the contents of the Cards refresh_list_listener select_card_method goes_higher_method: Method to go to the previous level """ #super(CardHolder, self).__init__(parent) QWidget.__init__(self, parent) self.parent = parent self.get_new_card_method = get_new_card_method self.get_collected_cards_method = get_collected_cards_method self.refresh_list_listener = refresh_list_listener self.select_card_method = select_card_method self.goes_higher_method = goes_higher_method self.shown_card_list = [] self.card_data_list = [] self.set_max_overlapped_cards(CardHolder.DEFAULT_MAX_OVERLAPPED_CARDS, False) self.setBorderWidth(CardHolder.DEFAULT_BORDER_WIDTH, False) self.setBorderRadius(CardHolder.DEFAULT_BORDER_RADIUS, False) self.setBackgroundColor(CardHolder.DEFAULT_BACKGROUND_COLOR, False) self.self_layout = QVBoxLayout(self) self.setLayout(self.self_layout) self.rate_of_movement = 0 self.delta_rate = 0 self.countDown = CountDown() self.countDown.timeOver.connect( self.animated_move_to_closest_descreet_position) self.collecting_spinner = None spinner_file_name = resource_filename( __name__, os.path.join("img", CardHolder.DEFAULT_SPINNER_NAME)) self.set_spinner(spinner_file_name) self.set_y_coordinate_by_reverse_index_method( self.get_y_coordinate_by_reverse_index) self.set_x_offset_by_index_method(self.get_x_offset_by_index) # it hides the CardHolder until it is filled up with cards self.focus_index(0) self.setAttribute(Qt.WA_StyledBackground, True) # The CardHolder will accept Focus by Tabbing and Clicking self.setFocusPolicy(Qt.StrongFocus) self.setFocus() # def setSelectedRootCardIndex(self, selected_root_card_index): # self.selected_root_card_index = selected_root_card_index # # def getSelectedRootCardIndex(self): # return self.selected_root_card_index def set_y_coordinate_by_reverse_index_method(self, method): self.get_y_coordinate_by_reverse_index_method = method def get_y_coordinate_by_reverse_index(self, reverse_index): return reverse_index * reverse_index * CardHolder.DEFAULT_RATE_OF_CARD_Y_MULTIPLICATOR def set_x_offset_by_index_method(self, method): self.get_x_offset_by_index_method = method def get_x_offset_by_index(self, index): return index * CardHolder.DEFAULT_RATE_OF_CARD_WIDTH_DECLINE # ---------------- # # set spinner # # ---------------- def set_spinner(self, file_name): # remove the old spinner if self.collecting_spinner != None: self.spinner_movie.stop() self.collecting_spinner.setParent(None) self.collecting_spinner = None self.spinner_movie = QMovie(file_name, QByteArray(), self) self.collecting_spinner = QLabel(self.parent) self.collecting_spinner.setMovie(self.spinner_movie) self.collecting_spinner.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.spinner_movie.setCacheMode(QMovie.CacheAll) self.spinner_movie.setSpeed(100) self.spinner_movie.start() # if I do not start it, it stays hidden self.spinner_movie.stop() self.collecting_spinner.move(0, 0) self.collecting_spinner.show() self.collecting_spinner.setHidden(True) img_size = self.spinner_movie.currentPixmap().size() self.collecting_spinner.resize(img_size.width(), img_size.height()) # -------------------------------------- # Shows the spinner + removes all Cards # -------------------------------------- def start_spinner(self): # remove all cards self.refresh() self.alignSpinner(self.parent.geometry().width(), self.parent.geometry().height()) self.spinner_movie.start() self.collecting_spinner.setHidden(False) def alignSpinner(self, windowWidth, windowHeight): self.collecting_spinner.move( (windowWidth - self.collecting_spinner.width()) / 2, (windowHeight - self.collecting_spinner.width()) / 2) # ------------------------------ # Hides the spinner # ------------------------------ def stop_spinner(self): self.collecting_spinner.setHidden(True) self.spinner_movie.stop() # --------------------------------------------------------------------- # # start card collection # # this method should be called when you want a new collection of cards # # --------------------------------------------------------------------- def startCardCollection(self): self.start_spinner() # self.cc = CollectCardsThread.getInstance( self, self.get_collected_cards_method, parameters ) self.cc = CollectCardsThread.getInstance( self, self.get_collected_cards_method) if self.cc: self.cc.cards_collected.connect(self.refresh) self.cc.start() # ------------------------------------------------------ # fill up card descriptor - used by the refresh() method # ------------------------------------------------------ def fill_up_card_descriptor_list(self, filtered_card_list=[]): self.card_data_list = [] for card_data in filtered_card_list: self.card_data_list.append(card_data) def setBorderWidth(self, width, update=True): self.border_width = width if update: self.update() def get_border_width(self): return self.border_width def setBackgroundColor(self, color, update=True): self.background_color = color ## without this line it wont paint the background, but the children get the background color info ## with this line, the rounded corners will be ruined #self.setAttribute(QtCore.Qt.WA_StyledBackground, True) #self.setStyleSheet('background-color: ' + self.background_color.name()) if update: self.update() def set_max_overlapped_cards(self, number, update=True): self.max_overlapped_cards = number if update: #self.focus_index(self.actual_card_index) self.focus_index(0) def setBorderRadius(self, radius, update=True): self.border_radius = radius if update: self.update() def get_max_overlapped_cards(self): return self.max_overlapped_cards def resizeEvent(self, event): self.resized.emit(event.size().width(), event.size().height()) return super(CardHolder, self).resizeEvent(event) def remove_all_cards(self): for card in self.shown_card_list: card.setParent(None) card = None def remove_card(self, card): card.setParent(None) card = None def get_rate_of_movement(self): return self.rate_of_movement def get_delta_rate(self): return self.delta_rate # -------------------------------------------------------------------------- # # Focus Index # # It builds up from scratch the shown_card_list from the card_data_list # In the 0. position (on front) will be the Card identified by the "index" parameter # The card in the 0. position will be indicated as the "focused" # # -------------------------------------------------------------------------- def focus_index(self, index): index_corr = self.get_corrected_card_data_index(index) self.remove_all_cards() position = None self.shown_card_list = [ None for i in range( index_corr + min(self.max_overlapped_cards, len(self.card_data_list) - 1), index_corr - 1, -1) ] for i in range( index_corr + min(self.max_overlapped_cards, len(self.card_data_list) - 1), index_corr - 1, -1): i_corr = self.get_corrected_card_data_index(i) if (i_corr < len(self.card_data_list)): local_index = i - index_corr card = self.get_new_card_method(self.card_data_list[i_corr], local_index, i_corr) position = card.place(local_index) self.shown_card_list[local_index] = card # if there is at least one Card if self.shown_card_list: # Control the Height of the CardHolder self.setMinimumHeight(position[0].y() + position[1].y() + self.border_width) self.setMaximumHeight(position[0].y() + position[1].y() + self.border_width) # for indicating the focused (0) Card self.rolling(0) # if there is NO Card at all else: # hides the CardHolder self.setMinimumHeight(0) self.setMaximumHeight(0) # for some reason the 2nd parameter is False from connect # that is why I cant connect it to directly def button_animated_move_to_next(self): self.animated_move_to_next() def button_animated_move_to_previous(self): self.animated_move_to_previous() # --------------------------------- # # Animated shows the next card # # --------------------------------- def animated_move_to_next(self, sleep=0.01): rate = self.get_rate_of_movement() if rate > 0: loop = self.MAX_CARD_ROLLING_RATE - rate elif rate < 0: loop = -rate else: loop = self.MAX_CARD_ROLLING_RATE self.animate = AnimateRolling.getInstance(int(loop), 1, sleep) if self.animate: self.animate.positionChanged.connect(self.rolling) self.animate.start() # --------------------------------- # # Animated shows the previous card # # --------------------------------- def animated_move_to_previous(self, sleep=0.01): rate = self.get_rate_of_movement() if rate > 0: loop = rate elif rate < 0: loop = self.MAX_CARD_ROLLING_RATE + rate else: loop = self.MAX_CARD_ROLLING_RATE self.animate = AnimateRolling.getInstance(int(loop), -1, sleep) if self.animate: self.animate.positionChanged.connect(self.rolling) self.animate.start() # ------------------------------------------------ # # Animated moves to the closest descreet position # # ------------------------------------------------ def animated_move_to_closest_descreet_position(self): rate = self.get_rate_of_movement() delta_rate = self.get_delta_rate() if rate != 0: if rate > 0: if delta_rate < 0: value = -1 loop = rate else: value = 1 loop = self.MAX_CARD_ROLLING_RATE - rate #if rate >= self.CARD_TRESHOLD: # value = 1 # loop = self.MAX_CARD_ROLLING_RATE - rate #else: # value = -1 # loop = rate elif rate < 0: if delta_rate < 0: value = -1 loop = self.MAX_CARD_ROLLING_RATE + rate else: value = 1 loop = -rate #if rate <= -self.CARD_TRESHOLD: # value = -1 # loop = self.MAX_CARD_ROLLING_RATE + rate #else: # value = 1 # loop = -rate self.animate = AnimateRolling.getInstance(int(loop), value, 0.02) if self.animate: self.animate.positionChanged.connect(self.rolling) self.animate.start() # ------------------------------------------------ # # Animated moves to the set relative position Card # # ------------------------------------------------ def animated_move_to(self, relative_position, sleep=0.01): self.animate = AnimateRolling.getInstance( relative_position * self.MAX_CARD_ROLLING_RATE, 1, sleep) if self.animate: self.animate.positionChanged.connect(self.rolling) self.animate.start() # --------------------------------------------------------------------- # # Rolling Wheel # # Rolls the cards according to the self.rate_of_movement + delta_rate # Plus it starts a Timer. If the timer expires, the cards will be # moved to the first next discreet position # # -------------------------------------------------------------------- def rolling_wheel(self, delta_rate): self.rolling(delta_rate) if self.rate_of_movement != 0: self.countDown.start() # -------------------------------------------------------------------- # # ROLLING # # Rolls the cards according to the self.rate_of_movement + delta_rate # # delta_rate: In normal case it is +1 or -1 # Adding this value to the self.rate_of_movement, it # shows that how far the cards moved negativ (up) or # positive (down) direction compared to the default # (local_index) value # -10 means (-100%) it moved to the next position, # +10 means (+100%) it moved to the previous position # # ------------------------------------------------------------------- def rolling(self, delta_rate): self.delta_rate = delta_rate if self.rate_of_movement >= self.MAX_CARD_ROLLING_RATE or self.rate_of_movement <= -self.MAX_CARD_ROLLING_RATE: self.rate_of_movement = 0 self.rate_of_movement = self.rate_of_movement + delta_rate # Did not start to roll # if number of the shown cards are != min(max overlapped cards +1, len(self.card_data_list)) #if len(self.shown_card_list) <= self.get_max_overlapped_cards() + 1: if len(self.shown_card_list) == min(self.max_overlapped_cards + 1, len(self.card_data_list)): # indicates that the first card is not the focused anymore card = self.shown_card_list[0] card.setNotFocused() # add new card to the beginning first_card = self.shown_card_list[0] first_card_index = self.get_corrected_card_data_index( first_card.getIndexInDataList() - 1) card = self.get_new_card_method( self.card_data_list[first_card_index], -1, first_card_index) self.shown_card_list.insert(0, card) # add a new card to the end last_card = self.shown_card_list[len(self.shown_card_list) - 1] last_card_index = self.get_corrected_card_data_index( last_card.getIndexInDataList() + 1) #card = self.get_new_card_method(self.card_data_list[last_card_index], self.get_max_overlapped_cards() + 1, last_card_index ) card = self.get_new_card_method( self.card_data_list[last_card_index], min(self.max_overlapped_cards + 1, len(self.card_data_list)), last_card_index) self.shown_card_list.append(card) # Re-print to avoid the wrong-overlapping for card in self.shown_card_list[::-1]: card.setParent(None) card.setParent(self) card.show() # adjust rate = self.rate_of_movement / self.MAX_CARD_ROLLING_RATE if self.rate_of_movement >= 0: self.rolling_adjust_forward(rate) else: self.rolling_adjust_backward(rate) # indicates that the first card is the focus if self.rate_of_movement == 0: card = self.shown_card_list[0] card.setFocused() # show the cards in the right position rate = self.rate_of_movement / self.MAX_CARD_ROLLING_RATE for i, card in enumerate(self.shown_card_list): virtual_index = card.local_index - rate card.place(virtual_index, True) def rolling_adjust_forward(self, rate): if rate >= 1.0: self.rate_of_movement = 0 # remove the first 2 cards from the list and from CardHolder for i in range(2): card_to_remove = self.shown_card_list.pop(0) card_to_remove.setParent(None) # re-index for i, card in enumerate(self.shown_card_list): card.local_index = i elif rate == 0: # remove the first card from the list and from CardHolder card_to_remove = self.shown_card_list.pop(0) card_to_remove.setParent(None) # remove the last card from the list and from CardHolder card_to_remove = self.shown_card_list.pop( len(self.shown_card_list) - 1) card_to_remove.setParent(None) def rolling_adjust_backward(self, rate): if rate <= -1.0: self.rate_of_movement = 0 # remove the 2 last cards from the list and from CardHolder for i in range(2): card_to_remove = self.shown_card_list.pop( len(self.shown_card_list) - 1) card_to_remove.setParent(None) # re-index for i, card in enumerate(self.shown_card_list): card.local_index = i # ----------------------------------------------------------- # # INDEX CORRECTION # # if the index > numbers of the cards then it gives back 0 # as the next index # if the index < 0 then it gives back the index of the last # card as the previous index # # that is how it actually accomplishes an endless loop # # ----------------------------------------------------------- def get_corrected_card_data_index(self, index): if self.card_data_list: return (len(self.card_data_list) - abs(index) if index < 0 else index) % len(self.card_data_list) else: return index def paintEvent(self, event): s = self.size() qp = QPainter() qp.begin(self) qp.setRenderHint(QPainter.Antialiasing, True) qp.setBrush(self.background_color) qp.drawRoundedRect(0, 0, s.width(), s.height(), self.border_radius, self.border_radius) qp.end() def getFocusedCard(self): if self.shown_card_list: first_card = self.shown_card_list[0] return first_card else: return None def wheelEvent(self, event): modifiers = QApplication.keyboardModifiers() value = event.angleDelta().y( ) / 8 / 15 # in normal case it is +1 or -1 if modifiers == Qt.ControlModifier: # Change SCALE_LEVEL config_ini_function = getConfigIni() scale_level = int(config_ini_function.getScaleLevel()) scale_level = scale_level + (1 if value > 0 else -1) config_ini_function.setScaleLevel(str(scale_level)) index_of_focused_card = self.getFocusedCard().getIndexInDataList() self.focus_index(index_of_focused_card) else: self.rolling_wheel(-value) def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Up and event.modifiers( ) == Qt.ControlModifier: # Change SCALE_LEVEL config_ini_function = getConfigIni() scale_level = int(config_ini_function.getScaleLevel()) scale_level = scale_level + 1 config_ini_function.setScaleLevel(str(scale_level)) parent_collector = self.getParentCollector() index_of_focused_card = self.getFocusedCard().getIndexInDataList() self.focus_index(index_of_focused_card) elif event.key() == QtCore.Qt.Key_Down and event.modifiers( ) == Qt.ControlModifier: # Change SCALE_LEVEL config_ini_function = getConfigIni() scale_level = int(config_ini_function.getScaleLevel()) scale_level = scale_level - 1 config_ini_function.setScaleLevel(str(scale_level)) parent_collector = self.getParentCollector() index_of_focused_card = self.getFocusedCard().getIndexInDataList() self.focus_index(index_of_focused_card) elif event.key() == QtCore.Qt.Key_Up: self.animated_move_to_next(sleep=0.04) elif event.key() == QtCore.Qt.Key_Down: self.animated_move_to_previous(sleep=0.04) elif event.key() == QtCore.Qt.Key_PageUp: self.animated_move_to(self.FAST_FORWARD_NUMBER, 0.04) elif event.key() == QtCore.Qt.Key_PageDown: self.animated_move_to(-self.FAST_FORWARD_NUMBER, 0.04) # # Goes Up in the hierarchy # elif event.key() == QtCore.Qt.Key_Escape: if self.goesHigher(): # I do not want to propagate the ESC event to the parent event.setAccepted(True) # # Select a Card # elif event.key() == QtCore.Qt.Key_Space or event.key( ) == QtCore.Qt.Key_Return: # Comes from the MouseClick -> It could be any Card on the screen if event.text().isdigit(): card_index = int(event.text()) # Move the Card to the front self.focus_index(card_index) # Comes from SPACE/ENTER -> Only else: pass # Fetch the Card in the focus (in front) selected_card = self.getFocusedCard() if self.select_card_method: self.select_card_method(selected_card) else: # Depending of the Media (Storage/Collector) needs to do different things panel = selected_card.getPanel() layout = panel.getLayout() # the 0th item in the layout is the Image widget = layout.itemAt(0).widget() widget.image_widget.toDoSelection() event.setAccepted(True) else: event.setAccepted(False) def collectMediaStorageWithoutHierarchy(self, sum_list, parent_collector): mcl = parent_collector.getMediaCollectorList() sum_list += parent_collector.getMediaStorageList() for media_collector in mcl: self.collectMediaStorageWithoutHierarchy(sum_list, media_collector) return sum_list def getParentCollector(self): return self.getFocusedCard().card_data.getParentCollector() # TODO build in the refresh() def getSortedMediaStorageList(self, parent_collector): # Without hierarchy if not self.parent.isSwitchKeepHierarchy(): msl = self.collectMediaStorageWithoutHierarchy([], parent_collector) msl.sort(key=lambda arg: MediaCollector.sort_key(arg)) # With hierarchy else: msl = parent_collector.getMediaStorageList() return msl def refresh(self, parent_collector=None, index=0): """ Fills up the CardHolder with Cards and pulls the <index>th Card to front """ if parent_collector: # Without hierarchy if not self.parent.isSwitchKeepHierarchy(): sum_list = self.collectMediaStorageWithoutHierarchy( [], parent_collector) sum_list.sort(key=lambda arg: MediaCollector.sort_key(arg)) # Listener of the refresh list # Here you refresh the self.mediaCollector object in the medlib_gui self.refresh_list_listener(parent_collector, sum_list) # With hierarchy else: mcl = parent_collector.getMediaCollectorList() msl = parent_collector.getMediaStorageList() sum_list = mcl + msl # Listener of the refresh list # 1. set self.mediaCollector # 2. fill up the "play continously" list if there is NO ongoing play # 3. save the "play continously" list if there IS ongoing play self.refresh_list_listener(parent_collector, msl) self.fill_up_card_descriptor_list(sum_list) self.focus_index(index) self.stop_spinner() def goesHigher(self): if self.goes_higher_method: #self.goes_higher_method(self.getFocusedCard()) self.goes_higher_method() return True else: collector, index = self.parent.getHierarchyTitle( ).getOneLevelHigher() if collector and index >= 0: self.refresh(collector, index) return False def goesDeeper(self, mediaCollector): self.refresh(mediaCollector) # -------------- # MOUSE handling # -------------- def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.drag_start_position = event.pos() event.ignore() def mouseMoveEvent(self, event): if event.buttons() == Qt.LeftButton: # Rolling Cards delta_y = event.pos().y() - self.drag_start_position.y() self.drag_start_position = event.pos() if delta_y > 0: self.rolling_wheel(1) elif delta_y < 0: self.rolling_wheel(-1) event.ignore()
class Window(object): def setupUI(self,MainWindow): #界面背景设为黑色,大小待更改 MainWindow.setObjectName("MainWindow") MainWindow.resize(450, 600) MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") #显示动图,需要更改位置 self.picture = QtWidgets.QLabel(self.centralwidget) self.picture.setGeometry(QtCore.QRect(25, 400, 400, 121)) self.picture.setText("") self.gif = QMovie("timg2.gif") self.picture.setMovie(self.gif) self.gif.start() self.picture.setScaledContents(True) self.picture.setObjectName("picture") self.startButton = QtWidgets.QPushButton(self.centralwidget) self.startButton.setGeometry(QtCore.QRect(200, 500, 50, 50)) self.startButton.setIconSize(QtCore.QSize(50, 50)) self.startButton.setObjectName("startButton") self.startButton.clicked.connect(self.start_audio) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap("start.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.startButton.setIcon(icon2) self.startButton.setIconSize(QtCore.QSize(50, 50)) #label用来显示状态,是输入中,识别中、、、、,更改位置 self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(70, 50, 400, 70)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(14) font.setStyleStrategy(QtGui.QFont.PreferAntialias) self.label.setFont(font) self.label.setStyleSheet("color: rgb(0, 117, 210);") self.label.setTextFormat(QtCore.Qt.AutoText) self.label.setWordWrap(True) self.label.setObjectName("label") self.label.setText("Hello, you can push the start button to begin") # label_2用来显示输入的内容,需要更改位置 self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(70, 150, 400, 70)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(14) font.setStyleStrategy(QtGui.QFont.PreferAntialias) self.label_2.setFont(font) self.label_2.setStyleSheet("color: rgb(0, 117, 210);") self.label_2.setTextFormat(QtCore.Qt.AutoText) self.label_2.setWordWrap(True) self.label_2.setObjectName("label_2") self.label_2.setText(" ") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Voice Assistant"))
class MoviePlayer(QWidget): def __init__(self, parent=None): super(MoviePlayer, self).__init__(parent) self.movie = QMovie(self) self.movie.setCacheMode(QMovie.CacheAll) self.movieLabel = QLabel("No movie loaded") self.movieLabel.setAlignment(Qt.AlignCenter) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.movieLabel.setBackgroundRole(QPalette.Dark) self.movieLabel.setAutoFillBackground(True) self.currentMovieDirectory = '' self.createControls() self.createButtons() self.movie.frameChanged.connect(self.updateFrameSlider) self.movie.stateChanged.connect(self.updateButtons) self.fitCheckBox.clicked.connect(self.fitToWindow) self.frameSlider.valueChanged.connect(self.goToFrame) self.speedSpinBox.valueChanged.connect(self.movie.setSpeed) mainLayout = QVBoxLayout() mainLayout.addWidget(self.movieLabel) mainLayout.addLayout(self.controlsLayout) mainLayout.addLayout(self.buttonsLayout) self.setLayout(mainLayout) self.updateFrameSlider() self.updateButtons() self.setWindowTitle("Movie Player") self.resize(400, 400) def open(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie", self.currentMovieDirectory) if fileName: self.openFile(fileName) def openFile(self, fileName): self.currentMovieDirectory = QFileInfo(fileName).path() self.movie.stop() self.movieLabel.setMovie(self.movie) self.movie.setFileName(fileName) self.movie.start() self.updateFrameSlider(); self.updateButtons(); def goToFrame(self, frame): self.movie.jumpToFrame(frame) def fitToWindow(self): self.movieLabel.setScaledContents(self.fitCheckBox.isChecked()) def updateFrameSlider(self): hasFrames = (self.movie.currentFrameNumber() >= 0) if hasFrames: if self.movie.frameCount() > 0: self.frameSlider.setMaximum(self.movie.frameCount() - 1) elif self.movie.currentFrameNumber() > self.frameSlider.maximum(): self.frameSlider.setMaximum(self.movie.currentFrameNumber()) self.frameSlider.setValue(self.movie.currentFrameNumber()) else: self.frameSlider.setMaximum(0) self.frameLabel.setEnabled(hasFrames) self.frameSlider.setEnabled(hasFrames) def updateButtons(self): state = self.movie.state() self.playButton.setEnabled(self.movie.isValid() and self.movie.frameCount() != 1 and state == QMovie.NotRunning) self.pauseButton.setEnabled(state != QMovie.NotRunning) self.pauseButton.setChecked(state == QMovie.Paused) self.stopButton.setEnabled(state != QMovie.NotRunning) def createControls(self): self.fitCheckBox = QCheckBox("Fit to Window") self.frameLabel = QLabel("Current frame:") self.frameSlider = QSlider(Qt.Horizontal) self.frameSlider.setTickPosition(QSlider.TicksBelow) self.frameSlider.setTickInterval(10) speedLabel = QLabel("Speed:") self.speedSpinBox = QSpinBox() self.speedSpinBox.setRange(1, 9999) self.speedSpinBox.setValue(100) self.speedSpinBox.setSuffix("%") self.controlsLayout = QGridLayout() self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2) self.controlsLayout.addWidget(self.frameLabel, 1, 0) self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2) self.controlsLayout.addWidget(speedLabel, 2, 0) self.controlsLayout.addWidget(self.speedSpinBox, 2, 1) def createButtons(self): iconSize = QSize(36, 36) openButton = QToolButton() openButton.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton)) openButton.setIconSize(iconSize) openButton.setToolTip("Open File") openButton.clicked.connect(self.open) self.playButton = QToolButton() self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) self.playButton.setIconSize(iconSize) self.playButton.setToolTip("Play") self.playButton.clicked.connect(self.movie.start) self.pauseButton = QToolButton() self.pauseButton.setCheckable(True) self.pauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause)) self.pauseButton.setIconSize(iconSize) self.pauseButton.setToolTip("Pause") self.pauseButton.clicked.connect(self.movie.setPaused) self.stopButton = QToolButton() self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop)) self.stopButton.setIconSize(iconSize) self.stopButton.setToolTip("Stop") self.stopButton.clicked.connect(self.movie.stop) quitButton = QToolButton() quitButton.setIcon(self.style().standardIcon(QStyle.SP_DialogCloseButton)) quitButton.setIconSize(iconSize) quitButton.setToolTip("Quit") quitButton.clicked.connect(self.close) self.buttonsLayout = QHBoxLayout() self.buttonsLayout.addStretch() self.buttonsLayout.addWidget(openButton) self.buttonsLayout.addWidget(self.playButton) self.buttonsLayout.addWidget(self.pauseButton) self.buttonsLayout.addWidget(self.stopButton) self.buttonsLayout.addWidget(quitButton) self.buttonsLayout.addStretch()
class filesChosen(QWidget): def __init__(self, files): super().__init__() self.title = 'PDF Merger' self.setWindowIcon(QIcon("C:\\Users\\cold\\Downloads\\pdf_icon.png")) self.left = 100 self.top = 100 self.width = 600 self.height = 600 self.fileNames = files self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.movie = QMovie("C:\\Users\\cold\\Downloads\\cats.gif") self.movie.frameChanged.connect(self.repaint) self.movie.start() buttonGoBack = QPushButton('Back to File Selection', self) buttonGoBack.move(200, 550) buttonGoBack.resize(200, 32) buttonGoBack.clicked.connect(self.buttonGoBack_onClick) buttonMerge = QPushButton('Merge Files', self) buttonMerge.move(200, 500) buttonMerge.resize(200, 32) buttonMerge.clicked.connect(self.buttonMerge_onClick) explText = QLabel(self) explText.setText( "Merge will happen in order listed here. Keep filenames on separate lines." ) explText.setGeometry(100, 40, 400, 32) expl2Text = QLabel(self) expl2Text.setText( "Rearrange merge order by moving filenames to correct position.") expl2Text.setGeometry(100, 70, 400, 32) expl3Text = QLabel(self) expl3Text.setText( "Use Ctrl + click to select multiple files. Use button to go back if one file selected." ) expl3Text.setGeometry(100, 10, 400, 32) otherText = QLabel(self) otherText.setText("Files Chosen for Merging:") otherText.setGeometry(100, 100, 200, 32) self.filesText = QTextEdit(self) if self.fileNames: fileNameText = '' for filename in self.fileNames: fileNameText += filename + "<br>" self.filesText.setText(fileNameText) else: self.filesText.setText('No files chosen.') self.filesText.setGeometry(100, 130, 400, 300) self.show() def buttonGoBack_onClick(self): self.cams = App(False) self.cams.show() self.close() def buttonMerge_onClick(self): filesTextValue = self.filesText.toPlainText() files = filesTextValue.splitlines() output_file = self.saveFileDialog() if output_file and files and files[0] != "No files chosen." and files[ 0] != "": self.merge_pdfs(files, output_file) self.cams = App(True) self.cams.show() self.close() else: self.filesText.setText( "Error: Input or Output file missing. Please click back button and try again." ) def saveFileDialog(self): options = QFileDialog.Options() fileName, _ = QFileDialog.getSaveFileName( self, "Save File As", "", "PDF Files (*.pdf);;All Files (*)", options=options) if fileName: return fileName else: return '' def paintEvent(self, event): currentFrame = self.movie.currentPixmap() frameRect = currentFrame.rect() frameRect.moveCenter(self.rect().center()) if frameRect.intersects(event.rect()): painter = QPainter(self) painter.drawPixmap(frameRect.left(), frameRect.top(), currentFrame) def merge_pdfs(self, paths, output): pdf_writer = PdfFileWriter() for path in paths: if path: pdf_reader = PdfFileReader(path) for page in range(pdf_reader.getNumPages()): # Add each page to the writer object pdf_writer.addPage(pdf_reader.getPage(page)) # Write out the merged PDF with open(output, 'wb') as out: pdf_writer.write(out)
class ProgressWindow(QWidget): def __init__(self, message): QWidget.__init__(self, ctx.mainScreen) self.setObjectName("ProgressWindow") self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setFixedHeight(50) self.setMaximumWidth(800) self.setStyleSheet(""" QFrame#frame { border: 1px solid rgba(255,255,255,30); /*border-radius: 4px;*/ background-color: rgba(255,0,0,100);} QLabel { border:none; color:#FFFFFF;} QProgressBar { border: 1px solid white;} QProgressBar::chunk { background-color: #F1610D; width: 0.5px;} """) self.gridlayout = QGridLayout(self) self.frame = QFrame(self) self.frame.setObjectName("frame") self.horizontalLayout = QHBoxLayout(self.frame) self.horizontalLayout.setContentsMargins(6, 0, 0, 0) # Spinner self.spinner = QLabel(self.frame) self.spinner.setMinimumSize(QSize(16, 16)) self.spinner.setMaximumSize(QSize(16, 16)) self.spinner.setIndent(6) self.movie = QMovie(':/images/working.mng') self.spinner.setMovie(self.movie) self.movie.start() self.horizontalLayout.addWidget(self.spinner) # Message self.label = QLabel(self.frame) self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.horizontalLayout.addWidget(self.label) self.gridlayout.addWidget(self.frame,0,0,1,1) self.update(message) def update(self, message): self.spinner.setVisible(True) fontMetric = self.label.fontMetrics() textWidth = fontMetric.width(message) self.setFixedWidth(textWidth + 100) self.label.setText(message) self.move(ctx.mainScreen.width()/2 - self.width()/2, ctx.mainScreen.height() - self.height()/2 - 50) self.show() def refresh(self): ctx.mainScreen.processEvents() def show(self): QWidget.show(self) self.refresh() def pop(self): QWidget.hide(self) self.refresh()
class Ui_MainWindow(QtCore.QObject): sig = QtCore.pyqtSignal() def setupresUi(self): print(threading.enumerate()) output = self.res self.t.exit() MainWindow = self.MainWindow MainWindow.setObjectName("MainWindow") MainWindow.resize(861, 690) MainWindow.setStyleSheet("background-color: rgb(255,255,255);") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.backButton = QtWidgets.QCommandLinkButton(self.centralwidget) self.backButton.setMinimumSize(QtCore.QSize(40, 40)) self.backButton.setMaximumSize(QtCore.QSize(40, 40)) self.backButton.setBaseSize(QtCore.QSize(40, 40)) self.backButton.setText("") self.backButton.setIconSize(QtCore.QSize(40, 40)) self.backButton.setCheckable(False) self.backButton.setObjectName("backButton") self.MainWindow = MainWindow self.backButton.clicked.connect(self.setupUi) self.horizontalLayout.addWidget(self.backButton) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout.addLayout(self.horizontalLayout) self.line = QtWidgets.QFrame(self.centralwidget) self.line.setStyleSheet("color: rgb(0, 0, 0);\n" "background-color: rgb(255, 255, 255);") self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.verticalLayout.addWidget(self.line) self.resultWidget = QtWidgets.QListWidget(self.centralwidget) self.resultWidget.setVerticalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOn) self.resultWidget.setObjectName("resultWidget") for item in output: form = QtWidgets.QWidget() a = QtWidgets.QListWidgetItem() ui = entry.Ui_Entry() ui.setupUi(form, item) a.setSizeHint(form.sizeHint()) self.resultWidget.insertItem(0, a) self.resultWidget.setItemWidget(a, form) self.verticalLayout.addWidget(self.resultWidget) self.pieBox = QtWidgets.QFrame(self.centralwidget) self.pieBox.setFrameShape(QtWidgets.QFrame.StyledPanel) self.pieBox.setFrameShadow(QtWidgets.QFrame.Raised) self.pieBox.setObjectName("pieBox") self.verticalLayout.addWidget(self.pieBox) '''plot area''' plt.rcParams.update({'font.size': 14}) # a figure instance to plot on self.figure = plt.figure(figsize=(2, 2), facecolor='#696969') # this is the Canvas Widget that displays the `figure` # it takes the `figure` instance as a parameter to __init__ self.canvas = FigureCanvas(self.figure) self.canvas.setParent(self.pieBox) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.canvas) self.pieBox.setLayout(layout) dict = {} for url in output: url = url.split('://')[-1].split("?")[0].split('/')[0].split( ':')[0].lower() if url in dict.keys(): dict[url] += 1 else: dict[url] = 1 print(dict) labels = dict.keys() sizes = dict.values() colors = ['#006FF6'] explode = [0.05] * len(sizes) # explode slices self.figure.clear() ax = self.figure.add_subplot(111) # plot data ax.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90) ax.set_title('precentage by website') # refresh canvas self.canvas.draw() MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Web Crawler")) QtCore.QMetaObject.connectSlotsByName(MainWindow) def setMain(self, Main): self.MainWindow = Main def setupUi(self): try: os.remove('cache.ch') except: pass MainWindow = self.MainWindow MainWindow.setObjectName("MainWindow") MainWindow.setWindowModality(QtCore.Qt.WindowModal) MainWindow.resize(871, 697) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("SEO_sign-512.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) MainWindow.setStyleSheet("background-color: rgb(255, 255, 255);") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setStyleSheet( "background-color: rgb(255, 255, 255);") self.centralwidget.setObjectName("centralwidget") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setSpacing(0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.frame = QtWidgets.QFrame(self.centralwidget) self.frame.setMinimumSize(QtCore.QSize(25, 0)) self.frame.setStyleSheet("background-color: rgb(255, 255, 255);\n" "border-color: rgb(0, 0, 0);") self.frame.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame.setFrameShadow(QtWidgets.QFrame.Plain) self.frame.setLineWidth(0) self.frame.setObjectName("frame") self.horizontalLayout_2.addWidget(self.frame) self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.titleLbl = QtWidgets.QLabel(self.centralwidget) self.titleLbl.setStyleSheet("font: 26pt \"Tahoma\";\n" "color: rgb(0, 0, 0);") self.titleLbl.setObjectName("titleLbl") self.verticalLayout.addWidget(self.titleLbl) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setSpacing(0) self.horizontalLayout.setObjectName("horizontalLayout") self.searchBarEdit = QtWidgets.QLineEdit(self.centralwidget) self.searchBarEdit.setMinimumSize(QtCore.QSize(0, 40)) self.searchBarEdit.setStyleSheet("font: 16pt \"Tahoma\";\n" "color: rgb(0, 0, 0);") self.searchBarEdit.setObjectName("searchBarEdit") self.horizontalLayout.addWidget(self.searchBarEdit) self.searchButton = QtWidgets.QPushButton(self.centralwidget) self.searchButton.setStyleSheet( "font: 16pt \"Tahoma\";\n" "background-color: rgb(255, 255, 255);\n" "color: rgb(0, 0, 0);") self.searchButton.setText("") icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("images.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.searchButton.setIcon(icon1) self.searchButton.setIconSize(QtCore.QSize(40, 40)) self.searchButton.setObjectName("searchButton") self.MainWindow = MainWindow self.searchButton.clicked.connect(self.search) self.horizontalLayout.addWidget(self.searchButton) self.verticalLayout.addLayout(self.horizontalLayout) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem1) self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget) self.radioButton_2.setStyleSheet("font: 14pt \"Tahoma\";\n" "color: rgb(0, 0, 0);") self.radioButton_2.setObjectName("radioButton_2") self.horizontalLayout_3.addWidget(self.radioButton_2) self.radioButton = QtWidgets.QRadioButton(self.centralwidget) self.radioButton.setStyleSheet("font: 14pt \"Tahoma\";\n" "color: rgb(0, 0, 0);") self.radioButton.setObjectName("radioButton") self.horizontalLayout_3.addWidget(self.radioButton) spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem2) self.verticalLayout.addLayout(self.horizontalLayout_3) spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem3) self.horizontalLayout_2.addLayout(self.verticalLayout) self.verticalLayout_2.addLayout(self.horizontalLayout_2) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.horizontalLayout_2.addLayout(self.verticalLayout) self.verticalLayout_2.addLayout(self.horizontalLayout_2) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.loading = QtWidgets.QLabel(self.centralwidget) self.loading.setText("") self.loading.setObjectName("loading") self.verticalLayout.addWidget( self.loading, 0, QtCore.Qt.AlignCenter | QtCore.Qt.AlignBottom) self.movie = QMovie("loading.gif", QByteArray(), self.loading) self.movie.setCacheMode(QMovie.CacheAll) self.movie.setSpeed(100) self.loading.setMovie(self.movie) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def search(self): self.movie.start() print(self.movie.state()) self.sig.connect(self.setupresUi) self.t = Thread(self) self.t.start() self.MainWindow.show() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Web Crawler")) self.titleLbl.setText(_translate("MainWindow", "Web Crawler")) self.radioButton_2.setText(_translate("MainWindow", "Web search")) self.radioButton.setText(_translate("MainWindow", "Site search")) def setresult(self, res): self.res = res
class XNCStatusBar(QStatusBar): def __init__(self, parent=None): super(XNCStatusBar, self).__init__(parent) # state vars self.world = XNovaWorld_instance() # initialization self.setSizeGripEnabled(True) # sub-widgets # progressbar self._progressbar = QProgressBar(self) self._progressbar.hide() self._progressbar.setValue(0) self._progressbar.setRange(0, 99) # online players counter self._lbl_online = QLabel(self.tr('Online') + ': 0', self) # label with loading.gif self._loading_gif = QMovie(':/i/loading.gif') self._lbl_loading = QLabel(self) self._lbl_loading.setMovie(self._loading_gif) self._lbl_loading.hide() # testing only self._btn_runscript = QPushButton('Run script', self) self._btn_runscript.clicked.connect(self.on_run_script) self.addPermanentWidget(self._btn_runscript) # self.addPermanentWidget(self._lbl_loading) self.addPermanentWidget(self._lbl_online) # should be las right widget self.show() def set_status(self, msg: str, timeout: int=0): self.showMessage(msg, timeout) def set_loading_status(self, loading: bool): if loading: self._lbl_loading.show() self._loading_gif.start() else: self._loading_gif.stop() self._lbl_loading.hide() def set_world_load_progress(self, comment: str, progress: int): """ Display world load progress in status bar :param comment: string comment of what is currently loading :param progress: percent progress, or -1 to disable """ if progress != -1: if not self._progressbar.isVisible(): self.insertPermanentWidget(0, self._progressbar) self._progressbar.show() msg = self.tr('Loading world') + ' ({0}%) {1}...'.format(progress, comment) logger.debug(msg) self._progressbar.setValue(progress) self.set_status(msg) else: self.removeWidget(self._progressbar) self._progressbar.hide() self._progressbar.reset() self.clearMessage() def update_online_players_count(self): op = self.world.get_online_players() self._lbl_online.setText(self.tr('Online') + ': {0}'.format(op)) # some functions may be useful, documentation: # void QStatusBar::clearMessage() # void QStatusBar::addPermanentWidget(QWidget * widget, int stretch = 0) # void QStatusBar::addWidget(QWidget * widget, int stretch = 0) # void QStatusBar::removeWidget(QWidget * widget) @pyqtSlot() def on_run_script(self): files = os.listdir('scripts') files.sort() script_files = [fn for fn in files if fn[0] != '.' and fn.endswith('.py')] # print(script_files) menu = QMenu(self) for script_filename in script_files: act = QAction(menu) act.setText('Run "scripts/' + script_filename + '"...') act.setData('scripts/' + script_filename) menu.addAction(act) act_ret = menu.exec(QCursor.pos()) if act_ret is None: return script_filename = str(act_ret.data()) s = '' try: with open(script_filename, 'rt', encoding='utf-8') as f: s = f.read() except IOError: pass if s != '': exec(s)
class Window(QWidget): bgWork: BgThread clk_stop_signal = pyqtSignal() bg_stop_signal = pyqtSignal() fan_signal = pyqtSignal() rec_signal = pyqtSignal() def __init__(self): super().__init__() self.full_screen = False self.val_list = [0] self.dial = [DialWidget(100)] * 8 self.sensor_name_list = ['General Combustible Gas', 'Alcohol', 'Natural Gas, Methane', 'LPG, Natural Gas, Coal Gas', 'LPG, Propane',\ 'Carbon Monoxide', 'Hydrogen', 'Air Quality Control'] self.sensor_pixmap = [ 'mq2.png', 'mq3.png', 'mq4.png', 'mq5.png', 'mq6.png', 'mq7.png', 'mq8.png', 'mq135.png' ] self.sensor_max_list = [255, 255, 255, 255, 255, 255, 255, 255] self.sensor_rec_list = [0, 0, 0, 0, 0, 0, 0, 0] self.fan_powered = True self.connected = False self.recording = False self.title = 'Telemetrie' self.current_page = 0 self.left = 100 self.top = 100 self.width = 1024 self.height = 600 self.black_color = '#000000' self.gray_color = '#373435' self.dark_gray_color = '#1b1a1a' self.green_color = '#92d500' self.blue_color = '#1bb2bb' self.dark_blue_color = '#2e679d' self.green_color = '#92d400' self.red_color = '#cd3301' self.white_color = '#FFFFFF' self.font_gray_color = '#828486' self.fan_anim = QMovie('res/pack/gas_icon_fan_on.gif') self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) id = QFontDatabase.addApplicationFont( 'res/font/BreuerText-Regular.ttf') # font = QFont(QFontDatabase.applicationFontFamilies(id)[0]) self.setStyleSheet('background-color:black; font-family: BreuerText') # stack pages: 0 - main menu, 1 - meter, 2 - data, 3 - config, 4 - help self.page_nr = 5 self.pages = list() for p in range(self.page_nr): self.pages.append(QWidget()) # ######### PAGE 0 MAIN self.layout_0 = QVBoxLayout() self.layout_0.setContentsMargins(0, 0, 0, 0) self.title_box1_0 = QHBoxLayout() self.title_box1_0.setContentsMargins(0, 0, 0, 0) self.defend_txt_0 = QLabel() self.defend_txt_0.setText('DEFEND Gas Sensor Data Fusion') self.defend_txt_0.setStyleSheet( 'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' % self.font_gray_color) self.title_box1_0.addWidget(self.defend_txt_0) self.title_box1_0.addSpacing(15) self.menu_grid_txt_0 = QGridLayout() self.menu_grid_txt_0.setContentsMargins(0, 0, 0, 0) self.menu_grid_txt_0.setSpacing(0) self.menu_label_txt_0 = QLabel() self.menu_label_txt_0.setText('METER') self.menu_label_txt_0.setStyleSheet( 'font-size: 18px;padding: 0px 33px 0px 28px; color: %s;' % self.font_gray_color) self.menu_grid_txt_0.addWidget(self.menu_label_txt_0, 0, 0) self.uart_label_txt_0 = QLabel() self.uart_label_txt_0.setText('DATA') self.uart_label_txt_0.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' % self.font_gray_color) self.menu_grid_txt_0.addWidget(self.uart_label_txt_0, 0, 1) self.data_label_txt_0 = QLabel() self.data_label_txt_0.setText('UART') self.data_label_txt_0.setStyleSheet( 'font-size: 18px;padding: 0px 40px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_0.addWidget(self.data_label_txt_0, 0, 2) self.fan_label_txt_0 = QLabel() self.fan_label_txt_0.setText('FAN') self.fan_label_txt_0.setStyleSheet( 'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_0.addWidget(self.fan_label_txt_0, 0, 3) self.title_box1_0.addLayout(self.menu_grid_txt_0) self.title_box1_0.addSpacing(15) self.gmt_label_0 = QLabel() self.gmt_label_0.setText('GMT +2') self.gmt_label_0.setStyleSheet( 'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' % self.font_gray_color) self.title_box1_0.addWidget(self.gmt_label_0) self.layout_0.addLayout(self.title_box1_0) self.title_box2_0 = QHBoxLayout() # second title box with pixmaps self.title_box2_0.setContentsMargins(0, 0, 0, 0) self.title_box2_0.setSpacing(0) self.frame1_0 = QFrame() self.frame1_0.setFixedWidth(240) self.frame1_0.setFixedHeight(80) self.frame1_0.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.defend_pix_0 = QLabel(self.frame1_0) self.defend_pix_0.setPixmap(QPixmap('res/pack/defend.png')) self.defend_pix_0.setFixedWidth(240) self.defend_pix_0.setAlignment(Qt.AlignCenter) self.title_box2_0.addWidget(self.frame1_0) self.title_box2_0.addSpacing(15) self.frame2_0 = QFrame() self.frame2_0.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame2_0.setFixedWidth(495) self.frame2_0.setFixedHeight(80) self.menu_grid_pix_0 = QGridLayout(self.frame2_0) self.menu_grid_pix_0.setContentsMargins(0, 0, 0, 0) self.menu_grid_pix_0.setSpacing(0) self.menu_label_pix_0 = QLabel() self.menu_label_pix_0.setPixmap(QPixmap('res/pack/gas_icon_meter.png')) self.menu_label_pix_0.setStyleSheet('padding: 5px 30px 0px 30px;') self.menu_label_pix_0.mousePressEvent = self.select_menu_meter self.menu_grid_pix_0.addWidget(self.menu_label_pix_0, 0, 0) self.uart_label_pix_0 = QLabel() self.uart_label_pix_0.setPixmap(QPixmap('res/pack/gas_icon_data.png')) self.uart_label_pix_0.setStyleSheet('padding: 5px 30px 0px 30px;') self.uart_label_pix_0.mousePressEvent = self.select_menu_data self.menu_grid_pix_0.addWidget(self.uart_label_pix_0, 0, 1) self.data_label_pix_0 = QLabel() self.data_label_pix_0.setPixmap(QPixmap('res/pack/gas_icon_UART.png')) self.data_label_pix_0.setStyleSheet('padding: 5px 30px 0px 30px;') self.data_label_pix_0.mousePressEvent = self.select_menu_config self.menu_grid_pix_0.addWidget(self.data_label_pix_0, 0, 2) self.fan_label_pix_0 = QLabel() self.fan_label_pix_0.setMovie(self.fan_anim) self.fan_label_pix_0.setStyleSheet('padding: 5px 30px 0px 30px;') self.fan_label_pix_0.mousePressEvent = self.toggle_fan self.menu_grid_pix_0.addWidget(self.fan_label_pix_0, 0, 3) self.title_box2_0.addWidget(self.frame2_0) self.title_box2_0.addSpacing(15) self.frame3_0 = QFrame() self.frame3_0.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame3_0.setFixedWidth(240) self.frame3_0.setFixedHeight(80) self.clock_box_0 = QHBoxLayout(self.frame3_0) self.time_label_pix_0 = QLabel() self.time_label_pix_0.setPixmap(QPixmap('res/pack/clock.png')) self.time_label_txt_0 = QLabel() self.time_label_txt_0.setText('00:00:00') self.time_label_txt_0.setStyleSheet('font-size: 40px; color: %s' % self.white_color) self.clock_box_0.addWidget(self.time_label_pix_0) self.clock_box_0.addWidget(self.time_label_txt_0) self.title_box2_0.addWidget(self.frame3_0) self.layout_0.addLayout(self.title_box2_0) self.defend_large_label = QLabel() self.defend_large_label.setPixmap(QPixmap('res/pack/defend_large.png')) self.defend_large_label.setStyleSheet('padding: 0px 0px 0px 0px;') self.defend_large_label.setAlignment(Qt.AlignCenter) self.layout_0.addSpacing(100) self.layout_0.addWidget(self.defend_large_label) self.layout_0.addStretch() self.pages[0].setLayout(self.layout_0) # #################### END PAGE 0 # ######### PAGE 1 METER self.layout_1 = QVBoxLayout() self.layout_1.setContentsMargins(0, 0, 0, 0) self.title_box1_1 = QHBoxLayout() self.title_box1_1.setContentsMargins(0, 0, 0, 0) self.defend_txt_1 = QLabel() self.defend_txt_1.setText('DEFEND Gas Sensor Data Fusion') self.defend_txt_1.setStyleSheet( 'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' % self.font_gray_color) self.title_box1_1.addWidget(self.defend_txt_1) self.title_box1_1.addSpacing(15) self.menu_grid_txt_1 = QGridLayout() self.menu_grid_txt_1.setContentsMargins(0, 0, 0, 0) self.menu_grid_txt_1.setSpacing(0) self.menu_label_txt_1 = QLabel() self.menu_label_txt_1.setText('MENU') self.menu_label_txt_1.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 30px; color: %s;' % self.font_gray_color) self.menu_grid_txt_1.addWidget(self.menu_label_txt_1, 0, 0) self.uart_label_txt_1 = QLabel() self.uart_label_txt_1.setText('UART') self.uart_label_txt_1.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' % self.font_gray_color) self.menu_grid_txt_1.addWidget(self.uart_label_txt_1, 0, 1) self.data_label_txt_1 = QLabel() self.data_label_txt_1.setText('DATA') self.data_label_txt_1.setStyleSheet( 'font-size: 18px;padding: 0px 40px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_1.addWidget(self.data_label_txt_1, 0, 2) self.fan_label_txt_1 = QLabel() self.fan_label_txt_1.setText('FAN') self.fan_label_txt_1.setStyleSheet( 'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_1.addWidget(self.fan_label_txt_1, 0, 3) self.title_box1_1.addLayout(self.menu_grid_txt_1) self.title_box1_1.addSpacing(15) self.gmt_label_1 = QLabel() self.gmt_label_1.setText('GMT +2') self.gmt_label_1.setStyleSheet( 'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' % self.font_gray_color) self.title_box1_1.addWidget(self.gmt_label_1) self.layout_1.addLayout(self.title_box1_1) self.title_box2_1 = QHBoxLayout() # second title box with pixmaps self.title_box2_1.setContentsMargins(0, 0, 0, 0) self.title_box2_1.setSpacing(0) self.frame1_1 = QFrame() self.frame1_1.setFixedWidth(240) self.frame1_1.setFixedHeight(80) self.frame1_1.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.defend_pix_1 = QLabel(self.frame1_1) self.defend_pix_1.setPixmap(QPixmap('res/pack/defend.png')) self.defend_pix_1.setFixedWidth(240) self.defend_pix_1.setAlignment(Qt.AlignCenter) self.title_box2_1.addWidget(self.frame1_1) self.title_box2_1.addSpacing(15) self.frame2_1 = QFrame() self.frame2_1.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame2_1.setFixedWidth(495) self.frame2_1.setFixedHeight(80) self.menu_grid_pix_1 = QGridLayout(self.frame2_1) self.menu_grid_pix_1.setContentsMargins(0, 0, 0, 0) self.menu_grid_pix_1.setSpacing(0) self.menu_label_pix_1 = QLabel() self.menu_label_pix_1.setPixmap( QPixmap('res/pack/gas_icon_main_menu.png')) self.menu_label_pix_1.setStyleSheet('padding: 5px 30px 0px 30px;') self.menu_label_pix_1.mousePressEvent = self.select_menu_main self.menu_grid_pix_1.addWidget(self.menu_label_pix_1, 0, 0) self.uart_label_pix_1 = QLabel() self.uart_label_pix_1.setPixmap(QPixmap('res/pack/gas_icon_UART.png')) self.uart_label_pix_1.setStyleSheet('padding: 5px 30px 0px 30px;') self.uart_label_pix_1.mousePressEvent = self.select_menu_config self.menu_grid_pix_1.addWidget(self.uart_label_pix_1, 0, 1) self.data_label_pix_1 = QLabel() self.data_label_pix_1.setPixmap(QPixmap('res/pack/gas_icon_data.png')) self.data_label_pix_1.setStyleSheet('padding: 5px 30px 0px 30px;') self.data_label_pix_1.mousePressEvent = self.select_menu_data self.menu_grid_pix_1.addWidget(self.data_label_pix_1, 0, 2) self.fan_label_pix_1 = QLabel() self.fan_label_pix_1.setMovie(self.fan_anim) self.fan_label_pix_1.setStyleSheet('padding: 5px 30px 0px 30px;') self.fan_label_pix_1.mousePressEvent = self.toggle_fan self.menu_grid_pix_1.addWidget(self.fan_label_pix_1, 0, 3) self.title_box2_1.addWidget(self.frame2_1) self.title_box2_1.addSpacing(15) self.frame3_1 = QFrame() self.frame3_1.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame3_1.setFixedWidth(240) self.frame3_1.setFixedHeight(80) self.clock_box_1 = QHBoxLayout(self.frame3_1) self.time_label_pix_1 = QLabel() self.time_label_pix_1.setPixmap(QPixmap('res/pack/clock.png')) self.time_label_txt_1 = QLabel() self.time_label_txt_1.setText('00:00:00') self.time_label_txt_1.setStyleSheet('font-size: 40px; color: %s' % self.white_color) self.clock_box_1.addWidget(self.time_label_pix_1) self.clock_box_1.addWidget(self.time_label_txt_1) self.title_box2_1.addWidget(self.frame3_1) self.layout_1.addLayout(self.title_box2_1) self.sensorsGrid = QGridLayout() self.sensorsGrid.setContentsMargins(0, 10, 0, 0) self.sensorsGrid.setSpacing(15) for j in range(0, 2): for k in range(0, 4): self.frame = QFrame(self) self.frame.setStyleSheet('background-color:%s;' % self.gray_color) self.cell = QVBoxLayout(self.frame) self.cell.setContentsMargins(0, 0, 0, 0) self.sensorLabel = QLabel() self.sensorLabel.setText(self.sensor_name_list[k + 4 * j]) self.sensorLabel.setStyleSheet( 'font-size: 18px;padding: 10px 0px 0px 0px; color: %s;' % self.white_color) self.sensorLabel.setAlignment(Qt.AlignHCenter) self.dial[k + 4 * j] = DialWidget(self.sensor_max_list[k + 4 * j]) self.dial[k + 4 * j].setFixedHeight(100) self.dial[k + 4 * j].setMinimumWidth(170) self.modelTxtLabel = QLabel() self.modelTxtLabel.setPixmap( QPixmap('res/pack/gas_icon_{}'.format( self.sensor_pixmap[k + 4 * j]))) self.modelTxtLabel.setAlignment(Qt.AlignLeft | Qt.AlignBottom) self.modelTxtLabel.mousePressEvent = lambda ev, nr=k + 4 * j: self.select_menu_help( nr) self.cell.addWidget(self.sensorLabel) self.cell.addWidget(self.dial[k + 4 * j]) self.cell.addWidget(self.modelTxtLabel) self.sensorsGrid.addWidget(self.frame, j, k) # self.layout1.addLayout(self.titleGridtext1) self.layout_1.addLayout(self.sensorsGrid) self.pages[1].setLayout(self.layout_1) # ################### END PAGE 1 # ######### PAGE 2 DATA self.layout_2 = QVBoxLayout() self.layout_2.setContentsMargins(0, 0, 0, 0) self.title_box1_2 = QHBoxLayout() self.title_box1_2.setContentsMargins(0, 0, 0, 0) self.defend_txt_2 = QLabel() self.defend_txt_2.setText('DEFEND Gas Sensor Data Fusion') self.defend_txt_2.setStyleSheet( 'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' % self.font_gray_color) self.title_box1_2.addWidget(self.defend_txt_2) self.title_box1_2.addSpacing(15) self.menu_grid_txt_2 = QGridLayout() self.menu_grid_txt_2.setContentsMargins(0, 0, 0, 0) self.menu_grid_txt_2.setSpacing(0) self.menu_label_txt_2 = QLabel() self.menu_label_txt_2.setText('MENU') self.menu_label_txt_2.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 30px; color: %s;' % self.font_gray_color) self.menu_grid_txt_2.addWidget(self.menu_label_txt_2, 0, 0) self.uart_label_txt_2 = QLabel() self.uart_label_txt_2.setText('UART') self.uart_label_txt_2.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' % self.font_gray_color) self.menu_grid_txt_2.addWidget(self.uart_label_txt_2, 0, 1) self.data_label_txt_2 = QLabel() self.data_label_txt_2.setText('METER') self.data_label_txt_2.setStyleSheet( 'font-size: 18px;padding: 0px 40px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_2.addWidget(self.data_label_txt_2, 0, 2) self.fan_label_txt_2 = QLabel() self.fan_label_txt_2.setText('FAN') self.fan_label_txt_2.setStyleSheet( 'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_2.addWidget(self.fan_label_txt_2, 0, 3) self.title_box1_2.addLayout(self.menu_grid_txt_2) self.title_box1_2.addSpacing(15) self.gmt_label_2 = QLabel() self.gmt_label_2.setText('GMT +2') self.gmt_label_2.setStyleSheet( 'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' % self.font_gray_color) self.title_box1_2.addWidget(self.gmt_label_2) self.layout_2.addLayout(self.title_box1_2) self.title_box2_2 = QHBoxLayout() # second title box with pixmaps self.title_box2_2.setContentsMargins(0, 0, 0, 0) self.title_box2_2.setSpacing(0) self.frame1_2 = QFrame() self.frame1_2.setFixedWidth(240) self.frame1_2.setFixedHeight(80) self.frame1_2.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.defend_pix_2 = QLabel(self.frame1_2) self.defend_pix_2.setPixmap(QPixmap('res/pack/defend.png')) self.defend_pix_2.setFixedWidth(240) self.defend_pix_2.setAlignment(Qt.AlignCenter) self.title_box2_2.addWidget(self.frame1_2) self.title_box2_2.addSpacing(15) self.frame2_2 = QFrame() self.frame2_2.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame2_2.setFixedWidth(495) self.frame2_2.setFixedHeight(80) self.menu_grid_pix_2 = QGridLayout(self.frame2_2) self.menu_grid_pix_2.setContentsMargins(0, 0, 0, 0) self.menu_grid_pix_2.setSpacing(0) self.menu_label_pix_2 = QLabel() self.menu_label_pix_2.setPixmap( QPixmap('res/pack/gas_icon_main_menu.png')) self.menu_label_pix_2.setStyleSheet('padding: 5px 30px 0px 30px;') self.menu_label_pix_2.mousePressEvent = self.select_menu_main self.menu_grid_pix_2.addWidget(self.menu_label_pix_2, 0, 0) self.uart_label_pix_2 = QLabel() self.uart_label_pix_2.setPixmap(QPixmap('res/pack/gas_icon_UART.png')) self.uart_label_pix_2.setStyleSheet('padding: 5px 30px 0px 30px;') self.uart_label_pix_2.mousePressEvent = self.select_menu_config self.menu_grid_pix_2.addWidget(self.uart_label_pix_2, 0, 1) self.data_label_pix_2 = QLabel() self.data_label_pix_2.setPixmap(QPixmap('res/pack/gas_icon_meter.png')) self.data_label_pix_2.setStyleSheet('padding: 5px 30px 0px 30px;') self.data_label_pix_2.mousePressEvent = self.select_menu_meter self.menu_grid_pix_2.addWidget(self.data_label_pix_2, 0, 2) self.fan_label_pix_2 = QLabel() self.fan_label_pix_2.setMovie(self.fan_anim) self.fan_label_pix_2.setStyleSheet('padding: 5px 30px 0px 30px;') self.fan_label_pix_2.mousePressEvent = self.toggle_fan self.menu_grid_pix_2.addWidget(self.fan_label_pix_2, 0, 3) self.title_box2_2.addWidget(self.frame2_2) self.title_box2_2.addSpacing(15) self.frame3_2 = QFrame() self.frame3_2.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame3_2.setFixedWidth(240) self.frame3_2.setFixedHeight(80) self.clock_box_2 = QHBoxLayout(self.frame3_2) self.time_label_pix_2 = QLabel() self.time_label_pix_2.setPixmap(QPixmap('res/pack/clock.png')) self.time_label_txt_2 = QLabel() self.time_label_txt_2.setText('00:00:00') self.time_label_txt_2.setStyleSheet('font-size: 40px; color: %s' % self.white_color) self.clock_box_2.addWidget(self.time_label_pix_2) self.clock_box_2.addWidget(self.time_label_txt_2) self.title_box2_2.addWidget(self.frame3_2) self.layout_2.addLayout(self.title_box2_2) self.data_label = QLabel() self.data_label.setPixmap(QPixmap('res/pack/data_background.png')) start_y = 47 start_x = 700 dif_y = 35 dif_x = 90 # probabilities self.acetone_probab_label = QLabel(self.data_label) self.acetone_probab_label.setText('0%') self.acetone_probab_label.setStyleSheet( 'background: transparent; border: 0px; width:100px;' 'border-radius: 10px;font-size: 18px; color: %s' % self.white_color) self.acetone_probab_label.setAlignment(Qt.AlignCenter) self.acetone_probab_label.move(start_x, start_y) self.ammonium_probab_label = QLabel(self.data_label) self.ammonium_probab_label.setText('0%') self.ammonium_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.ammonium_probab_label.setAlignment(Qt.AlignHCenter) self.ammonium_probab_label.move(start_x, start_y + dif_y) self.benzene_probab_label = QLabel(self.data_label) self.benzene_probab_label.setText('0%') self.benzene_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.benzene_probab_label.setAlignment(Qt.AlignHCenter) self.benzene_probab_label.move(start_x, start_y + 2 * dif_y) self.carbon_probab_label = QLabel(self.data_label) self.carbon_probab_label.setText('0%') self.carbon_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.carbon_probab_label.setAlignment(Qt.AlignHCenter) self.carbon_probab_label.move(start_x, start_y + 3 * dif_y) self.chlorine_probab_label = QLabel(self.data_label) self.chlorine_probab_label.setText('0%') self.chlorine_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.chlorine_probab_label.setAlignment(Qt.AlignHCenter) self.chlorine_probab_label.move(start_x, start_y + 4 * dif_y) self.ethanol_probab_label = QLabel(self.data_label) self.ethanol_probab_label.setText('0%') self.ethanol_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.ethanol_probab_label.setAlignment(Qt.AlignHCenter) self.ethanol_probab_label.move(start_x, start_y + 5 * dif_y) self.hydrogen_probab_label = QLabel(self.data_label) self.hydrogen_probab_label.setText('0%') self.hydrogen_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.hydrogen_probab_label.setAlignment(Qt.AlignHCenter) self.hydrogen_probab_label.move(start_x, start_y + 6 * dif_y) self.lpg_probab_label = QLabel(self.data_label) self.lpg_probab_label.setText('0%') self.lpg_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.lpg_probab_label.setAlignment(Qt.AlignHCenter) self.lpg_probab_label.move(start_x, start_y + 7 * dif_y) self.methane_probab_label = QLabel(self.data_label) self.methane_probab_label.setText('0%') self.methane_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.methane_probab_label.setAlignment(Qt.AlignHCenter) self.methane_probab_label.move(start_x, start_y + 8 * dif_y) self.nitrogen_probab_label = QLabel(self.data_label) self.nitrogen_probab_label.setText('0%') self.nitrogen_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.nitrogen_probab_label.setAlignment(Qt.AlignHCenter) self.nitrogen_probab_label.move(start_x, start_y + 9 * dif_y) self.propane_probab_label = QLabel(self.data_label) self.propane_probab_label.setText('0%') self.propane_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.propane_probab_label.setAlignment(Qt.AlignHCenter) self.propane_probab_label.move(start_x, start_y + 10 * dif_y) self.toluene_probab_label = QLabel(self.data_label) self.toluene_probab_label.setText('0%') self.toluene_probab_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.toluene_probab_label.setAlignment(Qt.AlignHCenter) self.toluene_probab_label.move(start_x, start_y + 11 * dif_y) # sensors self.acetone_sensors_label = QLabel(self.data_label) self.acetone_sensors_label.setText('MQ2 MQ3 MQ4 MQ5 MQ135') self.acetone_sensors_label.setStyleSheet( 'background: transparent; border: 0px; width:100px;' 'border-radius: 10px;font-size: 18px; color: %s' % self.white_color) self.acetone_sensors_label.setAlignment(Qt.AlignCenter) self.acetone_sensors_label.move(start_x + dif_x, start_y) self.ammonium_sensors_label = QLabel(self.data_label) self.ammonium_sensors_label.setText('MQ135') self.ammonium_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.ammonium_sensors_label.setAlignment(Qt.AlignHCenter) self.ammonium_sensors_label.move(start_x + dif_x, start_y + dif_y) self.benzene_sensors_label = QLabel(self.data_label) self.benzene_sensors_label.setText('MQ3') self.benzene_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.benzene_sensors_label.setAlignment(Qt.AlignHCenter) self.benzene_sensors_label.move(start_x + dif_x, start_y + 2 * dif_y) self.carbon_sensors_label = QLabel(self.data_label) self.carbon_sensors_label.setText('MQ2 MQ3 MQ4 MQ6 MQ7') self.carbon_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.carbon_sensors_label.setAlignment(Qt.AlignHCenter) self.carbon_sensors_label.move(start_x + dif_x, start_y + 3 * dif_y) self.chlorine_sensors_label = QLabel(self.data_label) self.chlorine_sensors_label.setText('MQ135') self.chlorine_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.chlorine_sensors_label.setAlignment(Qt.AlignHCenter) self.chlorine_sensors_label.move(start_x + dif_x, start_y + 4 * dif_y) self.ethanol_sensors_label = QLabel(self.data_label) self.ethanol_sensors_label.setText('MQ2 MQ4 MQ5 MQ135') self.ethanol_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.ethanol_sensors_label.setAlignment(Qt.AlignHCenter) self.ethanol_sensors_label.move(start_x + dif_x, start_y + 5 * dif_y) self.hydrogen_sensors_label = QLabel(self.data_label) self.hydrogen_sensors_label.setText('MQ2 MQ4 MQ7 MQ8') self.hydrogen_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.hydrogen_sensors_label.setAlignment(Qt.AlignHCenter) self.hydrogen_sensors_label.move(start_x + dif_x, start_y + 6 * dif_y) self.lpg_sensors_label = QLabel(self.data_label) self.lpg_sensors_label.setText('MQ2 MQ3 MQ4 MQ5 MQ6') self.lpg_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.lpg_sensors_label.setAlignment(Qt.AlignHCenter) self.lpg_sensors_label.move(start_x + dif_x, start_y + 7 * dif_y) self.methane_sensors_label = QLabel(self.data_label) self.methane_sensors_label.setText('MQ2 MQ3 MQ4 MQ5 MQ6') self.methane_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.methane_sensors_label.setAlignment(Qt.AlignHCenter) self.methane_sensors_label.move(start_x + dif_x, start_y + 8 * dif_y) self.nitrogen_sensors_label = QLabel(self.data_label) self.nitrogen_sensors_label.setText('MQ2 MQ4') self.nitrogen_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.nitrogen_sensors_label.setAlignment(Qt.AlignHCenter) self.nitrogen_sensors_label.move(start_x + dif_x, start_y + 9 * dif_y) self.propane_sensors_label = QLabel(self.data_label) self.propane_sensors_label.setText('MQ2') self.propane_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.propane_sensors_label.setAlignment(Qt.AlignHCenter) self.propane_sensors_label.move(start_x + dif_x, start_y + 10 * dif_y) self.toluene_sensors_label = QLabel(self.data_label) self.toluene_sensors_label.setText('MQ135') self.toluene_sensors_label.setStyleSheet( 'background: transparent; font-size: 18px; color: %s' % self.white_color) self.toluene_sensors_label.setAlignment(Qt.AlignHCenter) self.toluene_sensors_label.move(start_x + dif_x, start_y + 11 * dif_y) self.layout_2.addSpacing(10) self.layout_2.addWidget(self.data_label) self.pages[2].setLayout(self.layout_2) # ################### END PAGE 2 # ######### PAGE 3 CONFIG self.layout3 = QVBoxLayout() self.layout3.setContentsMargins(0, 0, 0, 0) self.title_box1_3 = QHBoxLayout() self.title_box1_3.setContentsMargins(0, 0, 0, 0) self.defend_txt_3 = QLabel() self.defend_txt_3.setText('DEFEND Gas Sensor Data Fusion') self.defend_txt_3.setStyleSheet( 'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' % self.font_gray_color) self.title_box1_3.addWidget(self.defend_txt_3) self.title_box1_3.addSpacing(15) self.menu_grid_txt_3 = QGridLayout() self.menu_grid_txt_3.setContentsMargins(0, 0, 0, 0) self.menu_grid_txt_3.setSpacing(0) self.menu_label_txt_3 = QLabel() self.menu_label_txt_3.setText('MENU') self.menu_label_txt_3.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 30px; color: %s;' % self.font_gray_color) self.menu_grid_txt_3.addWidget(self.menu_label_txt_3, 0, 0) self.uart_label_txt_3 = QLabel() self.uart_label_txt_3.setText('METER') self.uart_label_txt_3.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' % self.font_gray_color) self.menu_grid_txt_3.addWidget(self.uart_label_txt_3, 0, 1) self.data_label_txt_3 = QLabel() self.data_label_txt_3.setText('DATA') self.data_label_txt_3.setStyleSheet( 'font-size: 18px;padding: 0px 38px 0px 28px; color: %s;' % self.font_gray_color) self.menu_grid_txt_3.addWidget(self.data_label_txt_3, 0, 2) self.fan_label_txt_3 = QLabel() self.fan_label_txt_3.setText('FAN') self.fan_label_txt_3.setStyleSheet( 'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_3.addWidget(self.fan_label_txt_3, 0, 3) self.title_box1_3.addLayout(self.menu_grid_txt_3) self.title_box1_3.addSpacing(15) self.gmt_label_3 = QLabel() self.gmt_label_3.setText('GMT +2') self.gmt_label_3.setStyleSheet( 'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' % self.font_gray_color) self.title_box1_3.addWidget(self.gmt_label_3) self.title_box2_3 = QHBoxLayout() # second title box with pixmaps self.title_box2_3.setContentsMargins(0, 0, 0, 0) self.title_box2_3.setSpacing(0) self.frame1_3 = QFrame() self.frame1_3.setFixedWidth(240) self.frame1_3.setFixedHeight(80) self.frame1_3.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.defend_pix_3 = QLabel(self.frame1_3) self.defend_pix_3.setPixmap(QPixmap('res/pack/defend.png')) self.defend_pix_3.setFixedWidth(240) self.defend_pix_3.setAlignment(Qt.AlignCenter) self.title_box2_3.addWidget(self.frame1_3) self.title_box2_3.addSpacing(15) self.frame2_3 = QFrame() self.frame2_3.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame2_3.setFixedWidth(495) self.frame2_3.setFixedHeight(80) self.menu_grid_pix_3 = QGridLayout(self.frame2_3) self.menu_grid_pix_3.setContentsMargins(0, 0, 0, 0) self.menu_grid_pix_3.setSpacing(0) self.menu_label_pix_3 = QLabel() self.menu_label_pix_3.setPixmap( QPixmap('res/pack/gas_icon_main_menu.png')) self.menu_label_pix_3.setStyleSheet('padding: 5px 30px 0px 30px;') self.menu_label_pix_3.mousePressEvent = self.select_menu_main self.menu_grid_pix_3.addWidget(self.menu_label_pix_3, 0, 0) self.uart_label_pix_3 = QLabel() self.uart_label_pix_3.setPixmap(QPixmap('res/pack/gas_icon_meter.png')) self.uart_label_pix_3.setStyleSheet('padding: 5px 30px 0px 30px;') self.uart_label_pix_3.mousePressEvent = self.select_menu_meter self.menu_grid_pix_3.addWidget(self.uart_label_pix_3, 0, 1) self.data_label_pix_3 = QLabel() self.data_label_pix_3.setPixmap(QPixmap('res/pack/gas_icon_data.png')) self.data_label_pix_3.setStyleSheet('padding: 5px 30px 0px 30px;') self.data_label_pix_3.mousePressEvent = self.select_menu_data self.menu_grid_pix_3.addWidget(self.data_label_pix_3, 0, 2) self.fan_label_pix_3 = QLabel() self.fan_label_pix_3.setMovie(self.fan_anim) self.fan_label_pix_3.setStyleSheet('padding: 5px 30px 0px 30px;') self.fan_label_pix_3.mousePressEvent = self.toggle_fan self.menu_grid_pix_3.addWidget(self.fan_label_pix_3, 0, 3) self.title_box2_3.addWidget(self.frame2_3) self.title_box2_3.addSpacing(15) self.frame3_3 = QFrame() self.frame3_3.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame3_3.setFixedWidth(240) self.frame3_3.setFixedHeight(80) self.clock_box_3 = QHBoxLayout(self.frame3_3) self.time_label_pix_3 = QLabel() self.time_label_pix_3.setPixmap(QPixmap('res/pack/clock.png')) self.time_label_txt_3 = QLabel() self.time_label_txt_3.setText('00:00:00') self.time_label_txt_3.setStyleSheet('font-size: 40px; color: %s' % self.white_color) self.clock_box_3.addWidget(self.time_label_pix_3) self.clock_box_3.addWidget(self.time_label_txt_3) self.title_box2_3.addWidget(self.frame3_3) self.label33 = QLabel() self.label33.setText('CONNECT SERIAL') self.label33.setStyleSheet( 'font-size: 40px; padding:50px 10px 0px 5px; color: %s;height:20px' % self.green_color) self.label33.mousePressEvent = self.toggle_serial self.label3 = QLabel() self.label3.setText('START REC') self.label3.setStyleSheet( 'font-size: 40px; padding:50px 10px 0px 5px; color: %s;height:20px' % self.green_color) self.label3.mousePressEvent = self.toggle_recording self.layout3.addLayout(self.title_box1_3) self.layout3.addLayout(self.title_box2_3) self.layout3.addWidget(self.label33) self.layout3.addWidget(self.label3) self.layout3.addStretch() self.pages[3].setLayout(self.layout3) # ################### END PAGE 3 # ######### PAGE 4 MQ HELP self.layout_4 = QVBoxLayout() self.layout_4.setContentsMargins(0, 0, 0, 0) self.title_box1_4 = QHBoxLayout() self.title_box1_4.setContentsMargins(0, 0, 0, 0) self.defend_txt_4 = QLabel() self.defend_txt_4.setText('DEFEND Gas Sensor Data Fusion') self.defend_txt_4.setStyleSheet( 'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' % self.font_gray_color) self.title_box1_4.addWidget(self.defend_txt_4) self.title_box1_4.addSpacing(15) self.menu_grid_txt_4 = QGridLayout() self.menu_grid_txt_4.setContentsMargins(0, 0, 0, 0) self.menu_grid_txt_4.setSpacing(0) self.menu_label_txt_4 = QLabel() self.menu_label_txt_4.setText('MENU') self.menu_label_txt_4.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 30px; color: %s;' % self.font_gray_color) self.menu_grid_txt_4.addWidget(self.menu_label_txt_4, 0, 0) self.uart_label_txt_4 = QLabel() self.uart_label_txt_4.setText('UART') self.uart_label_txt_4.setStyleSheet( 'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' % self.font_gray_color) self.menu_grid_txt_4.addWidget(self.uart_label_txt_4, 0, 1) self.data_label_txt_4 = QLabel() self.data_label_txt_4.setText('METER') self.data_label_txt_4.setStyleSheet( 'font-size: 18px;padding: 0px 40px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_4.addWidget(self.data_label_txt_4, 0, 2) self.fan_label_txt_4 = QLabel() self.fan_label_txt_4.setText('FAN') self.fan_label_txt_4.setStyleSheet( 'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' % self.font_gray_color) self.menu_grid_txt_4.addWidget(self.fan_label_txt_4, 0, 3) self.title_box1_4.addLayout(self.menu_grid_txt_4) self.title_box1_4.addSpacing(15) self.gmt_label_4 = QLabel() self.gmt_label_4.setText('GMT +2') self.gmt_label_4.setStyleSheet( 'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' % self.font_gray_color) self.title_box1_4.addWidget(self.gmt_label_4) self.layout_4.addLayout(self.title_box1_4) self.title_box2_4 = QHBoxLayout() # second title box with pixmaps self.title_box2_4.setContentsMargins(0, 0, 0, 0) self.title_box2_4.setSpacing(0) self.frame1_4 = QFrame() self.frame1_4.setFixedWidth(240) self.frame1_4.setFixedHeight(80) self.frame1_4.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.defend_pix_4 = QLabel(self.frame1_4) self.defend_pix_4.setPixmap(QPixmap('res/pack/defend.png')) self.defend_pix_4.setFixedWidth(240) self.defend_pix_4.setAlignment(Qt.AlignCenter) self.title_box2_4.addWidget(self.frame1_4) self.title_box2_4.addSpacing(15) self.frame2_4 = QFrame() self.frame2_4.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame2_4.setFixedWidth(495) self.frame2_4.setFixedHeight(80) self.menu_grid_pix_4 = QGridLayout(self.frame2_4) self.menu_grid_pix_4.setContentsMargins(0, 0, 0, 0) self.menu_grid_pix_4.setSpacing(0) self.menu_label_pix_4 = QLabel() self.menu_label_pix_4.setPixmap( QPixmap('res/pack/gas_icon_main_menu.png')) self.menu_label_pix_4.setStyleSheet('padding: 5px 30px 0px 30px;') self.menu_label_pix_4.mousePressEvent = self.select_menu_main self.menu_grid_pix_4.addWidget(self.menu_label_pix_4, 0, 0) self.uart_label_pix_4 = QLabel() self.uart_label_pix_4.setPixmap(QPixmap('res/pack/gas_icon_UART.png')) self.uart_label_pix_4.setStyleSheet('padding: 5px 30px 0px 30px;') self.uart_label_pix_4.mousePressEvent = self.select_menu_config self.menu_grid_pix_4.addWidget(self.uart_label_pix_4, 0, 1) self.data_label_pix_4 = QLabel() self.data_label_pix_4.setPixmap(QPixmap('res/pack/gas_icon_meter.png')) self.data_label_pix_4.setStyleSheet('padding: 5px 30px 0px 30px;') self.data_label_pix_4.mousePressEvent = self.select_menu_meter self.menu_grid_pix_4.addWidget(self.data_label_pix_4, 0, 2) self.fan_label_pix_4 = QLabel() self.fan_label_pix_4.setMovie(self.fan_anim) self.fan_label_pix_4.setStyleSheet('padding: 5px 30px 0px 30px;') self.fan_label_pix_4.mousePressEvent = self.toggle_fan self.menu_grid_pix_4.addWidget(self.fan_label_pix_4, 0, 3) self.title_box2_4.addWidget(self.frame2_4) self.title_box2_4.addSpacing(15) self.frame3_4 = QFrame() self.frame3_4.setStyleSheet( 'background-color:%s; border: 0px; border-radius: 10px;' % self.dark_gray_color) self.frame3_4.setFixedWidth(240) self.frame3_4.setFixedHeight(80) self.clock_box_4 = QHBoxLayout(self.frame3_4) self.time_label_pix_4 = QLabel() self.time_label_pix_4.setPixmap(QPixmap('res/pack/clock.png')) self.time_label_txt_4 = QLabel() self.time_label_txt_4.setText('00:00:00') self.time_label_txt_4.setStyleSheet('font-size: 40px; color: %s' % self.white_color) self.clock_box_4.addWidget(self.time_label_pix_4) self.clock_box_4.addWidget(self.time_label_txt_4) self.title_box2_4.addWidget(self.frame3_4) self.layout_4.addLayout(self.title_box2_4) self.layout_4.addSpacing(10) self.sensor_details_label = QLabel() self.layout_4.addWidget(self.sensor_details_label) self.sensor_details_graph = GraphWidget(self.sensor_details_label) self.sensor_details_graph.move(20, 330) self.sensor_details_graph.resize(945, 120) self.pages[4].setLayout(self.layout_4) # ################### END PAGE 4 self.fan_anim.start() # ######### STACK self.stack = QStackedWidget() for page in self.pages: self.stack.addWidget(page) self.stack.setCurrentIndex(0) self.mainLayout = QVBoxLayout() self.mainLayout.addWidget(self.stack) self.setLayout(self.mainLayout) if self.full_screen is True: self.showFullScreen() else: self.show() # ################### def keyPressEvent(self, event): # ESC if event.key() == Qt.Key_Escape: self.clk_stop_signal.emit() self.close() elif event.key() == Qt.Key_0: self.stack.setCurrentIndex(0) elif event.key() == Qt.Key_1: self.stack.setCurrentIndex(1) elif event.key() == Qt.Key_2: self.stack.setCurrentIndex(2) elif event.key() == Qt.Key_3: self.stack.setCurrentIndex(3) elif event.key() == Qt.Key_4: self.stack.setCurrentIndex(4) def select_menu_main(self, ev): self.stack.setCurrentIndex(0) self.current_page = 0 def select_menu_meter(self, ev): self.stack.setCurrentIndex(1) self.current_page = 1 def select_menu_data(self, ev): self.stack.setCurrentIndex(2) self.current_page = 2 def select_menu_config(self, ev): self.stack.setCurrentIndex(3) self.current_page = 3 def select_menu_help(self, sensor_nr): self.sensor_details_label.setPixmap( QPixmap('res/pack/data_%s' % self.sensor_pixmap[sensor_nr])) self.stack.setCurrentIndex(4) self.current_page = 4 print(sensor_nr) def toggle_fan(self, ev): self.fan_powered = not self.fan_powered if self.fan_powered: self.fan_anim.start() else: self.fan_anim.stop() self.fan_signal.emit() def toggle_recording(self, ev): self.recording = not self.recording if self.recording: self.label3.setText('STOP REC') self.label3.setStyleSheet( 'font-size: 40px; padding: 50px 0px 0px 5px; color: %s;height:20px' % self.red_color) else: self.label3.setText('START REC') self.label3.setStyleSheet( 'font-size: 40px; padding: 50px 0px 0px 5px; color: %s;height:20px' % self.green_color) self.rec_signal.emit() def toggle_serial(self, ev): self.connected = not self.connected if self.connected: self.bgWork = BgThread() self.bgWork.signal_data.connect(self.data_slot) self.fan_signal.connect(self.bgWork.fanCmd) self.bg_stop_signal.connect(self.bgWork.endJob) self.rec_signal.connect(self.bgWork.recCmd) self.bgWork.start() self.label33.setText('DISCONNECT SERIAL') self.label33.setStyleSheet( 'font-size: 40px; padding: 50px 0px 0px 5px; color: %s;height:20px' % self.red_color) else: self.bg_stop_signal.emit() self.label33.setText('CONNECT SERIAL') self.label33.setStyleSheet( 'font-size: 40px; padding: 50px 0px 0px 5px; color: %s;height:20px' % self.green_color) @pyqtSlot(list) def data_slot(self, vals): for k in range(len(vals)): self.dial[k].update_fig(vals[k]) if self.sensor_rec_list[k] < vals[k]: self.sensor_rec_list[k] = vals[k] @pyqtSlot(str) def telemetry_select_slot(self, robo_name): self.robotLabel.setText(robo_name) @pyqtSlot(str) def clock_slot(self, t): self.time_label_txt_0.setText(t) self.time_label_txt_1.setText(t) self.time_label_txt_2.setText(t) self.time_label_txt_3.setText(t) self.time_label_txt_4.setText(t)
def init_pages(): # Page 1 set_shadow_effect(window.page_1_dialog) window.continue_button_active.hide() window.state_checkbox.stateChanged.connect(_state_checkbox_changed) window.continue_button_active.clicked.connect(next_page) # Page 2 set_shadow_effect(window.page_2_dialog) window.gender_error_label.hide() window.edu_error_label.hide() window.ethnic_error_label.hide() window.age_input.setAttribute(Qt.WA_MacShowFocusRect, 0) window.ethnic_input.setAttribute(Qt.WA_MacShowFocusRect, 0) window.age_input.textChanged.connect(check_age) window.male_radio.toggled.connect(check_gender) window.female_radio.toggled.connect(check_gender) window.edu_combo.currentIndexChanged.connect(check_edu) window.ethnic_combo.currentIndexChanged.connect(check_ethnic) window.ethnic_input.textChanged.connect(check_ethnic) window.continue_button.clicked.connect(_continue_button_clicked) # Page 3 set_shadow_effect(window.page_3_dialog) window.intro_text.setPlainText(window.intro_text.toPlainText().format( cfg['num_rounds'], cfg['multiplier'])) window.start_button.clicked.connect(next_page) # Page 4 set_shadow_effect(window.page_4_dialog) window.avatar_panel.hide() window.agent_avatar_1.hide() window.agent_name_label.hide() window.agent_age_label.hide() window.agent_gender_label.hide() window.agent_edu_label.hide() window.agent_ethnic_label.hide() window.loading_icon.hide() window.okay_button.hide() window.user_avatar_error_label.hide() window.user_name_error_label.hide() window.user_name_input.setAttribute(Qt.WA_MacShowFocusRect, 0) window.user_name_input.textChanged.connect(check_name) window.match_button.clicked.connect(_match_button_clicked) window.okay_button.clicked.connect(next_page) window.user_avatar_1 = QAvatar('default-avatar', _user_avatar_clicked, window.user_avatar_1) for i, avatar in enumerate(AVATARS): QAvatar(avatar, _avatar_clicked, getattr(window, f'avatar_{i}')) loading = QMovie('assets/loading.gif') loading.start() window.loading_icon.setMovie(loading) # Page 5 set_shadow_effect(window.page_5_dialog) window.user_name.hide() window.agent_name.hide() window.user_avatar_2.hide() window.agent_avatar_2.hide() window.dealing_icon.hide() window.result_button.hide() window.invest_error_label.hide() window.invest_input.setAttribute(Qt.WA_MacShowFocusRect, 0) window.total_coins_label.setText(str(sess['coins'])) window.invest_input.textChanged.connect(check_invest) window.confirm_button.clicked.connect(_confirm_button_clicked) window.result_button.clicked.connect(_result_button_clicked) dealing = QMovie('assets/dealing.gif') dealing.start() window.dealing_icon.setMovie(dealing) # Page 6 set_shadow_effect(window.page_6_dialog) window.finish_button.clicked.connect(_finish_button_clicked)
class Radar(QtGui.QLabel): def __init__(self, parent, radar, rect, myname): global xscale, yscale self.myname = myname self.rect = rect self.satellite = Config.satellite try: if radar["satellite"]: self.satellite = 1 except KeyError: pass self.baseurl = self.mapurl(radar, rect, False) print("google map base url: " + self.baseurl) self.mkurl = self.mapurl(radar, rect, True) self.wxurl = self.radarurl(radar, rect) print("radar url: " + self.wxurl) QtGui.QLabel.__init__(self, parent) self.interval = Config.radar_refresh * 60 self.lastwx = 0 self.retries = 0 self.setObjectName("radar") self.setGeometry(rect) self.setStyleSheet("#radar { background-color: grey; }") self.setAlignment(Qt.AlignCenter) self.wwx = QtGui.QLabel(self) self.wwx.setObjectName("wx") self.wwx.setStyleSheet("#wx { background-color: transparent; }") self.wwx.setGeometry(0, 0, rect.width(), rect.height()) self.wmk = QtGui.QLabel(self) self.wmk.setObjectName("mk") self.wmk.setStyleSheet("#mk { background-color: transparent; }") self.wmk.setGeometry(0, 0, rect.width(), rect.height()) self.wxmovie = QMovie() def mapurl(self, radar, rect, markersonly): # 'https://maps.googleapis.com/maps/api/staticmap?maptype=hybrid¢er='+rcenter.lat+','+rcenter.lng+'&zoom='+rzoom+'&size=300x275'+markersr; urlp = [] if len(ApiKeys.googleapi) > 0: urlp.append('key=' + ApiKeys.googleapi) urlp.append('center=' + str(radar['center'].lat) + ',' + str(radar['center'].lng)) zoom = radar['zoom'] rsize = rect.size() if rsize.width() > 640 or rsize.height() > 640: rsize = QtCore.QSize(rsize.width() / 2, rsize.height() / 2) zoom -= 1 urlp.append('zoom=' + str(zoom)) urlp.append('size=' + str(rsize.width()) + 'x' + str(rsize.height())) if markersonly: urlp.append('style=visibility:off') else: urlp.append('maptype=hybrid') for marker in radar['markers']: marks = [] for opts in marker: if opts != 'location': marks.append(opts + ':' + marker[opts]) marks.append( str(marker['location'].lat) + ',' + str(marker['location'].lng)) urlp.append('markers=' + '|'.join(marks)) return 'http://maps.googleapis.com/maps/api/staticmap?' + \ '&'.join(urlp) def radarurl(self, radar, rect): # wuprefix = 'http://api.wunderground.com/api/'; # wuprefix+wuapi+'/animatedradar/image.gif?maxlat='+rNE.lat+'&maxlon='+ # rNE.lng+'&minlat='+rSW.lat+'&minlon='+rSW.lng+wuoptionsr; # wuoptionsr = '&width=300&height=275&newmaps=0&reproj.automerc=1&num=5 # &delay=25&timelabel=1&timelabel.y=10&rainsnow=1&smooth=1'; rr = getCorners(radar['center'], radar['zoom'], rect.width(), rect.height()) if self.satellite: return (Config.wuprefix + ApiKeys.wuapi + '/animatedsatellite/lang:' + Config.wuLanguage + '/image.gif' + '?maxlat=' + str(rr['N']) + '&maxlon=' + str(rr['E']) + '&minlat=' + str(rr['S']) + '&minlon=' + str(rr['W']) + '&width=' + str(rect.width()) + '&height=' + str(rect.height()) + '&newmaps=0&reproj.automerc=1&num=5&delay=25' + '&timelabel=1&timelabel.y=10&smooth=1&key=sat_ir4_bottom') else: return (Config.wuprefix + ApiKeys.wuapi + '/animatedradar/lang:' + Config.wuLanguage + '/image.gif' + '?maxlat=' + str(rr['N']) + '&maxlon=' + str(rr['E']) + '&minlat=' + str(rr['S']) + '&minlon=' + str(rr['W']) + '&width=' + str(rect.width()) + '&height=' + str(rect.height()) + '&newmaps=0&reproj.automerc=1&num=5&delay=25' + '&timelabel=1&timelabel.y=10&rainsnow=1&smooth=1' + '&radar_bitmap=1&xnoclutter=1&xnoclutter_mask=1&cors=1') def basefinished(self): if self.basereply.error() != QNetworkReply.NoError: return self.basepixmap = QPixmap() self.basepixmap.loadFromData(self.basereply.readAll()) if self.basepixmap.size() != self.rect.size(): self.basepixmap = self.basepixmap.scaled(self.rect.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation) if self.satellite: p = QPixmap(self.basepixmap.size()) p.fill(Qt.transparent) painter = QPainter() painter.begin(p) painter.setOpacity(0.6) painter.drawPixmap(0, 0, self.basepixmap) painter.end() self.basepixmap = p self.wwx.setPixmap(self.basepixmap) else: self.setPixmap(self.basepixmap) def mkfinished(self): if self.mkreply.error() != QNetworkReply.NoError: return self.mkpixmap = QPixmap() self.mkpixmap.loadFromData(self.mkreply.readAll()) if self.mkpixmap.size() != self.rect.size(): self.mkpixmap = self.mkpixmap.scaled(self.rect.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation) br = QBrush(QColor(Config.dimcolor)) painter = QPainter() painter.begin(self.mkpixmap) painter.fillRect(0, 0, self.mkpixmap.width(), self.mkpixmap.height(), br) painter.end() self.wmk.setPixmap(self.mkpixmap) def wxfinished(self): if self.wxreply.error() != QNetworkReply.NoError: print ("get radar error " + self.myname + ":" + \ str(self.wxreply.error())) self.lastwx = 0 return print("radar map received:" + self.myname + ":" + time.ctime()) self.wxmovie.stop() self.wxdata = QtCore.QByteArray(self.wxreply.readAll()) self.wxbuff = QtCore.QBuffer(self.wxdata) self.wxbuff.open(QtCore.QIODevice.ReadOnly) mov = QMovie(self.wxbuff, 'GIF') print ("radar map frame count:" + self.myname + ":" + \ str(mov.frameCount()) + ":r" + str(self.retries)) if mov.frameCount() > 2: self.lastwx = time.time() self.retries = 0 else: # radar image retreval failed if self.retries > 3: # give up, last successful animation stays. # the next normal radar_refresh time (default 10min) will apply self.lastwx = time.time() return self.lastwx = 0 # count retries self.retries = self.retries + 1 # retry in 5 seconds QtCore.QTimer.singleShot(5 * 1000, self.getwx) return self.wxmovie = mov if self.satellite: self.setMovie(self.wxmovie) else: self.wwx.setMovie(self.wxmovie) if self.parent().isVisible(): self.wxmovie.start() def getwx(self): global lastapiget i = 0.1 # making sure there is at least 2 seconds between radar api calls lastapiget += 2 if time.time() > lastapiget: lastapiget = time.time() else: i = lastapiget - time.time() print("get radar api call spacing oneshot get i=" + str(i)) QtCore.QTimer.singleShot(i * 1000, self.getwx2) def getwx2(self): global manager try: if self.wxreply.isRunning(): return except Exception: pass print("getting radar map " + self.myname + ":" + time.ctime()) self.wxreq = QNetworkRequest( QUrl(self.wxurl + '&rrrand=' + str(time.time()))) self.wxreply = manager.get(self.wxreq) QtCore.QObject.connect(self.wxreply, QtCore.SIGNAL("finished()"), self.wxfinished) def getbase(self): global manager self.basereq = QNetworkRequest(QUrl(self.baseurl)) self.basereply = manager.get(self.basereq) QtCore.QObject.connect(self.basereply, QtCore.SIGNAL("finished()"), self.basefinished) def getmk(self): global manager self.mkreq = QNetworkRequest(QUrl(self.mkurl)) self.mkreply = manager.get(self.mkreq) QtCore.QObject.connect(self.mkreply, QtCore.SIGNAL("finished()"), self.mkfinished) def start(self, interval=0): if interval > 0: self.interval = interval self.getbase() self.getmk() self.timer = QtCore.QTimer() QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.getwx) def wxstart(self): print("wxstart for " + self.myname) if (self.lastwx == 0 or (self.lastwx + self.interval) < time.time()): self.getwx() # random 1 to 10 seconds added to refresh interval to spread the # queries over time i = (self.interval + random.uniform(1, 10)) * 1000 self.timer.start(i) self.wxmovie.start() QtCore.QTimer.singleShot(1000, self.wxmovie.start) def wxstop(self): print("wxstop for " + self.myname) self.timer.stop() self.wxmovie.stop() def stop(self): try: self.timer.stop() self.timer = None if self.wxmovie: self.wxmovie.stop() except Exception: pass
def __evt_loadstarted(self): if not self.__loadlabel.movie(): movie = QMovie(getPath('iconDir','loading.gif'), QByteArray(), self.__loadlabel) movie.setSpeed(50) self.__loadlabel.setMovie(movie) movie.start()
class InstallableTitlecard(QGroupBox): """An titlecard for the install page in the settings view""" def __init__(self, pluginEntry, parent): """PluginEntry QWidget -> Void Consumes a PluginEntry and the parent widget of the titlecard sets up the titlecard to the pluginEntry""" super().__init__() self.__parent = parent self._pluginEntry = pluginEntry # Should be set to 150, when there a some kind of info link / button. self.setMaximumHeight(300) bottom = QWidget() hbox = QHBoxLayout() bottom_label = QLabel(pluginEntry["author"]) bottom_label.setMargin(0) bottom_label.setIndent(0) hbox.addWidget(bottom_label) moreInfoLabel = QLabel("<a href='%s'>Details</a>" % pluginEntry["details"]) moreInfoLabel.setOpenExternalLinks(True) hbox.addWidget(moreInfoLabel) button_box = QDialogButtonBox(self) self.installButton = button_box.addButton( 'Install', QDialogButtonBox.DestructiveRole ) self.installButton.setCheckable(True) self.installButton.clicked.connect(self._onInstallButtonClicked) self.installButton.setIcon(QIcon.fromTheme("run-install", QIcon(DOWNLOAD_ICON_PATH))) hbox.addWidget(button_box) bottom.setLayout(hbox) bottom.setContentsMargins(0, 0, 0, 0) pluginInfoLabel = QLabel( """ <h2>%s <small>%s</small></h2> <p>%s</p> <p></p>""" % (pluginEntry["name"], pluginEntry["version"], pluginEntry["description"])) pluginInfoLabel.setWordWrap(True) vbox = QVBoxLayout() vbox.addWidget(pluginInfoLabel) vbox.addWidget(bottom) self.setLayout(vbox) def _standardIconFromStyle(self, iconName): """String -> QIcon Consumes the iconName for a given standard icon returns the corresponding icon on the current platform.""" return self.style().standardIcon(getattr(QStyle, iconName)) def _setInstallButtonIcon(self, frame): """QFrame -> Void Handles everey new frame in the spinner animation""" self.installButton.setIcon(QIcon(self._spinner.currentPixmap())) def _enablePluginInConfig(self, name): """String -> Bool Consumes the name of a plugin and enables it in the config""" return self._togglePluginInConfig(name, True) def _disablePluginInConfig(self, name): """String -> Bool Consumes the name of a plugin and disables it in the config""" return self._togglePluginInConfig(name, False) def _togglePluginInConfig(self, name, state): """String Bool -> Bool Consumes a name of a plugin and a state, sets the setting to state. If no setting is available for the plugin, it gets created. Returns the setting (Bool) """ if name not in core.config()["PluginManager"]["Plugins"]: core.config()["PluginManager"]["Plugins"][name] = {} core.config()["PluginManager"]["Plugins"][name]["Enabled"] = state return core.config()["PluginManager"]["Plugins"][name]["Enabled"] def _onInstallButtonClicked(self): """Handler for install button""" url = self._pluginEntry["download"] tmpName = str(uuid.uuid4()) + ".zip" self._downloadPath = os.path.join(TMP, tmpName) downloadThread = DownloadPluginThread(url, self._downloadPath) downloadThread.success.connect(self._onDownloadSuccess) downloadThread.failed.connect(self._onDownloadFailed) downloadThread.start() self._spinner = QMovie(SPINNER_ICON_PATH) self._spinner.frameChanged.connect(self._setInstallButtonIcon) self._spinner.start() self.installButton.setText("Installing...") self.installButton.setDisabled(True) def _onDownloadSuccess(self): """Install plugin if download succeeded""" helper.extractPlugin(self._downloadPath) # DONE rename folder to name Without version number newFolderName = self.modulename() oldFolderName = newFolderName + "-" + self._pluginEntry["version"] helper.renamePluginFolder(oldFolderName, newFolderName) # DONE load plugin self.__parent.addPluginToUserPlugins(self) self.setParent(None) def _onDownloadFailed(self): """Cleans up, if the download failed""" self.installButton.setIcon(QIcon.fromTheme("run-install", QIcon(DOWNLOAD_ICON_PATH))) QMessageBox( QMessageBox.Warning, "Could not install %s plugin." % self._pluginEntry["pluginname"], """The %s plugin could not be downloaded. Please check your internet connection.""" % self._pluginEntry["pluginname"]) def modulename(self): """Extracts the modulename detail url""" return self._pluginEntry["details"].split("/")[-1]
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.searchEdit.textChanged.connect(self.search_text_changed) self.ui.show_button.clicked.connect(self.show_episodes) self.ui.searchEdit.returnPressed.connect(self.show_episodes) self.episodes = None self.episode_list = None self.number = 0 self.anime_list = None self.ui.download_button.clicked.connect(self.download) self.ui.res_list_widget.currentItemChanged.connect(self.episode_change) self.com = Comunicate() self.com.sig.connect(self.message) self.com.img.connect(self.set_image) self.ui.anime_list_widget.itemDoubleClicked.connect(self.show_episodes) self.setWindowIcon(QIcon(get_file('animes.png'))) self.ui.anime_list_widget.itemPressed.connect(self.anime_entered) Thread(target=self.load_url_items).start() #self.load_url_items() self.movie = QMovie(get_file('ajax-loader.gif')) self.ui.loading_label.setMovie(self.movie) self.link = None self.main_download_page = None self.tray = SystemTrayIcon( QIcon(get_file('animes.png')), self.com, self) self.com.op.connect(self.show_semard) self.ui.action_About_Semard.triggered.connect(self.about_semard) self.ui.action_Contato.triggered.connect(self.show_feedback) self.setWindowTitle('Semard - Animes') self.browser = None self.player = None #self.player_window = player_w @Slot(str, bool) def openVideo(self, filepath, duplicate_mode): movie = os.path.expanduser(filepath) if 'http://' not in filepath: if not os.access(movie, os.R_OK): print(('Error: %s file is not readable' % movie)) sys.exit(1) split = urllib.parse.urlsplit(filepath) #name = QInputDialog.getText(self, 'Escolha nome do arquivo', 'Nome do arquivo:') name = split.path.split("/")[-1] #pa = os.path.join(res, name) if duplicate_mode: try: #media = instance.media_new(movie, 'sout=#duplicate{dst=file{dst=%s},dst=display}' % pa) pass except NameError: print(('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1], vlc.__version__, vlc.libvlc_get_version()))) else: try: #media = instance.media_new(movie) if sys.platform in 'win32': subprocess.Popen([os.path.join('vlc','vlc'), movie]) else: subprocess.Popen(['vlc', movie]) except NameError: print(('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1], vlc.__version__, vlc.libvlc_get_version()))) QMessageBox.critical(self, 'Erro','problema ao iniciar o vlc') # "--sout=#duplicate{dst=file{dst=example.mpg},dst=display}" #player = instance.media_player_new() #pplayer.set_media(media) #self.player_window.setMedia(media) #self.player_window.createUI() #self.player_window = Player() #media.parse() #self.player_window.setWindowTitle(media.get_meta(0)) #self.player_window.show() #self.player_window.resize(640, 480) #if sys.platform == "linux2": # for Linux using the X Server # pplayer.set_xwindow(self.player_window.videoframe.winId()) #elif sys.platform == "win32": # for Windows # pplayer.set_hwnd(self.player_window.videoframe.winId()) #elif sys.platform == "darwin": # for MacOS # pplayer.set_agl(self.player_window.videoframe.windId()) #pplayer.play() #self.player_window.updateUI() @Slot(str, str) def start_download(self, filepath, path): #thread = QThread(self) pbar = QProgressBar(self.ui.tab_downloads) pbar.setMinimum(0) pbar.setMaximum(100) pbar.setValue(0) self.ui.formLayout.addRow(os.path.basename(path), pbar) pbar.show() dw = Downloader(str(filepath), str(path), pbar) dw.finished.connect(self.finished_download) dw.progresschanged.connect(self.show_download_progress) dw.started.connect(self.started_download) Thread(target=dw.download).start() #thread.started.connect(dw.download) #thread.finished.connect(self.finished_download) #dw.moveToThread(thread) #thread.start() def finished_download(self, pbar, filename): self.tray.showMessage(filename, 'Download concluído.') pbar.setValue(100) pbar.setEnabled(False) def started_download(self, filename): filename = os.path.basename(filename) self.tray.showMessage(filename, 'Download iniciado.') @Slot(float, QProgressBar) def show_download_progress(self, progress, pbar): pbar.setValue(progress) def show_feedback(self): feed = Feedback(self.com) feed.exec_() def about_semard(self): about = QMessageBox.about(self, "Sobre Semard", """<b>Semard</b> v%s <p><b>Copyright (C) 2013</b> Ronnie Andrew.</p> <p>Todos os direitos reservados de acordo com a licença GNU GPL v3 ou posterior.</p> <p><b>Website Oficial:</b> <a href='https://github.com/ROAND/Series-Manager'>GitHub</a></p> <p><b>Plataforma: </b>%s</p> """ % (__version__, platform.system())) def show_semard(self, message): self.show() def closeEvent(self, event): self.hide() self.tray.showMessage('Semard', 'Semard ainda está em execução.') event.ignore() @Slot(str) def set_image(self, img_str): self.ui.image_label.setPixmap(QPixmap(img_str)) @Slot(str) def message(self, message): if str(message) in 'ended': self.ui.loading_label.hide() # self.repaint() self.ui.anime_list_widget.setEnabled(True) self.ui.show_button.setEnabled(True) self.movie.stop() if str(message) in 'started': self.ui.loading_label.show() # self.repaint() self.ui.anime_list_widget.setEnabled(False) self.ui.show_button.setEnabled(False) self.movie.start() def anime_entered(self, item): pass def load_url_items(self): self.com.sig.emit('started') self.main_download_page = AnimeList('http://www.anbient.net/lista') self.number, self.anime_list = self.main_download_page.get_attrs() self.ui.avaLabel.setText('%s disponiveis.' % self.number) self.add_full_items_animelist() self.com.sig.emit('ended') def episode_change(self): self.com.sig.emit('started') self.ui.options_list_widget.clear() if self.ui.res_list_widget.currentItem(): name = self.ui.res_list_widget.currentItem().text() episode = self.episode_list[name] self.ui.options_list_widget.addItems(episode.links) self.com.sig.emit('ended') def download(self): #name = self.ui.options_list_widget.currentItem().text() link = self.ui.options_list_widget.currentItem().text() self.com.sig.emit('started') msgBox = QMessageBox() msgBox.setWindowTitle('Informação') msgBox.setText('Browser padrão') msgBox.setInformativeText( 'Você deseja abrir este link com o seu browser padrão?') msgBox.setStandardButtons(QMessageBox.No | QMessageBox.Yes) msgBox.setDefaultButton(QMessageBox.Yes) ret = msgBox.exec_() if ret == QMessageBox.Yes: if sys.platform in 'win32': webbrowser.open(link) else: webbrowser.open(link) else: browser.ui.webView.setUrl(QUrl(link)) browser.show() self.com.sig.emit('ended') def keyPressEvent(self, event): if isinstance(event, PyQt5.QtGui.QKeyEvent): if event.key() == Qt.Key_Down: self.ui.anime_list_widget.setCurrentRow( self.ui.anime_list_widget.currentRow() + 1) elif event.key() == Qt.Key_Up: self.ui.anime_list_widget.setCurrentRow( self.ui.anime_list_widget.currentRow() - 1) @staticmethod def get_img_link(url): page = urllib.request.urlopen(url) page_string = page.read().decode('utf-8') soup = BeautifulSoup(page_string) spans = soup.find_all('span', {'id': 'posterspan'}) link = None for chil in spans: if isinstance(chil, bs4.element.Tag): for img in chil.children: if isinstance(img, bs4.element.Tag): link = img['src'] return link def show_ep_thread(self): self.ui.res_list_widget.clear() anime_name = self.ui.anime_list_widget.currentItem().text() link = self.anime_list[anime_name] self.episodes = EpisodeList(link) # self.episodes.join() self.link = self.get_img_link(link) self.episode_list = self.episodes.get_episodes() anime_name = self.ui.anime_list_widget.currentItem().text() link = self.anime_list[anime_name] img_link = self.get_img_link(link) file_name = img_link if os.path.exists(get_file(file_name)): self.com.img.emit(get_file(file_name)) # self.ui.image_label.setPixmap(QPixmap(get_file(file_name))) else: if img_link is not None: file_name = img_link.replace( 'http://www.anbient.net/sites/default/files/imagecache/242x0/imagens/poster/', '') urllib.request.urlretrieve( 'http://www.anbient.net/sites/default/files/imagecache/242x0/imagens/poster/%s' % file_name, get_file(file_name)) self.com.img.emit(get_file(file_name)) # self.ui.image_label.setPixmap(QPixmap(get_file(file_name))) self.ui.label_sinopse.setText(self.episodes.get_sinopse().strip()) try: for name in reversed(sorted(list(self.episode_list.keys()), key=int)): episode = self.episode_list[name] name, links = episode.get_attrs() self.ui.res_list_widget.addItem(name) except: for name, episode in reversed(sorted(self.episode_list.items())): name, links = episode.get_attrs() self.ui.res_list_widget.addItem(name) self.com.sig.emit('ended') def show_episodes(self): Thread(target=self.show_ep_thread).start() self.com.sig.emit('started') def add_full_items_animelist(self): self.ui.anime_list_widget.clear() for name, link in sorted(self.anime_list.items()): self.ui.anime_list_widget.addItem(name) def search_text_changed(self, new_text): items = self.ui.anime_list_widget.findItems(new_text, Qt.MatchContains) if items: self.ui.anime_list_widget.setCurrentItem(items[0]) self.ui.labelSearch.setText('') else: self.ui.labelSearch.setText('Not Found!') def setBrowser(self, browser_param): self.browser = browser_param self.browser.start_download.connect(self.start_download) self.browser.open_video.connect(self.openVideo)
def __init__(self): # to prevent GUI lockup in long run. #---------------------------------------------------------------------- QApplication.processEvents() super().__init__() #super(ChildWindow, self).__init__(parent) self.setFixedSize(1000, 500) self.setWindowTitle(' Sound Classification v3.0 ') self.setWindowIcon(QIcon('assets/icon.png')) # This part retrive the last saved position of the MainWindow before this windows appear. # displaying the this window in exact same postion. #---------------------------------------------------------------------------------------- try: self.settings = QSettings(" ", " ") self.restoreGeometry(self.settings.value("geometry", "")) self.restoreState(self.settings.value("windowState", "")) except: pass # Disabling the the close button here. #---------------------------------------------------------------------- # self.setWindowFlag(Qt.WindowCloseButtonHint, False) # Background Color. #---------------------------------------------------------------------- color = QColor("#3484A9") self.setAutoFillBackground(True) p = self.palette() p.setColor(self.backgroundRole(), color) self.setPalette(p) # Setting background Image. #---------------------------------------------------------------------- oImage = QImage("assets/main_background.jpg") sImage = oImage.scaled(QSize(1000, 500)) palette = QPalette() palette.setBrush(10, QBrush(sImage)) self.setPalette(palette) # defining all labels here. #---------------------------------------------------------------------- self.Label_sbg_bg1 = QLabel(self) self.Label_sbg_bg2 = QLabel(self) self.Label_sbg_title1 = QLabel(self) self.Label_sbg_title2 = QLabel(self) self.Label_predict111 = QLabel(self) self.Label_predict121 = QLabel(self) self.Label_predict131 = QLabel(self) self.Label_predict141 = QLabel(self) self.Label_setfreq = QLabel(self) self.Label_predict_totalClass = QLabel(self) self.Label_predict_className = QLabel(self) self.Label_predict_time = QLabel(self) self.Label_predict_recordText = QLabel(self) self.Label_predict_recordTextHeader = QLabel(self) self.Label_thres = QLabel(self) self.Label_predict11 = QLabel(self) self.Label_predict12 = QLabel(self) self.Label_predict13 = QLabel(self) self.Label_predict14 = QLabel(self) self.Label_predict_timeD = QLabel(self) self.Label_record = QLabel(self) # setting title text image here 'MODEL STATUS'. #---------------------------------------------------------------------- self.Label_title_ani1 = QLabel(self) self.Label_title_ani1.resize(277, 45) self.Label_title_ani1.move(115, 50) movie = QMovie("assets/model_status.png") self.Label_title_ani1.setMovie(movie) movie.start() # setting title text image here 'TRAINING'. #---------------------------------------------------------------------- self.Label_title_ani2 = QLabel(self) self.Label_title_ani2.resize(205, 67) self.Label_title_ani2.move(640, 40) movie = QMovie("assets/training.png") self.Label_title_ani2.setMovie(movie) movie.start() self.initUI() # calling stylesheet here. #---------------------------------------------------------------------- from Gunshot_Recognition_CSS import styleSheetTrain self.setStyleSheet(styleSheetTrain)
class LoginWidget(QWidget): # signals loginOk = pyqtSignal(str, dict) # (login(email), cookies{}) loginError = pyqtSignal(str) def __init__(self, parent=None): super(LoginWidget, self).__init__(parent) self.uifile = 'ui/login_widget.ui' self.pickle_filename = 'cache/login.dat' self.xnova_url = 'uni4.xnova.su' self.ui = None self.loading_gif = None # thread for network operations self.th = None def load_ui(self): self.ui = uic.loadUi(self.uifile, self) self.ui.lbl_loading.hide() self.ui.btn_login.clicked.connect(self.on_btn_login) self.ui.btn_register.clicked.connect(self.on_btn_register) self.loading_gif = QMovie(':/i/loading.gif') self.restore_login() # load xnova url from config/net.ini cfg = configparser.ConfigParser() cfg.read('config/net.ini', encoding='utf-8') if 'net' in cfg: self.xnova_url = cfg['net']['xnova_url'] def save_login(self): email = self.ui.le_email.text() password = self.ui.le_pass.text() remember = self.ui.chk_remember.isChecked() auth_data = (email, password, remember) try: cache_dir = pathlib.Path('./cache') if not cache_dir.exists(): cache_dir.mkdir() with open(self.pickle_filename, 'wb') as f: pickle.dump(auth_data, f) except pickle.PickleError as pe: pass except IOError as ioe: pass # except OSError as ose: # same as IOError in python3 ? # pass def restore_login(self): try: with open(self.pickle_filename, 'rb') as f: auth_data = pickle.load(f) self.ui.le_email.setText(auth_data[0]) self.ui.le_pass.setText(auth_data[1]) if auth_data[2]: self.ui.chk_remember.setChecked(True) else: self.ui.chk_remember.setChecked(False) except pickle.PickleError as pe: pass except IOError as ioe: pass @pyqtSlot() def on_btn_register(self): logger.debug('register clicked, opening [http://{0}/]'.format(self.xnova_url)) QDesktopServices.openUrl(QUrl('http://{0}/'.format(self.xnova_url))) @pyqtSlot() def on_btn_login(self): # logger.debug('login clicked') self.ui.btn_login.hide() self.ui.btn_register.hide() self.ui.le_email.setEnabled(False) self.ui.le_pass.setEnabled(False) self.ui.chk_remember.setEnabled(False) self.ui.lbl_loading.show() self.ui.lbl_loading.setMovie(self.loading_gif) self.loading_gif.start() if self.ui.chk_remember.isChecked(): self.save_login() # create thread object self.th = LoginThread(self) self.th.finished.connect(self.on_thread_finished) # get form data and start thread self.th.email = self.ui.le_email.text() self.th.password = self.ui.le_pass.text() self.th.remember = self.ui.chk_remember.isChecked() self.th.start() @pyqtSlot() def on_thread_finished(self): # logger.debug('thread finished') self.loading_gif.stop() self.ui.le_email.setEnabled(True) self.ui.le_pass.setEnabled(True) self.ui.chk_remember.setEnabled(True) self.ui.btn_login.show() self.ui.btn_register.show() self.ui.lbl_loading.hide() if self.th.login_ok: logger.info('Login ({0}) ok'.format(self.th.email)) cookies_dict = self.th.requests_cookiejar.get_dict() # logger.debug(cookies_dict) # emit signal self.loginOk.emit(self.th.email, cookies_dict) else: logger.error('Login error: {0}'.format(self.th.error_msg)) self.loginError.emit(self.th.error_msg) self.th = None
class alarmChecker(QWidget): def __init__(self, parent): super(alarmChecker, self).__init__() self.parent = parent self.networkError = False self.loadAlarm() self.getAlarm() self.getTimeout() self.getTimer() self.setLayout(self.alarm_layout) def loadAlarm(self): self.list_alarm = [] config = ConfigParser.ConfigParser() config.readfp(open(self.parent.config_path + 'alarm.cfg')) for a in config.sections(): dict = {"tableName": a} for b in config.options(a): dict[b] = config.get(a, b) self.list_alarm.append(dict) def getAlarm(self): self.alarm_layout = QGridLayout() self.movie = QMovie(self.parent.os_path + "/img/giphy2.gif", QByteArray(), self) self.movie_screen = QLabel() # Make label fit the gif self.movie_screen.setFixedSize(80, 50) # Add the QMovie object to the label self.movie.setCacheMode(QMovie.CacheAll) self.movie.setSpeed(100) self.movie_screen.setMovie(self.movie) self.movie.start() self.timeout_ack = [] self.dialog = self.dialogTimeout() self.dialog.hide() self.label_acq = QPushButton("ACQUISITION") self.label_acq.clicked.connect(self.dialog.show) self.label_acq.setFixedHeight(50) self.setColor("QPushButton", self.label_acq, "green") self.alarm_layout.addWidget(self.movie_screen, 0, 0, 1, 1) self.alarm_layout.addWidget(self.label_acq, 0, 1, 1, 2) for i, device in enumerate(self.list_alarm): name = device["tableName"] + device["key"] button = QPushButton(device["label"].upper()) button.setFixedHeight(50) self.setColor("QPushButton", button, "green") button.clicked.connect(partial(self.showWarning, "msg_%s" % name)) self.alarm_layout.addWidget(button, 0, i + 3, 1, 1) setattr(self, "alarm_%s" % name, button) self.watcher_alarm = QTimer(self) self.watcher_alarm.setInterval(5000) self.watcher_alarm.timeout.connect(self.checkCriticalValue) self.watcher_alarm.start() def getTimeout(self): self.device_dict = copy.deepcopy(self.parent.device_dict) self.timeout_limit = 90 self.list_timeout = [key for key, value in self.parent.device_dict.iteritems()] self.last_date = {} self.last_time = {} for key, value in self.device_dict.iteritems(): self.last_date[key] = 0 self.last_time[key] = datetime.datetime.now() def getTimer(self): watcher_timeout = QTimer(self) watcher_timeout.singleShot(2000, partial(self.showTimeout, 0)) self.checker_timeout = QTimer(self) self.checker_timeout.setInterval(15000) self.checker_timeout.timeout.connect(self.checkTimeout) self.checker_timeout.start() def showTimeout(self, i): for timeout in self.timeout_ack: try: self.list_timeout.remove(timeout) except ValueError: pass if not self.networkError: if self.list_timeout: if i < len(self.list_timeout): self.label_acq.setText("TIME OUT ON %s" % self.list_timeout[i]) self.setColor("QPushButton", self.label_acq, "red") i += 1 else: i = 0 else: self.label_acq.setText("ACQUISITION") self.setColor("QPushButton", self.label_acq, "green") else: self.label_acq.setText("SERVER LOST") self.setColor("QPushButton", self.label_acq, "orange") watcher_timeout = QTimer(self) watcher_timeout.singleShot(2000, partial(self.showTimeout, i)) def checkTimeout(self): for key, value in self.device_dict.iteritems(): return_values = self.parent.db.getLastData(key, "id") if return_values == -5: self.networkError = True elif type(return_values) is int: self.parent.showError(return_values) else: date, id = return_values self.networkError = False if date != self.last_date[key]: if self.last_date[key] != 0: if key in self.list_timeout: self.list_timeout.remove(key) self.last_time[key] = datetime.datetime.now() self.last_date[key] = date else: if (datetime.datetime.now() - self.last_time[key]).total_seconds() > self.timeout_limit: if key not in self.list_timeout: self.list_timeout.append(key) def checkCriticalValue(self): for device in self.list_alarm: name = device["tableName"] + device["key"] return_values = self.parent.db.getLastData(device["tableName"], device["key"]) if type(return_values) is not int: date, [val] = return_values fmt = "{:.5e}" if len(str(val)) > 8 else "{:.2f}" if float(device["lower_bound"]) <= val < float(device["higher_bound"]): msg = "%s OK \r %s <= %s < %s" % ( device["label"], device["lower_bound"], fmt.format(val), device["higher_bound"]) self.setColor("QPushButton", getattr(self, "alarm_%s" % name), "green") else: msg = "WARNING ! %s OUT OF RANGE \r %s <= %s < %s" % ( device["label"], device["lower_bound"], fmt.format(val), device["higher_bound"]) self.setColor("QPushButton", getattr(self, "alarm_%s" % name), "red") setattr(self, "msg_%s" % name, msg) else: print "code error : %i" % val def setColor(self, type, widget, color): if type == "QLabel": widget.setStyleSheet( "%s { background-color : %s; color : white; qproperty-alignment: AlignCenter; font: 15pt;}" % ( type, color)) else: widget.setStyleSheet("%s { background-color : %s; color : white; font: 15pt;}" % (type, color)) def ackTimeout(self, checkbox): if checkbox.isChecked(): if str(checkbox.text()) in self.timeout_ack: self.timeout_ack.remove(str(checkbox.text())) else: self.timeout_ack.append(str(checkbox.text())) def showWarning(self, attr): reply = QMessageBox.warning(self, 'Message', str(getattr(self, attr)), QMessageBox.Ok) def dialogTimeout(self): d = QDialog(self) d.setFixedWidth(450) d.setWindowTitle("Setting Devices Timeout") d.setVisible(True) vbox = QVBoxLayout() grid = QGridLayout() grid.setSpacing(20) for i, (key, value) in enumerate(self.parent.device_dict.iteritems()): checkbox = QCheckBox(key) checkbox.stateChanged.connect(partial(self.ackTimeout, checkbox)) checkbox.setCheckState(2) grid.addWidget(checkbox, 1 + i, 0, 1, 3) buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttonBox.button(QDialogButtonBox.Ok).clicked.connect(d.hide) buttonBox.button(QDialogButtonBox.Cancel).clicked.connect(d.hide) vbox.addLayout(grid) vbox.addWidget(buttonBox) d.setLayout(vbox) return d