Example #1
0
class T_window(QWidget):
    def __init__(self):
        super().__init__()
        self.tabs = QTabWidget()
        self.com = T_communication()
        self.pbar = QProgressBar()
        self.pbar.setFormat("Battery : %p%")
        self.grid = QGridLayout()

        self.setLayout(self.grid)
        self.grid.addWidget(self.pbar)
        self.grid.addWidget(self.tabs)

        self.dpi = T_dpi()
        self.com.getDpi(self.dpi)
        self.dpi.dataHasBeenSent()
        self.t = []
        for i in range(0, 4):
            self.t.append(T_tab(i, self.dpi, self.com))
            self.tabs.addTab(self.t[i], "Mode " + str(i + 1))

        self.data = T_data(self.pbar, self.tabs, self.dpi, self.com)
        for i in range(0, 4):
            self.t[i].sendButton.clicked.connect(self.data.sendDpi)
            self.t[i].resetButton.clicked.connect(self.com.resetDpi)
        self.timer = QBasicTimer()
        self.timer.start(100, self.data)
        self.tabs.currentChanged.connect(self.com.sendMode)
Example #2
0
 def mousePressEvent(self, event):
     if event.button() == Qt.LeftButton:
         self.handleMouseEventPos(event.pos())
         self.fLeftClickDown = True
     else:
         self.fLeftClickDown = False
     QProgressBar.mousePressEvent(self, event)
Example #3
0
class Loading(QWidget):
	ON = False #to prevent multiple instances
	def __init__(self):
		from ..constants import WINDOW as parent
		super().__init__(parent, Qt.FramelessWindowHint)
		self.widget = QWidget(self)
		self.widget.setStyleSheet("background-color:rgba(0, 0, 0, 0.65)")
		self.progress = QProgressBar()
		self.progress.setStyleSheet("color:white")
		self.text = QLabel()
		self.text.setAlignment(Qt.AlignCenter)
		self.text.setStyleSheet("color:white;background-color:transparent;")
		layout_ = QHBoxLayout()
		inner_layout_ = QVBoxLayout()
		inner_layout_.addWidget(self.text, 0, Qt.AlignHCenter)
		inner_layout_.addWidget(self.progress)
		self.widget.setLayout(inner_layout_)
		layout_.addWidget(self.widget)
		self.setLayout(layout_)
		self.resize(300,100)
		self.move(parent.window().rect().center()-QPoint(120,50))

	def mousePressEvent(self, QMouseEvent):
		pass

	def setText(self, string):
		if string != self.text.text():
			self.text.setText(string)
Example #4
0
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
 
    def initUI(self):
        self.progress_bar = QProgressBar(self)
        self.progress_bar.setGeometry(30, 40, 200, 25)
 
        self.btn = QPushButton('Start', self)
        self.btn.move(30, 80)
        self.btn.clicked.connect(self.doAction)
 
        self.timer = QBasicTimer()
        self.step = 0
 
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QProgressBar')
        self.show()
 
    def timerEvent(self, QTimerEvent):
        if self.step >= 100:
            self.timer.stop()
            self.btn.setText('Finished')
            return
        self.step += 1
        self.progress_bar.setValue(self.step)
 
    def doAction(self):
        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        else:
            self.timer.start(100, self)
            self.btn.setText('Stop')
Example #5
0
File: test7.py Project: klekot/YaP
class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def main_process(self):
        th = MyThread(10)
        th.start()
        for i in range(10):
            print("main process")
            sleep(2)

    def initUI(self):

        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)

        self.btn = QPushButton('Start', self)
        self.btn.move(40, 80)
        self.btn.clicked.connect(self.main_process)

        self.timer = QBasicTimer()
        self.step = 0

        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QProgressBar')
        self.show()
Example #6
0
 def __init__(self, parent=None):
     """
     Initialize the progress bar.
     :param parent: the parent widget
     """
     QProgressBar.__init__(self, parent)
     self.setFixedSize(300, 20)
Example #7
0
class Loading(QWidget):
	ON = False #to prevent multiple instances
	def __init__(self, parent=None):
		super().__init__(parent)
		self.widget = QWidget(self)
		self.progress = QProgressBar()
		self.progress.setStyleSheet("color:white")
		self.text = QLabel()
		self.text.setAlignment(Qt.AlignCenter)
		self.text.setStyleSheet("color:white;background-color:transparent;")
		layout_ = QHBoxLayout()
		inner_layout_ = QVBoxLayout()
		inner_layout_.addWidget(self.text, 0, Qt.AlignHCenter)
		inner_layout_.addWidget(self.progress)
		self.widget.setLayout(inner_layout_)
		layout_.addWidget(self.widget)
		self.setLayout(layout_)
		self.resize(300,100)
		#frect = self.frameGeometry()
		#frect.moveCenter(QDesktopWidget().availableGeometry().center())
		self.move(parent.window().frameGeometry().topLeft() +
			parent.window().rect().center() -
			self.rect().center() - QPoint(self.rect().width()//2,0))
		#self.setAttribute(Qt.WA_DeleteOnClose)
		#self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)

	def mousePressEvent(self, QMouseEvent):
		pass

	def setText(self, string):
		if string != self.text.text():
			self.text.setText(string)
Example #8
0
    def __init__(self, parent=None, numStages=1):
        QDialog.__init__(self, parent)

        self.threadRouter = ThreadRouter(self)
        self.currentStep = 0
        self.progress = None

        l = QVBoxLayout()
        self.setLayout(l)

        self.overallProgress = QProgressBar()
        self.overallProgress.setRange(0, numStages)
        self.overallProgress.setFormat("step %v of "+str(numStages))

        self.currentStepProgress = QProgressBar()
        self.currentStepProgress.setRange(0, 100)
        self.currentStepProgress.setFormat("%p %")

        self.overallLabel = QLabel("Overall progress")
        self.currentStepLabel = QLabel("Current step")

        l.addWidget(self.overallLabel)
        l.addWidget(self.overallProgress)
        l.addWidget(self.currentStepLabel)
        l.addWidget(self.currentStepProgress)
        l.maximumSize()

        self.update()
Example #9
0
    def mouseMoveEvent(self, event):
        if self.fIsReadOnly:
            return

        if self.fLeftClickDown:
            self.handleMouseEventPos(event.pos())

        QProgressBar.mouseMoveEvent(self, event)
Example #10
0
    def paintEvent(self, event):
        if self.fTextCall is not None:
            self.setFormat("%s %s %s" % (self.fPreLabel, self.fTextCall(), self.fLabel))
        elif self.fIsInteger:
            self.setFormat("%s %i %s" % (self.fPreLabel, int(self.fRealValue), self.fLabel))
        else:
            self.setFormat("%s %f %s" % (self.fPreLabel, self.fRealValue, self.fLabel))

        QProgressBar.paintEvent(self, event)
Example #11
0
    def setValue(self, value):
        self.fRealValue = value
        div = float(self.fMaximum - self.fMinimum)

        if div == 0.0:
            print("Parameter '%s' division by 0 prevented (value:%f, min:%f, max:%f)" % (self.fName, value, self.fMaximum, self.fMinimum))
            vper = 1.0
        else:
            vper = float(value - self.fMinimum) / div

        QProgressBar.setValue(self, int(vper * 10000))
class ProgressMessageBar(QObject):
    
    def __init__(self, iface, message, minValue=10, delta=40, connector=None):
        super(ProgressMessageBar, self).__init__()
        self.iface = iface
        self.minValue = minValue
        self.delta = delta
        self.progress = None
        self.msgBar = None
        self.aborted = False
        if self.iface is not None:
            self.msgBar = self.iface.messageBar().createMessage('DIVI',message)
            self.progress = QProgressBar()
            self.button = QPushButton(self.tr('Abort'))
            self.msgBar.layout().addWidget(self.progress)
            self.msgBar.layout().addWidget(self.button)
            self.iface.messageBar().pushWidget(self.msgBar, Qgis.Info)
            if connector is not None:
                self.button.clicked.connect(connector.abort)
                self.button.clicked.connect(self.abort)
    
    def setProgress(self, value):
        try:
            progress = self.minValue+int(self.delta*value)
            if self.iface is not None:
                self.iface.mainWindow().statusBar().showMessage( self.tr("Loading layer {} %").format(progress) )
                self.progress.setValue(progress)
        except RuntimeError:
            pass
    
    def setValue(self, value):
        try:
            if self.iface is not None:
                self.iface.mainWindow().statusBar().showMessage( self.tr("Loading layer {} %").format(value) )
                self.progress.setValue(value)
        except RuntimeError:
            pass
    
    def setBoundries(self, minValue=None, delta=None):
        if minValue is not None:
            self.minValue = minValue
        if delta is not None:
            self.delta = delta
    
    def abort(self):
        self.aborted = True
    
    def close(self):
        if self.iface is not None:
            self.iface.messageBar().popWidget(self.msgBar)
            self.progress = None
            self.msgBar = None
Example #13
0
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(640, 320)
        self.setWindowTitle('PyQt-5 WebEngine')

        page = "https://www.google.com"

        self.url = QLineEdit(page)
        self.url.setPlaceholderText(page)

        self.go = QPushButton("Ir")
        self.go.clicked.connect(self.btnIrClicked)

        self.nav_bar = QHBoxLayout()
        self.nav_bar.addWidget(self.url)
        self.nav_bar.addWidget(self.go)

        self.progress = QProgressBar()
        self.progress.setValue(0)

        html = """
        <!DOCTYPE HTML>
            <html>
                <head>
                    <title>Example Local HTML</title>
                </head>
                <body>
                    <p>Este es un archivo <code>HTML</code> local.</p>
                    <p>Si deseas acceder página indica su <code>URL</code> y presiona <b>Ir</b></p>
                </body>
            </html>
        """

        self.web_view = QWebEngineView()
        self.web_view.loadProgress.connect(self.webLoading)
        self.web_view.setHtml(html)

        root = QVBoxLayout()
        root.addLayout(self.nav_bar)
        root.addWidget(self.web_view)
        root.addWidget(self.progress)

        self.setLayout(root)

    def btnIrClicked(self, event):
        url = QUrl(self.url.text())
        self.web_view.page().load(url)

    def webLoading(self, event):
        self.progress.setValue(event)
class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):      

        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)

        self.btn = QPushButton('Start', self)
        self.btn.move(40, 80)
        self.btn.clicked.connect(self.doAction)

        # タイマー
        self.timer = QBasicTimer()
        self.step = 0
        
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QProgressBar')
        self.show()
        
        
    def timerEvent(self, e):
        # カウントが100に達すると終了
        if self.step >= 100:
            self.timer.stop()
            self.btn.setText('Finished')
            return
    
        # 呼ばれるたび1ずつ増やす
        self.step = self.step + 1
        self.pbar.setValue(self.step)
        

    def doAction(self):
        """ボタンが押されると呼ばれる"""

        # タイマーが実行中ならタイマーを停止する
        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        # タイマーが停止中ならタイマーを実行する
        else:
            # (timeout[ms], イベントの受取先)
            # timeoutで指定した時間間隔でシグナルが飛ぶ模様
            self.timer.start(1000, self)
            self.btn.setText('Stop')
Example #15
0
    def __init__(self, parent):
        QProgressBar.__init__(self, parent)

        self.fLeftClickDown = False
        self.fIsInteger     = False
        self.fIsReadOnly    = False

        self.fMinimum   = 0.0
        self.fMaximum   = 1.0
        self.fInitiated = False
        self.fRealValue = 0.0

        self.fLastPaintedValue   = None
        self.fCurrentPaintedText = ""

        self.fLabel = ""
        self.fName  = ""
        self.fPreLabel = " "
        self.fTextCall  = None
        self.fValueCall = None

        self.setFormat("(none)")

        # Fake internal value, 10'000 precision
        QProgressBar.setMinimum(self, 0)
        QProgressBar.setMaximum(self, 10000)
        QProgressBar.setValue(self, 0)
Example #16
0
class ShipHp(QWidget):
    def __init__(self, parent):
        super(ShipHp, self).__init__(parent)
        self.vbox = QVBoxLayout()
        self.vbox.setSpacing(0)
        self.vbox.setContentsMargins(0,3,0,3)

        self.setLayout(self.vbox)
        self.hp = QLabel(self)
        #self.hp.setMinimumSize(QSize(0, 50))
        self.vbox.addWidget(self.hp)

        self.hp_bar = QProgressBar(self)
        self.vbox.addWidget(self.hp_bar)
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.hp_bar.setSizePolicy(sizePolicy)
        self.hp_bar.setMinimumSize(QSize(100, 10))
        self.hp_bar.setMaximumSize(QSize(100, 10))

        self.vbox.addItem(QSpacerItem(40, 20,
                                      QSizePolicy.Minimum,
                                      QSizePolicy.Expanding))

    def set_hp(self, hp, maxhp):
        self.hp.setText(HP_FORMAT.format(hp, maxhp))
        self.hp_bar.setValue(hp*100/maxhp)
        self.hp_bar.setFormat('')
        rate = float(hp) / float(maxhp)
        if rate <= 0.25:
            self.setProperty('damage', 'serious')
        elif rate <= 0.50:
            self.setProperty('damage', 'middle')
        elif rate <= 0.75:
            self.setProperty('damage', 'slight')
        else:
            self.setProperty('damage', 'none')

        self.style().unpolish(self.hp_bar)
        self.style().polish(self.hp_bar)
        self.update()

    # for apply stylesheet
    def paintEvent(self, pe):
        opt = QStyleOption()
        opt.initFrom(self)
        p = QPainter(self)
        s = self.style()
        s.drawPrimitive(QStyle.PE_Widget, opt, p, self)
Example #17
0
 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()
Example #18
0
    def __init__(self,
                 label_text="Progress:",
                 label_font_size=10,
                 bar_width=100,
                 use_bar=None,
                 label_on_left=True,
                 show_bar_text=False,
                 *args, **kwargs):

        super().__init__(*args, **kwargs)

        if use_bar:
            self.bar = use_bar
        else:
            self.bar = QProgressBar(self)
        self.bar.reset()
        self.bar.setFixedWidth(bar_width)
        self.bar.setTextVisible(show_bar_text)

        self.label = QLabel(label_text, self)
        self.label.setAlignment(Qt.AlignRight)

        self.setStyleSheet("QLabel {font-size: %dpt}" % label_font_size)

        layout = QHBoxLayout()
        layout.setContentsMargins(0,0,0,0)

        if label_on_left:
            layout.addWidget(self.label)
            layout.addWidget(self.bar)
        else:
            layout.addWidget(self.bar)
            layout.addWidget(self.label)

        self.setLayout(layout)
Example #19
0
    def ui_create(self):
        #Add toolbar
        self.toolBar = QToolBar()
        self.toolBar.addAction(self.actionPageEmulation)
        self.toolBar.setFloatable(False)
        self.toolBar.setMovable(False)
        self.toolBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self.gridLayout.addWidget(self.toolBar, 1, 0)

        #Add a second toolbar on emulation page
        self.toolBarEmulation = QToolBar()
        self.toolBarEmulation.setFloatable(False)
        self.toolBarEmulation.setMovable(False)
        self.toolBarEmulation.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self.pageEmulationLayout.addWidget(self.toolBarEmulation, 0, 0)

        #Add progress bar to status bar
        self.taskProgress = QProgressBar()
        self.taskProgress.setVal = lambda x: ( self.taskProgress.setVisible(True), self.taskProgress.setValue(x) )
        self.taskProgress.setVal(0)
        self.taskProgress.setTextVisible(False)
        self.statusBar.addPermanentWidget(self.taskProgress)

        #Also print messages to terminal
        self.statusBar.showMsg = lambda msg, timeout: ( logging.info(msg), self.statusBar.showMessage(msg, timeout) )

        #Styling
        self.setStyleSheet('QToolButton { padding-right: -3px; }')
Example #20
0
    def __init__(self):
        QTreeWidgetItem.__init__(self)
        self.download_info = None
        self._logger = logging.getLogger('TriblerGUI')

        bar_container = QWidget()
        bar_container.setLayout(QVBoxLayout())
        bar_container.setStyleSheet("background-color: transparent;")

        self.progress_slider = QProgressBar()

        # We have to set a zero pixel border to get the background working on Mac.
        self.progress_slider.setStyleSheet("""
        QProgressBar {
            background-color: white;
            color: black;
            font-size: 12px;
            text-align: center;
            border: 0px solid transparent;
        }

        QProgressBar::chunk {
            background-color: #e67300;
        }
        """)

        bar_container.layout().addWidget(self.progress_slider)
        bar_container.layout().setContentsMargins(4, 4, 8, 4)

        self.progress_slider.setAutoFillBackground(True)
        self.bar_container = bar_container
Example #21
0
    def __init__(self,winParent, pose3d):
        super(percentajeWidget, self).__init__()
        self.winParent=winParent
        self.map = cv2.imread("resources/images/mapgrannyannie.png", cv2.IMREAD_GRAYSCALE)
        self.map = cv2.resize(self.map, (500, 500))
        image = QtGui.QImage(self.map.data, self.map.shape[1], self.map.shape[0], self.map.shape[1], QtGui.QImage.Format_Indexed8);
        self.pixmap = QtGui.QPixmap.fromImage(image)
        self.pose3d = pose3d
        self.percentajeHouse = 0
        self.numPixels = self.calculatePixelsWhite()
        self.numPixelsWalked = 0

        vLayout = QVBoxLayout()

        self.percentajeWalked()

        self.Percentaje = QLabel("Percentaje: " + str(round(self.percentajeHouse, 3)) + ' %')

        vLayout.addWidget(self.Percentaje, 0)

        self.bar = QProgressBar()
        self.bar.setValue(self.percentajeHouse)
        st = "QProgressBar::chunk {background-color: #ff0000;}\n QProgressBar {border: 1px solid grey;border-radius: 2px;text-align: center;background: #eeeeee;}"
        self.bar.setStyleSheet(st)
        self.bar.setTextVisible(False)
        vLayout.addWidget(self.Percentaje, 0)
        vLayout.addWidget(self.bar, 0)

        vSpacer = QSpacerItem(30, 80, QSizePolicy.Ignored, QSizePolicy.Ignored)
        vLayout.addItem(vSpacer)

        self.setLayout(vLayout)
Example #22
0
	def initUI(self):
		self.pbar = QProgressBar(self)
		self.pbar.setObjectName('pbar')
		self.pbar.setTextVisible(True)
		self.pbar.setFormat('Configuring...')

		self.timer = QBasicTimer()
		self.step = 0

		pixmap=QPixmap(':/Assets/moodly.gif')
		lbl=QLabel(self)
		lbl.setPixmap(pixmap)

		hbox1=QHBoxLayout()
		hbox1.addStretch(1)
		hbox1.addWidget(lbl)
		hbox1.addStretch(1)

		hbox2=QHBoxLayout()
		hbox2.addStretch(1)
		hbox2.addWidget(self.pbar)
		hbox2.addStretch(1)

		vbox=QVBoxLayout()
		vbox.addStretch(8)
		vbox.addLayout(hbox1)
		vbox.addStretch(1)
		vbox.addLayout(hbox2)
		vbox.addStretch(8)

		self.setLayout(vbox)
		self.callTimer()
Example #23
0
    def __init__(self):
        super(MainWindow, self).__init__()

        MainWindow._window_list.append(self)

        self.setupUi(self)

        # Qt Designer (at least to v4.2.1) can't handle arbitrary widgets in a
        # QToolBar - even though uic can, and they are in the original .ui
        # file.  Therefore we manually add the problematic widgets.
        self.lblAddress = QLabel("Address", self.tbAddress)
        self.tbAddress.insertWidget(self.actionGo, self.lblAddress)
        self.addressEdit = QLineEdit(self.tbAddress)
        self.tbAddress.insertWidget(self.actionGo, self.addressEdit)

        self.addressEdit.returnPressed.connect(self.actionGo.trigger)
        self.actionBack.triggered.connect(self.WebBrowser.GoBack)
        self.actionForward.triggered.connect(self.WebBrowser.GoForward)
        self.actionStop.triggered.connect(self.WebBrowser.Stop)
        self.actionRefresh.triggered.connect(self.WebBrowser.Refresh)
        self.actionHome.triggered.connect(self.WebBrowser.GoHome)
        self.actionSearch.triggered.connect(self.WebBrowser.GoSearch)

        self.pb = QProgressBar(self.statusBar())
        self.pb.setTextVisible(False)
        self.pb.hide()
        self.statusBar().addPermanentWidget(self.pb)

        self.WebBrowser.dynamicCall('GoHome()')
    def __init__(self, parent=None):
        super(ErgebnissVorlage, self).__init__(parent)

        self.auswahlAlter = QComboBox()
        self.auswahlAlter.addItem("Bitte auswählen")
        for i in range(3, 18):
            self.auswahlAlter.addItem("{} Jahre / Jahrgang {}".format(i, date.today().year - i))

        self.auswahlGeschlecht = QComboBox()
        self.auswahlGeschlecht.addItem("Bitte auswählen")
        self.auswahlGeschlecht.addItem("Männlich")
        self.auswahlGeschlecht.addItem("Weiblich")

        self.printerProgress = QProgressBar()
        self.printerProgress.hide()

        self.mainLayout = QFormLayout()
        self.mainLayout.addRow(QLabel("Alter:"),self.auswahlAlter)
        self.mainLayout.addRow(QLabel("Geschlecht:"),self.auswahlGeschlecht)
        self.mainLayout.addRow(self.printerProgress)

        self._drucken = QPushButton("Drucken")
        self._drucken.clicked.connect(self.drucken)

        self.mainLayout.addRow(self._drucken)

        self.setLayout(self.mainLayout)
Example #25
0
    def add_progressbar(self):
        """Add separate progress bar to splash screen"""

        self._progressBar = QProgressBar(self._splash)
        self._progressBar.setGeometry(self._splash.width() / 10, 8 * self._splash.height() / 10,
                               8 * self._splash.width() / 10, self._splash.height() / 10)
        self._progressBar.hide()
Example #26
0
 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()
Example #27
0
    def createProgressBar(self):
        self.progressBar = QProgressBar()
        self.progressBar.setRange(0, 10000)
        self.progressBar.setValue(0)

        timer = QTimer(self)
        timer.timeout.connect(self.advanceProgressBar)
        timer.start(1000)
    def extract2csv(self, tabWidget, d):
        name = tabWidget.tabText(tabWidget.currentIndex())
        wid = tabWidget.currentWidget()
        start = wid.dateStart.text()
        end = wid.dateEnd.text()
        end = False if end == 'Now' else end

        fail = []
        progress = QProgressBar()

        progress.setRange(0, len(self.tabCsv))
        d.layout().addWidget(progress)
        progress.setValue(0)

        for i, device in enumerate(self.tabCsv[name]):
            try:
                dataFrame = self.db.dataBetween(device.tablename, ','.join(device.keys), start=start, end=end)
                dataFrame.to_csv('/tmp/PFS-%s-%s.csv' % (start[:-6], device.tablename))
                progress.setValue(i + 1)
            except Exception as e:
                print (e)
                fail.append(device.tablename)

        if fail:
            self.showInformation("Extraction error on %s" % ','.join(fail))
        else:
            self.showInformation("Extraction Completed")
        d.close()
Example #29
0
class MyQt(QWidget):
    def __init__(self):
        super(MyQt, self).__init__()
        self.initUI()

    def initUI(self):
        # 构建一个进度条
        self.pbar = QProgressBar(self)
        # 从左上角30-50的界面,显示一个200*25的界面
        self.pbar.setGeometry(30, 50, 200, 25)  # 设置进度条的位置
        # 设置开始按钮
        self.btn = QPushButton('开始', self)
        self.btn.move(50, 90)  # 按钮移动的位置
        # 点击按钮
        # 信号函数不能加括号
        self.btn.clicked.connect(self.doAction)


        # 构建一个计时器
        self.timer = QBasicTimer()
        # 计数
        self.step = 0
        self.setGeometry(300,300,280,170)
        self.setWindowTitle('我是进度条')
        self.setWindowIcon(QIcon('1.jpg'))

        self.show()

    def doAction(self):
        # 判断是否处于激活状态
        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('开始')
        else:
            self.timer.start(100,self)
            self.btn.setText('停止')
    def timerEvent(self, *args, **kwargs):
        if self.step>=100:
            # 停止进度条
            self.timer.stop()
            self.btn.setText('完成')
            return
        self.step+=1
        # 把进度条每次充值的值赋给进图条
        self.pbar.setValue(self.step)
Example #30
0
    def __init__(self, cue, **kwargs):
        super().__init__(**kwargs)
        self.cue = None

        self._selected = False
        self._accurate_timing = False
        self._show_dbmeter = False
        self._countdown_mode = True

        self._dbmeter_element = None
        self._fade_element = None

        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setLayout(QGridLayout())

        self.layout().setContentsMargins(0, 0, 0, 0)
        self.layout().setSpacing(2)
        self.layout().setColumnStretch(0, 6)
        self.layout().setRowStretch(0, 4)

        self.nameButton = QClickLabel(self)
        self.nameButton.setObjectName('ButtonCueWidget')
        self.nameButton.setWordWrap(True)
        self.nameButton.setAlignment(Qt.AlignCenter)
        self.nameButton.setFocusPolicy(Qt.NoFocus)
        self.nameButton.clicked.connect(self._clicked)
        self.nameButton.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.layout().addWidget(self.nameButton, 0, 0)

        self.statusIcon = QLabel(self.nameButton)
        self.statusIcon.setStyleSheet('background-color: transparent')
        self.statusIcon.setPixmap(CueWidget.STOP.pixmap(CueWidget.ICON_SIZE,
                                                        CueWidget.ICON_SIZE))

        self.seekSlider = QClickSlider(self.nameButton)
        self.seekSlider.setOrientation(Qt.Horizontal)
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.setVisible(False)

        self.dbMeter = QDbMeter(self)
        self.dbMeter.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.dbMeter.setVisible(False)

        self.timeBar = QProgressBar(self)
        self.timeBar.setTextVisible(False)
        self.timeBar.setLayout(QHBoxLayout())
        self.timeBar.layout().setContentsMargins(0, 0, 0, 0)
        self.timeDisplay = QLCDNumber(self.timeBar)
        self.timeDisplay.setStyleSheet('background-color: transparent')
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display('00:00:00')
        self.timeBar.layout().addWidget(self.timeDisplay)
        self.timeBar.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.timeBar.setVisible(False)

        self._set_cue(cue)
Example #31
0
class MainWindow(QWidget):
    def __init__(self, appctxt, config, configPath):
        super().__init__()
        self.lastOpenFoldPath = str(Path.home())
        self.outputFileNameValue = ""
        self.outputFoldPath = config['lastPath'] or str(Path.home())
        self.splitWayValue = config['byWay']
        self.config = config
        self.appctxt = appctxt
        self.configPath = configPath
        self.initUI()

    def initUI(self):
        self.setAutoFillBackground(True)
        pattern = self.palette()
        pattern.setColor(QtGui.QPalette.Background, QColor("#EFFCFC"))
        self.setPalette(pattern)

        mainLayout = QVBoxLayout()
        uploadButton = QPushButton()
        uploadButton.setObjectName("upload")
        uploadButton.setCursor(QtCore.Qt.PointingHandCursor)
        uploadButton.clicked.connect(self.handleOpenPDF)
        icon = QtGui.QIcon()
        iconPath = appctxt.get_resource("images/pdf.png")
        icon.addPixmap(QtGui.QPixmap(iconPath))
        uploadButton.setIcon(icon)
        uploadButton.setIconSize(QSize(30, 30))

        note = QLabel(
            '如何分页,默认为1,也可以自定义, Exp * [2] 表示每隔2页分隔成一个PDF *  [2,3] 表示第一个文档取前2页,第二个文档取接下去的3页,3. * [1-2,3-5] 表示 1~2页分割成一个文档, 3~5页分割成一个文档'
        )
        note.setObjectName('note')
        note.setWordWrap(True)

        self.outputFileName = QLineEdit()
        self.outputFileName.setPlaceholderText('输出文件名称')
        self.outputFileName.setDisabled(True)

        # self.compressCheckBox = QCheckBox()
        # self.compressCheckBox.setText("输出文件是否打包压缩")
        self.categoryByTime = QCheckBox()
        self.categoryByTime.setText("输出文件夹按时间分类")

        state = 0
        if self.config['byTime'] == True:
            state = 2
        else:
            state = 0
        self.categoryByTime.setCheckState(state)
        self.categoryByTime.stateChanged.connect(self.byTimeChecked)
        self.categoryByTime.setDisabled(True)

        self.outputFold = ClickableLineEdit()
        self.outputFold.setText(self.outputFoldPath)
        self.outputFold.setPlaceholderText("输出文件夹位置")
        self.outputFold.clicked.connect(self.selectOutputFold)
        self.outputFold.textChanged.connect(self.textChangedOutputFold)
        self.outputFold.setDisabled(True)

        doButton = QPushButton("执行")
        doButton.setObjectName("do")
        doButton.setCursor(QtCore.Qt.PointingHandCursor)
        doButton.clicked.connect(self.handleSplitPDF)
        doButton.setDisabled(True)
        self.doButton = doButton
        self.splitWay = QLineEdit()
        self.splitWay.setText(self.splitWayValue)
        self.splitWay.textChanged.connect(self.splitWayChange)
        self.splitWay.setDisabled(True)

        self.fileName = QLabel('文件名称')
        self.pageNumber = QLabel("文件页数")
        self.fileSize = QLabel("文件大小")
        self.updateTime = QLabel("文件最近更新时间")

        self.setLayout(mainLayout)
        self.setGeometry(300, 200, 500, 600)

        self.setWindowTitle('PDF 分割工具')
        self.progressStatus = QProgressBar()
        self.progressStatus.setObjectName("progressBar")
        self.progressStatus.setGeometry(0, 0, 500, 20)
        self.progressStatus.setMaximum(100)
        self.progressStatus.setMinimum(0)
        self.progressStatus.setTextVisible(False)
        self.progressStatus.setVisible(False)

        # self.progressStatus.setHidden(True)

        headerGridGroup = QGroupBox()
        bodyGridGroup = QGroupBox()
        gridHeaderLayout = QGridLayout()
        gridHeaderLayout.addWidget(uploadButton, 1, 1, 4, 1)  # row 1 col 2
        gridHeaderLayout.addWidget(self.fileName, 1, 2, 1, 1)
        gridHeaderLayout.addWidget(self.pageNumber, 2, 2, 1, 1)
        gridHeaderLayout.addWidget(self.fileSize, 3, 2, 1, 1)
        gridHeaderLayout.addWidget(self.updateTime, 4, 2, 1, 1)

        gridBodyLayout = QGridLayout()
        gridBodyLayout.addWidget(self.outputFileName, 2, 1, 1,
                                 2)  # row 2 col 1
        gridBodyLayout.addWidget(self.outputFold, 3, 1, 1, 2)

        gridBodyLayout.addWidget(self.categoryByTime, 4, 1, 1, 2)

        gridBodyLayout.addWidget(note, 7, 1, 1, 2)
        gridBodyLayout.addWidget(self.splitWay, 8, 1, 1, 2)
        gridBodyLayout.addWidget(doButton, 9, 2, 1, 1)
        gridBodyLayout.addWidget(self.progressStatus, 10, 1, 1, 2)

        headerGridGroup.setLayout(gridHeaderLayout)
        bodyGridGroup.setLayout(gridBodyLayout)

        mainLayout.addWidget(headerGridGroup)
        mainLayout.addWidget(bodyGridGroup)

    def byTimeChecked(self):
        self.config['byTime'] = self.categoryByTime.isChecked()
        self.updateConfigFile()

    def textChangedOutputFold(self):
        self.config['lastPath'] = self.outputFold.text()
        self.updateConfigFile()

    def splitWayChange(self):
        self.config['byWay'] = self.splitWay.text()
        self.updateConfigFile()

    def selectOutputFold(self):
        foldName = QFileDialog.getExistingDirectory(self, "选择存放文件夹")
        self.outputFoldPath = str(foldName)
        self.outputFold.setText(foldName)

    def handleOpenPDF(self):
        lastOpenFoldPath = self.lastOpenFoldPath
        fname = QFileDialog.getOpenFileName(self, '打开PDF文件', lastOpenFoldPath,
                                            "pdf(*.pdf)")

        if fname[0]:
            fileName = os.path.splitext(os.path.basename(fname[0]))[0]

            fileSizeByte = os.path.getsize(fname[0])
            fileSize = "{:.2f}".format(fileSizeByte / 1024 / 1024) + 'M'
            updateTime = strftime("%Y-%m-%d %H:%M:%S",
                                  gmtime(os.path.getmtime(fname[0])))
            self.inputPDF = PdfFileReader(open(fname[0], "rb"))
            pageNumber = str(self.inputPDF.numPages) + '页'

            self.lastOpenFoldPath = str(
                pathlib.Path(fname[0]).parent.absolute())

            self.outputFileNameValue = fileName

            self.fileName.setText('文件名:' + self.outputFileNameValue)
            self.pageNumber.setText('PDF总页数:' + pageNumber)
            self.fileSize.setText('文件大小:' + fileSize)
            self.updateTime.setText('最近更新时间:' + updateTime)

            outputName = os.path.splitext(fileName)[0]
            self.outputFileName.setText(outputName)
            self.outputFileName.setDisabled(False)
            self.outputFold.setDisabled(False)
            self.doButton.setDisabled(False)
            self.outputFileName.setDisabled(False)
            self.categoryByTime.setDisabled(False)
            self.splitWay.setDisabled(False)

    # 弹框展示错误信息
    def showDialog(self, message):
        msgBox = QMessageBox()
        msgBox.setIcon(QMessageBox.Information)
        msgBox.setText(message)
        msgBox.exec()

    # 信息验证
    def checkInfomationValidate(self):
        fileName = self.outputFileName.text()
        outputPath = self.outputFold.text()
        splitWay = self.splitWay.text()

        if not len(fileName):
            return {'status': False, "msg": "请填写需要输出的文件的名称"}

        if not len(outputPath):
            return {'status': False, 'msg': '请选择需要输出的文件的存放地址'}

        if not len(splitWay):
            return {'status': False, 'msg': '请指定分割方法'}

        return {'status': True, 'msg': ''}

    def updateConfigFile(self):
        with open(self.configPath, 'w') as f:
            json.dump(self.config, f)

    def handleSetSplitWay(self):
        pass

    def handleSplitPDF(self):

        self.checkInfomationValidate()
        self.doButton.setVisible(False)
        self.progressStatus.setVisible(True)
        fileName = self.outputFileName.text()
        outputPath = self.outputFold.text()
        splitWay = self.splitWay.text()
        # compress = self.compressCheckBox.checkState()
        categoryByTime = self.categoryByTime.checkState()
        # print(compress, categoryByTime)
        funcWays = []
        try:
            ways = splitWay.split(",")

            for i in ways:
                stripText = i.strip()
                if '-' in splitWay:
                    p = [int(i.strip()) for i in stripText.split('-')]
                else:
                    p = int(i.strip())
                funcWays.append(p)
        except:
            self.showDialog("指定文件分页方式有误!")

        inputPDF = self.inputPDF
        totalNumber = inputPDF.numPages
        pages = []

        def doPage(page, size, total):
            t = [*range(page, page + size, 1)]
            t = list(filter(lambda x: x <= total, t))
            return t

        if len(funcWays) == 1 and (not isinstance(funcWays[0], list)):
            #固定分页
            tmp = [*range(1, totalNumber + 1, funcWays[0])]
            pages = [doPage(i, funcWays[0], totalNumber) for i in tmp]

        else:
            #自定义分页

            if isinstance(funcWays[0], list):
                # [[1,2], [3,4]

                tmp = []
                for i in funcWays:
                    t = [*range(i[0], i[1] + 1, 1)]
                    tmp.append(t)
                pages = tmp

            else:

                tmp = []
                start = 1
                for i in funcWays:
                    end = start + i
                    if end > totalNumber:
                        end = totalNumber + 1
                    p = [*range(start, end, 1)]
                    start = p[-1] + 1
                    tmp.append(p)
                pages = tmp

        dirname = os.path.join(self.outputFoldPath, self.outputFileNameValue)

        if categoryByTime == 2:
            timeDir = strftime("%Y-%m-%d", gmtime())
            dirname = os.path.join(self.outputFoldPath, timeDir,
                                   self.outputFileNameValue)
            print(self.outputFoldPath, timeDir, self.outputFileNameValue)

        if not os.path.exists(dirname):
            os.makedirs(dirname)

        print("last pages", pages)
        for i in pages:
            output = PdfFileWriter()
            for p in i:
                if p <= totalNumber:
                    output.addPage(inputPDF.getPage(p - 1))
                    self.progressStatus.setValue(p % totalNumber * 100)
            stri = []
            if len(i) == 1:
                stri = [str(d) for d in i]
            else:
                stri = [str(i[0]), str(i[-1])]
            name = self.outputFileNameValue + '-'.join(stri) + '.pdf'
            with open(os.path.join(dirname, name), "wb") as outputStream:
                output.write(outputStream)

        self.doButton.setVisible(True)
        self.progressStatus.setVisible(False)
Example #32
0
 def _status_bar_add_progress_bar(self, stretch=0):
     widget = QProgressBar()
     self._layout_add_widget(self._status_bar_layout, widget, stretch)
     return _QtWidget(widget)
Example #33
0
class LabelAssistDialog(QDialog):
    """
    A simple UI for showing bookmarks and navigating to them.

    FIXME: For now, this window is tied to a particular lane.
           If your project has more than one lane, then each one
           will have it's own bookmark window, which is kinda dumb.
    """

    def __init__(self, parent, topLevelOperatorView):
        super(LabelAssistDialog, self).__init__(parent)

        # Create thread router to populate table on main thread
        self.threadRouter = ThreadRouter(self)

        # Set object classification operator view
        self.topLevelOperatorView = topLevelOperatorView

        self.setWindowTitle("Label Assist")
        self.setMinimumWidth(500)
        self.setMinimumHeight(700)

        layout = QGridLayout()
        layout.setContentsMargins(10, 10, 10, 10)

        # Show variable importance table
        rows = 0
        columns = 4
        self.table = QTableWidget(rows, columns)
        self.table.setHorizontalHeaderLabels(["Frame", "Max Area", "Min Area", "Labels"])
        self.table.verticalHeader().setVisible(False)

        # Select full row on-click and call capture double click
        self.table.setSelectionBehavior(QTableView.SelectRows)
        self.table.doubleClicked.connect(self._captureDoubleClick)

        layout.addWidget(self.table, 1, 0, 3, 2)

        # Create progress bar
        self.progressBar = QProgressBar()
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(0)
        self.progressBar.hide()
        layout.addWidget(self.progressBar, 4, 0, 1, 2)

        # Create button to populate table
        self.computeButton = QPushButton("Compute object info")
        self.computeButton.clicked.connect(self._triggerTableUpdate)
        layout.addWidget(self.computeButton, 5, 0)

        # Create close button
        closeButton = QPushButton("Close")
        closeButton.clicked.connect(self.close)
        layout.addWidget(closeButton, 5, 1)

        # Set dialog layout
        self.setLayout(layout)

    def _triggerTableUpdate(self):
        # Check that object area is included in selected features
        featureNames = self.topLevelOperatorView.SelectedFeatures.value

        if "Standard Object Features" not in featureNames or "Count" not in featureNames["Standard Object Features"]:
            box = QMessageBox(
                QMessageBox.Warning,
                "Warning",
                'Object area is not a selected feature. Please select this feature on: "Standard Object Features > Shape > Size in pixels"',
                QMessageBox.NoButton,
                self,
            )
            box.show()
            return

        # Clear table
        self.table.clearContents()
        self.table.setRowCount(0)
        self.table.setSortingEnabled(False)
        self.progressBar.show()
        self.computeButton.setEnabled(False)

        def compute_features_for_frame(tIndex, t, features):
            # Compute features and labels (called in parallel from request pool)
            roi = [slice(None) for i in range(len(self.topLevelOperatorView.LabelImages.meta.shape))]
            roi[tIndex] = slice(t, t + 1)
            roi = tuple(roi)

            frame = self.topLevelOperatorView.SegmentationImages(roi).wait()
            frame = frame.squeeze().astype(numpy.uint32, copy=False)

            # Dirty trick: We don't care what we're passing here for the 'image' parameter,
            # but vigra insists that we pass *something*, so we'll cast the label image as float32.
            features[t] = vigra.analysis.extractRegionFeatures(
                frame.view(numpy.float32), frame, ["Count"], ignoreLabel=0
            )

        tIndex = self.topLevelOperatorView.SegmentationImages.meta.axistags.index("t")
        tMax = self.topLevelOperatorView.SegmentationImages.meta.shape[tIndex]

        features = {}
        labels = {}

        def compute_all_features():
            # Compute features in parallel
            pool = RequestPool()
            for t in range(tMax):
                pool.add(Request(partial(compute_features_for_frame, tIndex, t, features)))
            pool.wait()

        # Compute labels
        labels = self.topLevelOperatorView.LabelInputs([]).wait()

        req = Request(compute_all_features)
        req.notify_finished(partial(self._populateTable, features, labels))
        req.submit()

    @threadRouted
    def _populateTable(self, features, labels, *args):
        self.progressBar.hide()
        self.computeButton.setEnabled(True)

        for time, feature in features.items():
            # Insert row
            rowNum = self.table.rowCount()
            self.table.insertRow(self.table.rowCount())

            # Get max and min object areas
            areas = feature["Count"]  # objectFeatures['Standard Object Features']['Count']
            maxObjArea = numpy.max(areas[numpy.nonzero(areas)])
            minObjArea = numpy.min(areas[numpy.nonzero(areas)])

            # Get number of labeled objects
            labelNum = numpy.count_nonzero(labels[time])

            # Load fram number
            item = QTableWidgetItem(str(time))
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            self.table.setItem(rowNum, 0, item)

            # Load max object areas
            item = QTableWidgetItemWithFloatSorting(str("{: .02f}".format(maxObjArea)))
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            self.table.setItem(rowNum, 1, item)

            # Load min object areas
            item = QTableWidgetItemWithFloatSorting(str("{: .02f}".format(minObjArea)))
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            self.table.setItem(rowNum, 2, item)

            # Load label numbers
            item = QTableWidgetItemWithFloatSorting(str("{: .01f}".format(labelNum)))
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            self.table.setItem(rowNum, 3, item)

        # Resize column size to fit dialog size
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # Sort by max object area
        self.table.setSortingEnabled(True)
        self.table.sortByColumn(1, Qt.DescendingOrder)

    def _captureDoubleClick(self):
        # Navigate to selected frame
        index = self.table.selectedIndexes()[0]
        frameStr = self.table.item(index.row(), 0).text()

        if frameStr:
            frameNum = int(frameStr)
            self.parent().editor.posModel.time = frameNum
Example #34
0
    def initLayout(self):
        layout = QVBoxLayout(self)

        ## -- ROW 1
        row = QHBoxLayout()
        self.budgetProjection_btn = QPushButton()
        self.budgetProjection_btn.setToolTip("Check Budget Projection...")
        row.addWidget(self.budgetProjection_btn)
        self.selectMN_btn = QPushButton("Select Masternodes...")
        row.addWidget(self.selectMN_btn)
        self.selectedMNlabel = QLabel(
            "<em>0 masternodes selected for voting</em")
        row.addWidget(self.selectedMNlabel)
        row.addStretch(1)
        self.statusLabel = QLabel("")
        self.statusLabel.setMinimumWidth(116)
        self.resetStatusLabel('<b style="color:red">Reload Proposals</b>')
        row.addWidget(self.statusLabel)
        row.addStretch(1)
        self.mnCountLabel = QLabel()
        row.addWidget(self.mnCountLabel)
        self.refreshProposals_btn = QPushButton()
        self.refreshProposals_btn.setToolTip("Refresh Proposal List")
        row.addWidget(self.refreshProposals_btn)
        self.toggleExpiring_btn = QPushButton("Hide Expiring")
        self.toggleExpiring_btn.setToolTip(
            "Hide expiring proposals (yellow background) from list")
        row.addWidget(self.toggleExpiring_btn)
        layout.addLayout(row)

        ## -- ROW 2
        self.proposalBox = QTableWidget()
        self.proposalBox.setMinimumHeight(280)
        self.proposalBox.setSelectionMode(QAbstractItemView.MultiSelection)
        self.proposalBox.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.proposalBox.setShowGrid(True)
        self.proposalBox.setColumnCount(8)
        self.proposalBox.setRowCount(0)
        self.proposalBox.horizontalHeader().setSectionResizeMode(
            0, QHeaderView.Stretch)
        self.proposalBox.setSortingEnabled(True)
        #self.proposalBox.verticalHeader().hide
        self.setProposalBoxHeader()
        self.proposalBox.setColumnWidth(1, 50)
        self.proposalBox.setColumnWidth(2, 50)
        self.proposalBox.setColumnWidth(3, 100)
        self.proposalBox.setColumnWidth(4, 100)
        self.proposalBox.setColumnWidth(5, 150)
        self.proposalBox.setColumnWidth(6, 120)
        self.proposalBox.setColumnWidth(7, 50)
        layout.addWidget(self.proposalBox)

        ## -- ROW 3
        row = QHBoxLayout()
        self.timeIconLabel = QLabel()
        self.timeIconLabel.setToolTip(
            "Check to add a randomized time offset (positive or negative) to enhance privacy"
        )
        row.addWidget(self.timeIconLabel)
        self.randomDelayCheck = QCheckBox()
        self.randomDelayCheck.setToolTip(
            "Check to add a randomized time offset when voting (max +5/-5 hrs)"
        )
        row.addWidget(self.randomDelayCheck)
        self.randomDelayNeg_edt = QSpinBox()
        self.randomDelayNeg_edt.setPrefix('- ')
        self.randomDelayNeg_edt.setSuffix(" secs")
        self.randomDelayNeg_edt.setToolTip(
            "Maximum random time (in seconds) subtracted from each vote timestamp"
        )
        self.randomDelayNeg_edt.setFixedWidth(100)
        self.randomDelayNeg_edt.setMaximum(18000)
        self.randomDelayNeg_edt.setValue(0)
        row.addWidget(self.randomDelayNeg_edt)
        self.randomDelayPos_edt = QSpinBox()
        self.randomDelayPos_edt.setPrefix("+ ")
        self.randomDelayPos_edt.setSuffix(" secs")
        self.randomDelayPos_edt.setToolTip(
            "Maximum random time (in seconds) added to each vote timestamp")
        self.randomDelayPos_edt.setFixedWidth(100)
        self.randomDelayPos_edt.setMaximum(18000)
        self.randomDelayPos_edt.setValue(300)
        row.addWidget(self.randomDelayPos_edt)
        row.addStretch(1)
        self.loadingLine = QLabel(
            "<b style='color:red'>Vote Signatures.</b> Completed: ")
        self.loadingLinePercent = QProgressBar()
        self.loadingLinePercent.setMaximumWidth(200)
        self.loadingLinePercent.setMaximumHeight(10)
        self.loadingLinePercent.setRange(0, 100)
        row.addWidget(self.loadingLine)
        row.addWidget(self.loadingLinePercent)
        self.loadingLine.hide()
        self.loadingLinePercent.hide()
        row.addStretch(1)
        self.selectedPropLabel = QLabel("<em>0 proposals selected</em>")
        row.addWidget(self.selectedPropLabel)
        self.questionLabel = QLabel()
        message = "Refresh proposals.\n"
        message += "GREEN: proposal passing\n"
        message += "WHITE: missing votes in order to pass\n"
        message += "RED: proposal not passing\n"
        message += "YELLOW: proposal expiring (last payment block)\n"
        self.questionLabel.setToolTip(message)
        row.addWidget(self.questionLabel)
        layout.addLayout(row)

        ## -- ROW 4
        row = QHBoxLayout()
        self.voteYes_btn = QPushButton("Vote YES")
        self.voteYes_btn.setToolTip("Vote YES on selected proposals")
        row.addWidget(self.voteYes_btn)
        self.voteAbstain_btn = QPushButton("Vote ABSTAIN")
        self.voteAbstain_btn.setToolTip(
            "Vote ABSTAIN on selected proposals [currently disabled]")
        row.addWidget(self.voteAbstain_btn)
        self.voteNo_btn = QPushButton("Vote NO")
        self.voteNo_btn.setToolTip("Vote NO on selected proposals")
        row.addWidget(self.voteNo_btn)
        layout.addLayout(row)
Example #35
0
class RechgEvalWidget(QFrameLayout):

    sig_new_gluedf = QSignal(GLUEDataFrameBase)

    def __init__(self, parent):
        super(RechgEvalWidget, self).__init__(parent)
        self.setWindowTitle('Recharge Calibration Setup')
        self.setWindowFlags(Qt.Window)

        self.wxdset = None
        self.wldset = None
        self.figstack = FigureStackManager(parent=self)

        self.progressbar = QProgressBar()
        self.progressbar.setValue(0)
        self.progressbar.hide()
        self.__initUI__()

        # Set the worker and thread mechanics

        self.rechg_worker = RechgEvalWorker()
        self.rechg_worker.sig_glue_finished.connect(self.receive_glue_calcul)
        self.rechg_worker.sig_glue_progress.connect(self.progressbar.setValue)

        self.rechg_thread = QThread()
        self.rechg_worker.moveToThread(self.rechg_thread)
        self.rechg_thread.started.connect(self.rechg_worker.eval_recharge)

    def __initUI__(self):
        class QRowLayout(QWidget):
            def __init__(self, items, parent=None):
                super(QRowLayout, self).__init__(parent)

                layout = QGridLayout()
                for col, item in enumerate(items):
                    layout.addWidget(item, 0, col)
                layout.setContentsMargins(0, 0, 0, 0)
                layout.setColumnStretch(0, 100)
                self.setLayout(layout)

        # ---- Parameters

        # Specific yield (Sy) :

        self.QSy_min = QDoubleSpinBox(0.05, 3)
        self.QSy_min.setRange(0.001, 1)

        self.QSy_max = QDoubleSpinBox(0.2, 3)
        self.QSy_max.setRange(0.001, 1)

        # Maximum readily available water (RASmax) :

        # units=' mm'

        self.QRAS_min = QDoubleSpinBox(5)
        self.QRAS_min.setRange(0, 999)

        self.QRAS_max = QDoubleSpinBox(40)
        self.QRAS_max.setRange(0, 999)

        # Runoff coefficient (Cro) :

        self.CRO_min = QDoubleSpinBox(0.1, 3)
        self.CRO_min.setRange(0, 1)

        self.CRO_max = QDoubleSpinBox(0.3, 3)
        self.CRO_max.setRange(0, 1)

        # Snowmelt parameters :

        # units=' °C'

        self._Tmelt = QDoubleSpinBox(0, 1)
        self._Tmelt.setRange(-25, 25)

        # units=' mm/°C'

        self._CM = QDoubleSpinBox(
            4,
            1,
            0.1,
        )
        self._CM.setRange(0.1, 100)

        # units=' days'

        self._deltaT = QDoubleSpinBox(
            0,
            0,
        )
        self._deltaT.setRange(0, 999)

        class QLabelCentered(QLabel):
            def __init__(self, text):
                super(QLabelCentered, self).__init__(text)
                self.setAlignment(Qt.AlignCenter)

        # ---- Parameters

        params_group = QFrameLayout()
        params_group.setContentsMargins(10, 5, 10, 0)  # (L, T, R, B)
        params_group.setObjectName("viewport")
        params_group.setStyleSheet("#viewport {background-color:transparent;}")

        row = 0
        params_group.addWidget(QLabel('Sy :'), row, 0)
        params_group.addWidget(self.QSy_min, row, 1)
        params_group.addWidget(QLabelCentered('to'), row, 2)
        params_group.addWidget(self.QSy_max, row, 3)
        row += 1
        params_group.addWidget(QLabel('RAS<sub>max</sub> :'), row, 0)
        params_group.addWidget(self.QRAS_min, row, 1)
        params_group.addWidget(QLabelCentered('to'), row, 2)
        params_group.addWidget(self.QRAS_max, row, 3)
        params_group.addWidget(QLabel('mm'), row, 4)
        row += 1
        params_group.addWidget(QLabel('Cro :'), row, 0)
        params_group.addWidget(self.CRO_min, row, 1)
        params_group.addWidget(QLabelCentered('to'), row, 2)
        params_group.addWidget(self.CRO_max, row, 3)
        row += 1
        params_group.setRowMinimumHeight(row, 10)
        row += 1
        params_group.addWidget(QLabel('Tmelt :'), row, 0)
        params_group.addWidget(self._Tmelt, row, 1)
        params_group.addWidget(QLabel('°C'), row, 2, 1, 3)
        row += 1
        params_group.addWidget(QLabel('CM :'), row, 0)
        params_group.addWidget(self._CM, row, 1)
        params_group.addWidget(QLabel('mm/°C'), row, 2, 1, 3)
        row += 1
        params_group.addWidget(QLabel('deltaT :'), row, 0)
        params_group.addWidget(self._deltaT, row, 1)
        params_group.addWidget(QLabel('days'), row, 2, 1, 3)
        row += 1
        params_group.setRowStretch(row, 100)
        params_group.setColumnStretch(5, 100)

        # ---- Layout ----

        qtitle = QLabel('Parameter Range')
        qtitle.setAlignment(Qt.AlignCenter)

        sa = QScrollArea()
        sa.setWidget(params_group)
        sa.setWidgetResizable(True)
        sa.setFrameStyle(0)
        sa.setStyleSheet("QScrollArea {background-color:transparent;}")
        sa.setSizePolicy(
            QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Preferred))

        # ---- Main Layout

        self.addWidget(qtitle, 0, 0)
        self.addWidget(HSep(), 1, 0)
        self.addWidget(sa, 2, 0)
        self.addWidget(HSep(), 3, 0)
        self.setRowMinimumHeight(4, 5)
        self.addWidget(self.setup_toolbar(), 5, 0)

        self.setRowStretch(2, 100)
        self.setVerticalSpacing(5)
        self.setContentsMargins(0, 0, 0, 10)  # (L, T, R, B)

    def setup_toolbar(self):
        """Setup the toolbar of the widget. """
        toolbar = QWidget()

        btn_calib = QPushButton('Compute Recharge')
        btn_calib.clicked.connect(self.btn_calibrate_isClicked)

        self.btn_show_result = QToolButtonSmall(icons.get_icon('search'))
        self.btn_show_result.clicked.connect(self.figstack.show)
        self.btn_show_result.setToolTip("Show GLUE results.")

        self.btn_save_glue = ExportGLUEButton(self.wxdset)

        layout = QGridLayout(toolbar)
        layout.addWidget(btn_calib, 0, 0)
        layout.addWidget(self.btn_show_result, 0, 1)
        layout.addWidget(self.btn_save_glue, 0, 2)
        layout.setContentsMargins(10, 0, 10, 0)  # (L, T, R, B)

        return toolbar

    def set_wldset(self, wldset):
        """Set the namespace for the water level dataset."""
        self.wldset = wldset
        self.setEnabled(self.wldset is not None and self.wxdset is not None)
        gluedf = None if wldset is None else wldset.get_glue_at(-1)
        self._setup_ranges_from_wldset(gluedf)
        self.figstack.set_gluedf(gluedf)
        self.btn_save_glue.set_model(gluedf)

    def set_wxdset(self, wxdset):
        """Set the namespace for the weather dataset."""
        self.wxdset = wxdset
        self.setEnabled(self.wldset is not None and self.wxdset is not None)

    def _setup_ranges_from_wldset(self, gluedf):
        """
        Set the parameter range values from the last values that were used
        to produce the last GLUE results saved into the project.
        """
        if gluedf is not None:
            self.QSy_min.setValue(min(gluedf['ranges']['Sy']))
            self.QSy_max.setValue(max(gluedf['ranges']['Sy']))

            self.CRO_min.setValue(min(gluedf['ranges']['Cro']))
            self.CRO_max.setValue(max(gluedf['ranges']['Cro']))

            self.QRAS_min.setValue(min(gluedf['ranges']['RASmax']))
            self.QRAS_max.setValue(max(gluedf['ranges']['RASmax']))

            self._Tmelt.setValue(gluedf['params']['tmelt'])
            self._CM.setValue(gluedf['params']['CM'])
            self._deltaT.setValue(gluedf['params']['deltat'])

    def get_Range(self, name):
        if name == 'Sy':
            return [self.QSy_min.value(), self.QSy_max.value()]
        elif name == 'RASmax':
            return [self.QRAS_min.value(), self.QRAS_max.value()]
        elif name == 'Cro':
            return [self.CRO_min.value(), self.CRO_max.value()]
        else:
            raise ValueError('Name must be either Sy, Rasmax or Cro.')

    @property
    def Tmelt(self):
        return self._Tmelt.value()

    @property
    def CM(self):
        return self._CM.value()

    @property
    def deltaT(self):
        return self._deltaT.value()

    def btn_calibrate_isClicked(self):
        """
        Handles when the button to compute recharge and its uncertainty is
        clicked.
        """
        self.start_glue_calcul()

    def start_glue_calcul(self):
        """
        Start the method to evaluate ground-water recharge and its
        uncertainty.
        """
        # Set the parameter ranges.

        self.rechg_worker.Sy = self.get_Range('Sy')
        self.rechg_worker.Cro = self.get_Range('Cro')
        self.rechg_worker.RASmax = self.get_Range('RASmax')

        self.rechg_worker.TMELT = self.Tmelt
        self.rechg_worker.CM = self.CM
        self.rechg_worker.deltat = self.deltaT

        # Set the data and check for errors.

        error = self.rechg_worker.load_data(self.wxdset, self.wldset)
        if error is not None:
            QMessageBox.warning(self, 'Warning', error, QMessageBox.Ok)
            return

        # Start the computation of groundwater recharge.

        self.progressbar.show()
        waittime = 0
        while self.rechg_thread.isRunning():
            time.sleep(0.1)
            waittime += 0.1
            if waittime > 15:
                print('Impossible to quit the thread.')
                return
        self.rechg_thread.start()

    def receive_glue_calcul(self, glue_dataframe):
        """
        Handle the plotting of the results once ground-water recharge has
        been evaluated.
        """
        self.rechg_thread.quit()
        self.progressbar.hide()
        if glue_dataframe is None:
            msg = ("Recharge evaluation was not possible because all"
                   " the models produced were deemed non-behavioural."
                   "\n\n"
                   "This usually happens when the range of values for"
                   " Sy, RASmax, and Cro are too restrictive or when the"
                   " Master Recession Curve (MRC) does not represent well the"
                   " behaviour of the observed hydrograph.")
            QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok)
        else:
            self.wldset.clear_glue()
            self.wldset.save_glue(glue_dataframe)
            self.sig_new_gluedf.emit(glue_dataframe)

            self.btn_save_glue.set_model(glue_dataframe)
            self.figstack.set_gluedf(glue_dataframe)
Example #36
0
    def __init__(self):
        super().__init__()

        self.dev = None

        self.progress_signal.connect(self._on_progress)
        self.complete_signal.connect(self._on_complete)
        self.error_signal.connect(self._on_error)

        lbl_warning = QLabel(
            "<font color='red'><b>Make sure jumploader is installed before you flash QMK</b></font>"
        )
        lbl_warning.setWordWrap(True)

        btn_flash_qmk = QPushButton("Flash QMK...")
        btn_flash_qmk.clicked.connect(self.on_click_flash_qmk)

        lbl_help = QLabel(
            "After jumploader is installed, hold Backspace while plugging in the keyboard to start in bootloader mode."
        )
        lbl_help.setWordWrap(True)

        btn_reboot_bl = QPushButton("Reboot to Bootloader")
        btn_reboot_bl.clicked.connect(self.on_click_reboot)
        btn_flash_jumploader = QPushButton("Flash Jumploader")
        btn_flash_jumploader.clicked.connect(self.on_click_flash_jumploader)
        btn_restore_stock = QPushButton("Revert to Stock Firmware")
        btn_restore_stock.clicked.connect(self.on_click_revert)

        self.progress = QProgressBar()
        self.progress.setRange(0, 100)
        self.progress_label = QLabel("Ready")

        self.combobox_devices = QComboBox()
        btn_refresh_devices = QToolButton()
        btn_refresh_devices.setToolButtonStyle(Qt.ToolButtonTextOnly)
        btn_refresh_devices.setText("Refresh")
        btn_refresh_devices.clicked.connect(self.on_click_refresh)

        devices_layout = QHBoxLayout()
        devices_layout.addWidget(self.combobox_devices)
        devices_layout.addWidget(btn_refresh_devices)

        layout_qmk = QVBoxLayout()
        layout_qmk.setAlignment(Qt.AlignTop)
        layout_qmk.addWidget(lbl_warning)
        layout_qmk.addWidget(btn_flash_qmk)
        layout_qmk.addWidget(lbl_help)

        layout_stock = QVBoxLayout()
        layout_stock.setAlignment(Qt.AlignTop)
        layout_stock.addWidget(btn_reboot_bl)
        layout_stock.addWidget(btn_flash_jumploader)
        layout_stock.addWidget(btn_restore_stock)

        layout_progress = QVBoxLayout()
        layout_progress.addWidget(self.progress_label)
        layout_progress.addWidget(self.progress)

        group_qmk = QGroupBox("QMK")
        group_qmk.setLayout(layout_qmk)

        group_stock = QGroupBox("Stock")
        group_stock.setLayout(layout_stock)

        group_progress = QGroupBox("")
        group_progress.setLayout(layout_progress)

        group_layout = QHBoxLayout()
        group_layout.addWidget(group_qmk)
        group_layout.addWidget(group_stock)

        layout = QVBoxLayout()
        layout.addLayout(devices_layout, stretch=0)
        layout.addLayout(group_layout, stretch=1)
        layout.addWidget(group_progress, stretch=0)
        self.setLayout(layout)

        self.lockable = [
            btn_flash_qmk, btn_reboot_bl, btn_flash_jumploader,
            btn_restore_stock, self.combobox_devices, btn_refresh_devices
        ]

        self.on_click_refresh()
Example #37
0
class Fifteen(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Fifteen')
        self.setGeometry(400, 250, 600, 600)
        self.r_list = [[], [], [], []]
        self.moves = 0
        self.num_board = []
        self.solved = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],
                       [13, 14, 15, ' ']]
        self.board1 = []
        self.value = 0
        self.win = False
        self.win2 = False
        self.wincounter = 0
        self.scramble()

        self.progress = QProgressBar(self)
        self.progress.setGeometry(250, 25, 100, 20)
        self.progress.setMaximum(16)
        self.progress.setTextVisible(False)
        self.progress.setAlignment(Qt.AlignRight)
        self.progress.setValue(self.value)

        self.percent = QLabel(str(self.progress.value() // 16) + "%", self)
        self.percent.setGeometry(360, 25, 100, 20)

        self.show()

    def scramble(self):
        """
        Scrambles the board and checks if it's solvable. If not,
        it scrambles it again.
        :return: None
        """

        possible = False
        while not possible:
            self.board1 = [i for i in range(1, 16)] + [' ']  # 1D List
            blank_spot = self.board1.index(' ')
            shuffle(self.board1)
            n = 4
            self.num_board = [
                self.board1[i:i + n] for i in range(0, len(self.board1), n)
            ]  # 2D version of the grid's list
            og_blank_spot = blank_spot
            self.board1.remove(' ')
            for i in self.num_board:
                if ' ' in i:
                    blank_spot = 4 - self.num_board.index(i)

            inv = 0  # number of inversions
            for i in self.board1:
                for j in self.board1[self.board1.index(i):]:
                    if i > j:
                        inv += 1
            self.board1.insert(og_blank_spot, ' ')
            if blank_spot % 2 == 0 and inv % 2 != 0 or blank_spot % 2 != 0 and inv % 2 == 0:
                possible = True

    def paintEvent(self, event):
        qp = QPainter()
        grid_pen = QPen(Qt.black, 7)
        grid_brush = QBrush(QColor(56, 182, 199), Qt.SolidPattern)
        qp.begin(self)

        qp.setPen(grid_pen)
        qp.setBrush(grid_brush)

        if not self.win:
            for i in range(4):
                for j in range(4):
                    x = (i * 125) + 50
                    y = (j * 125) + 50
                    q = QRect(QPoint(x, y), QSize(125, 125))
                    self.r_list[i].append(q)

            qp.setFont(QFont("arial", 20))
            qp.drawText(50, 580, "Moves: " + str(self.moves))

            for i in range(len(self.r_list)):
                for j in range(4):
                    qp.drawRect(self.r_list[i][j])
                    qp.drawText(self.r_list[i][j], Qt.AlignCenter,
                                str(self.num_board[j][i]))

            if self.value == 16:
                self.win = True

        if self.win:
            self.progress.hide()
            self.percent.hide()
            qp.setPen(QPen(QColor(29, 121, 171), 5))
            qp.setFont(QFont("Trebuchet MS", 95))
            qp.drawText(35, 160, "You Win!")

            qp.setPen(QPen(QColor(25, 150, 17), 5))
            qp.setFont(QFont("Trebuchet MS", 40))
            qp.drawText(20, 350, "Click the screen")
            qp.drawText(25, 400, "to restart the game!")

            self.win2 = True

        qp.end()

    def mousePressEvent(self, event):
        blank_pos = None
        x = event.x()
        y = event.y()
        row = (y - 50) // 125
        col = (x - 50) // 125
        mCoord = (row, col)  # The exact square which is clicked

        if not self.win:
            for r in self.num_board:
                for n in r:
                    if n == ' ':
                        blank_pos = (self.num_board.index(r), r.index(n)
                                     )  # position of the blank spot
            self.move_click(mCoord, blank_pos, self.num_board)

            completed_nums = []
            for n1 in range(len(self.num_board)):
                for n2 in range(4):
                    if self.num_board[n1][n2] == self.solved[n1][
                            n2] and self.num_board[n1][
                                n2] not in completed_nums:
                        completed_nums.append(self.solved[n1][n2])
                        self.value = len(completed_nums)
                        self.progress.setValue(self.value)
                        self.percent.setText(str(self.value / 16 * 100) + "%")
        self.update()

        if self.win2:
            self.wincounter += 1
            if self.wincounter == 2:
                if 0 <= event.x() <= 600 and 0 <= event.y() <= 600:
                    os.execl(sys.executable, sys.executable, *sys.argv)

    def move_click(self, mouse, blank, board):
        """
        Sees how far away the mouse click is from the blank, and move the numbers accordingly.
        :param mouse: Coordinates of the mouse click on the grid, tuple
        :param blank: Coordinates of the blank spot on the grid, tuple
        :param board: 2D list of all the numbers on screen, list
        :return: None
        """
        if 0 <= mouse[0] <= 3 and 0 <= mouse[1] <= 3:
            if mouse[0] == blank[0] and mouse[1] != blank[1]:  # Checks rows
                distance = mouse[1] - blank[1]
                d = abs(distance)
                if d == 1:
                    clicked_num = board[mouse[0]][mouse[1]]
                    board[blank[0]][blank[1]] = clicked_num
                    board[mouse[0]][mouse[1]] = ' '
                    self.moves += 1

                elif distance == -2:
                    board[mouse[0]][mouse[1] + d] = board[mouse[0]][mouse[1] +
                                                                    d - 1]
                    board[mouse[0]][mouse[1] + d -
                                    1] = board[mouse[0]][mouse[1]]
                    board[mouse[0]][mouse[1]] = ' '
                    self.moves += d

                elif distance == -3:
                    closest_num = board[mouse[0]][mouse[1] + d - 1]
                    second_num = board[mouse[0]][mouse[1] + d - 2]
                    board[blank[0]][blank[1]] = closest_num
                    board[mouse[0]][mouse[1] + d - 1] = second_num
                    board[mouse[0]][mouse[1] + d -
                                    2] = board[mouse[0]][mouse[1]]
                    board[mouse[0]][mouse[1]] = ' '

                elif distance == 2:
                    board[mouse[0]][mouse[1] -
                                    distance] = board[mouse[0]][mouse[1] -
                                                                distance + 1]
                    board[mouse[0]][mouse[1] - distance +
                                    1] = board[mouse[0]][mouse[1]]
                    board[mouse[0]][mouse[1]] = ' '

                elif distance == 3:
                    closest_num = board[mouse[0]][mouse[1] - distance + 1]
                    second_num = board[mouse[0]][mouse[1] - distance + 2]
                    board[blank[0]][blank[1]] = closest_num
                    board[mouse[0]][mouse[1] - distance + 1] = second_num
                    board[mouse[0]][mouse[1] - distance +
                                    2] = board[mouse[0]][mouse[1]]
                    board[mouse[0]][mouse[1]] = ' '

            if mouse[1] == blank[1] and mouse[0] != blank[0]:  # Checks columns
                distance = mouse[0] - blank[0]

                if abs(distance) == 1:
                    clicked_num = board[mouse[0]][blank[1]]
                    board[blank[0]][blank[1]] = clicked_num
                    board[mouse[0]][mouse[1]] = ' '
                    self.moves += 1

                elif distance == -2:
                    d = abs(distance)
                    board[mouse[0] + d][mouse[1]] = board[mouse[0] + d -
                                                          1][mouse[1]]
                    board[mouse[0] + d - 1][mouse[1]] = board[mouse[0] + d -
                                                              2][mouse[1]]
                    board[mouse[0] + d - 2][mouse[1]] = ' '
                    self.moves += d

                elif distance == -3:
                    d = abs(distance)
                    closest_num = board[mouse[0] + d - 1][mouse[1]]
                    second_num = board[mouse[0] + d - 2][mouse[1]]
                    board[blank[0]][blank[1]] = closest_num
                    board[mouse[0] + d - 1][mouse[1]] = second_num
                    board[mouse[0] + d - 2][mouse[1]] = board[mouse[0] + d -
                                                              3][mouse[1]]
                    board[mouse[0]][mouse[1]] = ' '
                    self.moves += d

                elif distance == 2:
                    board[mouse[0] -
                          distance][mouse[1]] = board[mouse[0] - distance +
                                                      1][mouse[1]]
                    board[mouse[0] - distance +
                          1][mouse[1]] = board[mouse[0] - distance +
                                               2][mouse[1]]
                    board[mouse[0] - distance + 2][mouse[1]] = ' '
                    self.moves += distance

                elif distance == 3:
                    closest_num = board[mouse[0] - distance + 1][mouse[1]]
                    second_num = board[mouse[0] - distance + 2][mouse[1]]
                    board[blank[0]][blank[1]] = closest_num
                    board[mouse[0] - distance + 1][mouse[1]] = second_num
                    board[mouse[0] - distance +
                          2][mouse[1]] = board[mouse[0] - distance +
                                               3][mouse[1]]
                    board[mouse[0]][mouse[1]] = ' '
                    self.moves += distance
Example #38
0
class WSPRUI(QWidget):
    def __init__(self, configFile):
        super(WSPRUI, self).__init__()

        #Things that we need to keep track of to update
        self.wsprDevice = WSPRInterfaceObject(configFile)
        
        self.bandCheckboxes = []
        self.CurrentGPSStatus = QProgressBar(self)
        self.gpsTime = QLabel("00:00:00")
        self.gpsPosition = QLabel("0000")
        self.gpsPower = QLabel("0")
        self.outputFreq = QLabel(self.formatFrequency("0"))
        self.setFrequencyValueLable = QLineEdit(self.formatFrequency("0"))
        self.dialFrequency = QDial()
        self.gpsLocked = QLabel("GPS Signal Quality:")
        
        self.portConnectionIcon = QLabel()
        self.portConnectionIcon.setFixedSize(50, 50)
        self.portConnectionIcon.mousePressEvent = self.handleConnectionIconClick

        self.txtCallsign = QLineEdit()

        self.portConnectionLabel = QLabel(self.wsprDevice.config.notconnectedtext)

        self.rdoStartUpSignalGen = QRadioButton("Signal Generator")
        self.rdoStartUpWSPRBeacon = QRadioButton("WSPR Beacon")
        self.rdoStartUpIdle = QRadioButton("Idle")

        self.pauseAfterTransmission = QLineEdit("120")
        self.manualLocationSetting = QLineEdit("FN44")
        self.useManualLocation = QCheckBox()

        self.chkCurrentSignalGen = QCheckBox("Signal Generator")
        self.chkCurrentWSPRBeacon = QCheckBox("WSPR Beacon")

        self.valCurrentMode = QLabel("")
        self.transmitStatus = QLabel("")

        self.buttonReload = QPushButton("Reload")
        self.buttonReload.setFixedSize(100, 50)
        self.buttonReload.clicked.connect(self.handleReloadPush)
        self.buttonReload.setVisible(self.wsprDevice.config.debug)

        self.buttonSave = QPushButton("Save")
        self.buttonChangeCurrentMode = QPushButton("Start")

        self.debugSection = QGroupBox("Info")

        self.textArea = QPlainTextEdit()
        self.textArea.setMaximumBlockCount(self.wsprDevice.config.debugAreaMaximumBlockCount)
        self.textArea.setReadOnly(True)
        
        self.commandArray = [Command.CALLSIGN,
                             Command.BANDS,
                             Command.STARTUP_MODE,
                             Command.CURRENT_MODE,
                             Command.POWER,
                             Command.GENERATOR_FREQUENCY]

        self.factorySettingsArray = [Command.FACTORY_FREQUENCY_REFERENCE_OSCILLATOR_FREQUENCY,
                                    Command.FACTORY_HARDWARE_REVISION,
                                    Command.FACTORY_HARDWARE_VERSION,
                                    Command.FACTORY_LOWPASS_FINTER_INSTALLED,
                                    Command.FACTORY_PRODUCT_NUMBER,
                                    Command.FACTORY_SOFTWARE_REVISION,
                                    Command.FACTORY_SOFTWARE_VERSION]
        #Create the UI
        self.initUI()
        
        #Threads
        self.createThreads()
    
    #####################################
    #Start - Build All section of the UI
    #####################################
    #Add all the sections to the main window 
    def initUI(self):

        windowLayout = QGridLayout()

        #First Column
        #serial port section
        serialPort = self.initSerialPortFrame()
        windowLayout.addWidget(serialPort, 0, 0)
        
        #Bands Section
        bands = self.initBandsFrame()
        windowLayout.addWidget(bands, 1, 0, 2, 1)

        #Button Section
        button = self.initButtonFrame()
        windowLayout.addWidget(button, 3, 0)

        #Second Column
        #info section
        callsign = self.initCallsignFrame()
        windowLayout.addWidget(callsign, 0, 1)
        
        #Current Status
        current =  self.initCurrentStatus()
        windowLayout.addWidget(current, 1, 1)

        #setCurrentStatus Area
        setCurrent = self.initSetCurrentStatus()
        windowLayout.addWidget(setCurrent, 2, 1)

        #Startup Config
        startup = self.initStartupModeFrame()
        windowLayout.addWidget(startup, 3, 1)

        #Third Column
        #Debug Area
        debug = self.initDebugSection()
        windowLayout.addWidget(debug, 0, 2, 4, 1)

        #Set the layout and window
        self.setLayout(windowLayout)
        self.move(300, 150)
        self.setWindowTitle(self.wsprDevice.config.name + " " + self.wsprDevice.config.version)    
        self.show()

    #Build section with port information
    def initSerialPortFrame(self):
        sectionBox = QGroupBox("Serial Port")
        tempLayout = QGridLayout()

        self.setConnectionStatus()

        tempLayout.addWidget(self.portConnectionIcon,0,0)
        tempLayout.addWidget(self.portConnectionLabel, 1, 0)
        tempLayout.setAlignment(QtCore.Qt.AlignHCenter)
        sectionBox.setLayout(tempLayout)
        return sectionBox

    #create section for Band information
    def initBandsFrame(self):
        sectionBox = QGroupBox("Bands")
        tempLayout = QGridLayout()
        
        i=0
        for band in self.wsprDevice.bands:
            #for each band make a label and a button
            checkbox = QCheckBox(band[1])            
            tempLayout.addWidget(checkbox, i, 0, 3, 0)
            self.bandCheckboxes.append(checkbox)
            i+=1
        
        sectionBox.setLayout(tempLayout)
        return sectionBox

    #Create section for buttons
    def initButtonFrame(self):
        sectionBox = QGroupBox("Buttons")
        sectionBox.setMinimumWidth(250)
        tempLayout = QGridLayout()
        
        self.buttonSave.setFixedSize(100, 50)
        self.buttonSave.clicked.connect(self.handleSavePush)
        
        tempLayout.addWidget(self.buttonReload, 0, 0)
        tempLayout.addWidget(self.buttonSave, 0, 1)
        sectionBox.setLayout(tempLayout)
        return sectionBox

    #create setion for Callsign input
    def initCallsignFrame(self):
        sectionBox = QGroupBox("Info")
        tempLayout = QGridLayout()
        self.txtCallsign.setFixedWidth(100)

        tempLayout.addWidget(self.txtCallsign, 0, 0, QtCore.Qt.AlignLeft)

        lablePauseAfter = QLabel("Pause Time:")
        lableSeconds = QLabel("seconds")
        self.pauseAfterTransmission.setFixedWidth(75)
        tempLayout.addWidget(lablePauseAfter, 1, 0)
        tempLayout.addWidget(self.pauseAfterTransmission, 1, 1, QtCore.Qt.AlignLeft)
        tempLayout.addWidget(lableSeconds, 1, 2, QtCore.Qt.AlignLeft)

        lableLocationSetting = QLabel("Manual Location:")
        self.manualLocationSetting.setFixedWidth(75)
        tempLayout.addWidget(lableLocationSetting, 2, 0)
        tempLayout.addWidget(self.manualLocationSetting, 2, 1, QtCore.Qt.AlignLeft)
        tempLayout.addWidget(self.useManualLocation, 2, 2, QtCore.Qt.AlignLeft)

        sectionBox.setLayout(tempLayout)
        return sectionBox

    #Create startup mode frame
    def initStartupModeFrame(self):
        sectionBox = QGroupBox("Start Up Configuration")
        tempLayout = QGridLayout()
        #tempLayout.setAlignment(QtCore.Qt.AlignTop)

        tempLayout.addWidget(self.rdoStartUpSignalGen, 0, 0, 1, 2)
        tempLayout.addWidget(self.rdoStartUpWSPRBeacon, 1, 0, 1, 2)
        tempLayout.addWidget(self.rdoStartUpIdle, 2, 0, 1, 2)

        sectionBox.setLayout(tempLayout)
        return sectionBox

    #Create current status section
    def initCurrentStatus(self):
        sectionBox = QGroupBox("Current Status")
        tempLayout = QGridLayout()

        #GPS Signal
        tempLayout.addWidget(self.gpsLocked, 1, 0, 1, 3)

        self.CurrentGPSStatus.setTextVisible(True)
        self.CurrentGPSStatus.setValue(0)
        tempLayout.addWidget(self.CurrentGPSStatus, 2, 0, 1, 3)

        #GPS Time
        gpsTimeLabel = QLabel("GPS Time:")
        tempLayout.addWidget(gpsTimeLabel, 3, 0)
        tempLayout.addWidget(self.gpsTime, 3, 1, 1, 2)

        #GPS Position
        gpsPositionLabel = QLabel("GPS Position:")
        tempLayout.addWidget(gpsPositionLabel, 4, 0)
        tempLayout.addWidget(self.gpsPosition, 4, 1, 1, 3)

        #Power
        gpsPowerLabel = QLabel("Reported Power: ")
        tempLayout.addWidget(gpsPowerLabel, 5, 0)
        tempLayout.addWidget(self.gpsPower, 5, 1)
        gpsdBmLabel = QLabel("dBm")
        tempLayout.addWidget(gpsdBmLabel, 5, 2)

        #Output Frequency
        gpsPowerLabel = QLabel("Output Frequency: ")
        tempLayout.addWidget(gpsPowerLabel, 6, 0)
        tempLayout.addWidget(self.outputFreq, 6, 1)
        gpsdBmLabel = QLabel("Hz")
        tempLayout.addWidget(gpsdBmLabel, 6, 2)

        lblCurrentMode = QLabel("Current Mode: ")
        tempLayout.addWidget(lblCurrentMode, 7, 0)
        tempLayout.addWidget(self.valCurrentMode, 7, 1)

        self.transmitStatus.setFixedSize(15,15)
        self.transmitStatus.setStyleSheet(self.wsprDevice.config.transmitOffStatusCSS)
        self.transmitStatus.setToolTip(self.wsprDevice.config.transmitOffStatusToolTip)
        tempLayout.addWidget(self.transmitStatus, 7, 2)
        
        #Signal Frequency
        tempLayout.setAlignment(QtCore.Qt.AlignTop)
        sectionBox.setLayout(tempLayout)
        return sectionBox        

    def initSetCurrentStatus(self):
        sectionBox = QGroupBox("Set Mode")
        tempLayout = QGridLayout()

        #Output Frequency
        setFrequencyLabel = QLabel("Output Frequency: ")
        tempLayout.addWidget(setFrequencyLabel, 0, 0)

        self.setFrequencyValueLable.mousePressEvent = lambda _ : self.setFrequencyValueLable.selectAll()
        self.setFrequencyValueLable.setValidator(QtGui.QIntValidator())
        self.setFrequencyValueLable.editingFinished.connect(self.frequencyTextComplete)

        tempLayout.addWidget(self.setFrequencyValueLable, 0, 1, 1, 2)

        gpsdBmLabel = QLabel("Hz")
        tempLayout.addWidget(gpsdBmLabel, 0, 3)

        self.buttonChangeCurrentMode.clicked.connect(self.handleStartCurrentMode)
        self.buttonChangeCurrentMode.setFixedSize(100, 50)
        tempLayout.addWidget(self.buttonChangeCurrentMode, 1, 0, 2, 1)

        tempLayout.addWidget(self.chkCurrentSignalGen, 1, 2)
        tempLayout.addWidget(self.chkCurrentWSPRBeacon, 2, 2)

        #TODO: Fix This - Should be able to have either 1 or none, not both
        self.chkCurrentSignalGen.stateChanged.connect(self.handleCurrentModeSigGenCheck)
        self.chkCurrentWSPRBeacon.stateChanged.connect(self.handleCurrentModeWSPRCheck)

        #Signal Frequency
        tempLayout.setAlignment(QtCore.Qt.AlignTop)
        sectionBox.setLayout(tempLayout)
        return sectionBox        
    
    def initDebugSection(self):
        tempLayout = QGridLayout()
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.textArea.setSizePolicy(sizePolicy)
        self.textArea.setMinimumWidth(400)
        tempLayout.addWidget(self.textArea)

        self.debugSection.setLayout(tempLayout)
        return self.debugSection

    #####################################
    #END - Build All section of the UI
    #####################################

    #####################################
    #START - UI Data Changes
    #####################################

    #Set the connection status based on 
    #the port information set by the connection process
    def setConnectionStatus(self):
        connected = self.wsprDevice.port is not None
        #print(str(self.wsprDevice.port))
        fileName = ""
        labelText = ""
        if connected:
            fileName = self.wsprDevice.config.icons["connected"]
            labelText = self.wsprDevice.config.connectedtext + str(self.wsprDevice.port.port)
        else:
            fileName = self.wsprDevice.config.icons["disconnected"]
            labelText = self.wsprDevice.config.notconnectedtext

        self.portConnectionLabel.setText(labelText)
        pixMap = QtGui.QPixmap(fileName)

        self.portConnectionIcon.setPixmap(pixMap)
        self.portConnectionIcon.setToolTip(self.wsprDevice.config.icons["toolTip"])

        return

    #fills all GUI fields with data from the wspr device
    def FillData(self):
        self.txtCallsign.setText(self.wsprDevice.callsign)

        self.gpsPower.setText(self.wsprDevice.power)

        #set the band checkboxes
        for i, checkbox in enumerate(self.bandCheckboxes):
            checkbox.setChecked(self.wsprDevice.bands[i][2] == self.wsprDevice.config.deviceconstants.bandEnabledChar)

        #set the startup mode radio buttons
        self.rdoStartUpSignalGen.setChecked(self.wsprDevice.startupMode == self.wsprDevice.config.deviceconstants.modeSignalChar)
        self.rdoStartUpWSPRBeacon.setChecked(self.wsprDevice.startupMode == self.wsprDevice.config.deviceconstants.modeWSPRChar)
        self.rdoStartUpIdle.setChecked(self.wsprDevice.startupMode == self.wsprDevice.config.deviceconstants.modeIdleChar)

        return

    #clear all GUI fields with data from the wspr device
    def ClearData(self):
        self.txtCallsign.setText("")
        
        for i, checkbox in enumerate(self.bandCheckboxes):
            checkbox.setChecked(False)

        self.rdoStartUpSignalGen.setChecked(False)
        self.rdoStartUpWSPRBeacon.setChecked(False)
        self.rdoStartUpIdle.setChecked(True)

        self.valCurrentMode.setText(self.wsprDevice.config.deviceconstants.modeIdleChar)

        self.CurrentGPSStatus.setValue(0.0)
        self.gpsLocked.setToolTip("Unknown")
        self.gpsLocked.setStyleSheet(self.wsprDevice.config.gpsLockedUnknownCSS)

        self.gpsTime.setText("00:00:00")
        self.gpsPosition.setText("0000")
        self.gpsPower.setText("00")
        self.outputFreq.setText("0 000 000 000.00")

        return

    #####################################
    #END - UI Data Changes
    #####################################

    #####################################
    #START - UI Event Handlers
    #####################################
    def handleDialChanged(self):
        self.setFrequencyValueLable.setText(str(self.formatFrequency(self.dialFrequency.value())))

    def handleConnectionIconClick(self, arg2 = None):
        self.wsprDevice.config.debug = not self.wsprDevice.config.debug
        self.buttonReload.setVisible(self.wsprDevice.config.debug)

        if self.wsprDevice.config.debug:
            self.debugSection.setTitle("Debug")
        else:
            self.debugSection.setTitle("Data")
        return

    def handleReloadPush(self):
        if self.wsprDevice.port is not None:
            self.deviceCommunicationThread.sendCommand(CommandType.GET, self.commandArray)
        return
    
    def handleSavePush(self):
        if self.wsprDevice.port is not None:
            commands = [Command.STARTUP_MODE, Command.CALLSIGN]
            startUpModeValue = ""
            if self.rdoStartUpIdle.isChecked():
                startUpModeValue = self.wsprDevice.config.deviceconstants.modeIdleChar
            if self.rdoStartUpSignalGen.isChecked():
                startUpModeValue = self.wsprDevice.config.deviceconstants.modeSignalChar
            if self.rdoStartUpWSPRBeacon.isChecked():
                startUpModeValue = self.wsprDevice.config.deviceconstants.modeWSPRChar

            values = [startUpModeValue, self.txtCallsign.text()]
            
            for i, checkbox in enumerate(self.bandCheckboxes):
                valueToSend = ""
                commands.append(Command.BANDS)
                if checkbox.isChecked():
                    checkboxValue = self.wsprDevice.config.deviceconstants.bandEnabledChar
                else:
                    checkboxValue = self.wsprDevice.config.deviceconstants.bandDisabledChar
                #set the bands on the device object
                self.wsprDevice.bands[i][2] = checkboxValue

                valueToSend = str(i).zfill(2) + " " + checkboxValue
                values.append(valueToSend)
            
            #location stuff
            commands.append(Command.LOCATION_STATE)
            if self.useManualLocation.isChecked:
                values.append(self.wsprDevice.config.deviceconstants.locationStateManual)
                commands.append(Command.LOCATION_VALUE)
                values.append(self.manualLocationSetting.text())
            else:
                values.append(self.wsprDevice.config.deviceconstants.locationStateGPS)

            self.deviceCommunicationThread.sendCommand(CommandType.SET, commands, values)

            #after saving update the device object to have the saved values
            self.wsprDevice.callsign = self.txtCallsign.text()
            self.wsprDevice.startupMode = startUpModeValue
        
        return

    def handleCurrentModeWSPRCheck(self):
        #TODO: Fix This
        if self.chkCurrentWSPRBeacon.isChecked:
            self.chkCurrentSignalGen.setChecked(False)
        return
            
    def handleCurrentModeSigGenCheck(self):
        #TODO: Fix This
        if self.chkCurrentSignalGen.isChecked:
            self.chkCurrentWSPRBeacon.setChecked(False)
        return

    def handleStartCurrentMode(self):
        if self.wsprDevice.port is not None:
            commands = []
            values = []
            if self.buttonChangeCurrentMode.text() == "Start":
                if self.chkCurrentSignalGen.isChecked():
                    originalFreq = self.setFrequencyValueLable.text()
                    rawFrequency = self.formatFrequency(originalFreq).replace(",", "").replace(".", "")

                    #save Frequency and mode to signal gen
                    commands = [Command.GENERATOR_FREQUENCY, Command.CURRENT_MODE]
                    values = [rawFrequency, self.wsprDevice.config.deviceconstants.modeSignalChar]
                elif self.chkCurrentWSPRBeacon.isChecked():
                    #save mode to WSPR
                    commands = [Command.GENERATOR_FREQUENCY, Command.CURRENT_MODE]
                    values = [rawFrequency, self.wsprDevice.config.deviceconstants.modeWSPRChar]
                else:
                    #save Mode to Idle
                    commands = [Command.CURRENT_MODE]
                    values = [self.wsprDevice.config.deviceconstants.modeIdleChar]
            else:
                #save Mode to Idle
                    commands = [Command.CURRENT_MODE]
                    values = [self.wsprDevice.config.deviceconstants.modeIdleChar]
            
            self.deviceCommunicationThread.sendCommand(CommandType.SET, commands, values)
            self.deviceCommunicationThread.sendCommand(CommandType.GET, [Command.GENERATOR_FREQUENCY, Command.CURRENT_MODE])
        return
    #####################################
    #END - UI Event Handlers
    #####################################

    #####################################
    #START - Thread Callbacks
    #####################################
    def callbackDetecionChange(self, portName):
        self.textArea.appendPlainText("Connected To Port: " + portName)     
        self.autoDetecThread.pause()   
        self.setConnectionStatus()
        self.deviceCommunicationThread.start()
        self.deviceCommunicationThread.sendCommand(CommandType.GET, self.factorySettingsArray + self.commandArray)
        return
    
    def callbackDeviceRead(self, readText):
        self.textArea.appendPlainText(readText)
        return

    def callbackDeviceFill(self, responce):
        request = responce.split(",")
        if request[0] == self.wsprDevice.config.deviceconstants.commands.responce.callsign:
            self.wsprDevice.callsign = request[1]
        elif request[0] == self.wsprDevice.config.deviceconstants.commands.responce.startupmode:
            self.wsprDevice.startupMode = request[1]
        elif request[0] == self.wsprDevice.config.deviceconstants.commands.responce.power:
            self.wsprDevice.power = request[1]
        
        self.FillData()

    def callbackDeviceRealTime(self, responce):
        request = responce.split(",")
        if request[0] == self.wsprDevice.config.deviceconstants.commands.responce.gpssatdata:
            self.CurrentGPSStatus.setValue(float(request[1]))
        elif request[0] == self.wsprDevice.config.deviceconstants.commands.responce.gpsposition:
            self.gpsPosition.setText(request[1])
        elif request[0] == self.wsprDevice.config.deviceconstants.commands.responce.gpstime:
            self.gpsTime.setText(request[1])
        elif request[0] == self.wsprDevice.config.deviceconstants.commands.responce.gpslocked:
            if request[1] == self.wsprDevice.config.deviceconstants.commands.deviceTrue:
                self.gpsLocked.setStyleSheet(self.wsprDevice.config.gpsLockedTrueCSS)
                self.gpsLocked.setToolTip("GPS Locked")
            else:
                self.gpsLocked.setStyleSheet(self.wsprDevice.config.gpsLockedFalseCSS)
                self.gpsLocked.setToolTip("...Searching...")
        elif request[0] == self.wsprDevice.config.deviceconstants.commands.responce.generatorfrequency:
            self.wsprDevice.generatorfrequency = request[1]
            self.displayCurrentModeValues()
        elif request[0] == self.wsprDevice.config.deviceconstants.commands.responce.transmitting:
            self.wsprDevice.transmitStatus = request[1]
            self.displayCurrentModeValues()
        elif request[0] == self.wsprDevice.config.deviceconstants.commands.responce.currentmode:
            self.wsprDevice.currentMode = request[1]
            self.displayCurrentModeValues()

    def callbackThreadException(self, error):
        #self.textArea.appendPlainText("EXCEPTION IN THREAD!")
        self.textArea.appendPlainText(error)
        self.deviceCommunicationThread.pause()
        self.wsprDevice.port = None
        self.setConnectionStatus()
        self.autoDetecThread.resume()
        self.ClearData()
    #####################################
    #END - Thread Callbacks
    #####################################

    #####################################
    #START - Thread handlers
    #####################################
    def createThreads(self):
        #detect the wspr device
        self.autoDetecThread = AutoDetectionThread(self.wsprDevice)
        self.autoDetecThread.port.connect(self.callbackDetecionChange)
        self.autoDetecThread.read.connect(self.callbackDeviceRead)
        self.autoDetecThread.start()

        #Communicate with wspr device
        self.deviceCommunicationThread = DeviceCommunicationThread(self.wsprDevice)
        self.deviceCommunicationThread.display.connect(self.callbackDeviceRead)
        self.deviceCommunicationThread.update.connect(self.callbackDeviceFill)
        self.deviceCommunicationThread.realtime.connect(self.callbackDeviceRealTime)
        self.deviceCommunicationThread.exception.connect(self.callbackThreadException)
        
    def stopThreads(self):
        self.autoDetecThread.stop()
        self.deviceCommunicationThread.stop()
        self.autoDetecThread.wait()
        self.deviceCommunicationThread.wait()

    def pauseThreads(self):
        self.autoDetecThread.pause()
        self.deviceCommunicationThread.pause()

    #catches the close of the application
    #clears up threads before closing
    def closeEvent(self, event):
        self.stopThreads()
        return

    #####################################
    #END - Thread handlers
    #####################################

    #####################################
    #START - Helper Functions
    #####################################
    def displayCurrentModeValues(self):
        formattedFreq = self.formatFrequency(0)
        #If we have a frequency get it
        if self.wsprDevice.generatorfrequency is not None:
            formattedFreq = self.formatFrequency(self.wsprDevice.generatorfrequency)

        if self.wsprDevice.transmitStatus == self.wsprDevice.config.deviceconstants.commands.deviceTrue:
            #if we are transmitting
            self.transmitStatus.setStyleSheet(self.wsprDevice.config.transmitOnStatusCSS)
            self.transmitStatus.setToolTip(self.wsprDevice.config.transmitOnStatusToolTip)
            self.outputFreq.setText(formattedFreq)

            #if we are transmitting make the start button a stop button
            self.buttonChangeCurrentMode.setText("Stop")
        else:
            #Not transmitting
            self.transmitStatus.setStyleSheet(self.wsprDevice.config.transmitOffStatusCSS)
            self.transmitStatus.setToolTip(self.wsprDevice.config.transmitOffStatusToolTip)
            self.outputFreq.setText(formattedFreq)

            #not transmitting we should make the stop button back to a start button
            self.buttonChangeCurrentMode.setText("Start")

        #depending on the mode we should check or uncheck the set mode checkboxes   
        self.chkCurrentSignalGen.setChecked(self.wsprDevice.currentMode == self.wsprDevice.config.deviceconstants.modeSignalChar)
        self.chkCurrentWSPRBeacon.setChecked(self.wsprDevice.currentMode == self.wsprDevice.config.deviceconstants.modeWSPRChar)
        
        #Set the current mode description
        currentModeDescription = ""
        if self.wsprDevice.currentMode == self.wsprDevice.config.deviceconstants.modeSignalChar:
            currentModeDescription = self.wsprDevice.config.deviceconstants.modeSignalDescription
        elif self.wsprDevice.currentMode == self.wsprDevice.config.deviceconstants.modeWSPRChar:
            currentModeDescription = self.wsprDevice.config.deviceconstants.modeWSPRDescription
        elif self.wsprDevice.currentMode == self.wsprDevice.config.deviceconstants.modeIdleChar:
            currentModeDescription = self.wsprDevice.config.deviceconstants.modeIdleDescription
        
        self.valCurrentMode.setText(currentModeDescription)

        #only set the set frequency if it has not been set
        if self.setFrequencyValueLable.text() == self.formatFrequency(0):
            self.setFrequencyValueLable.setText(formattedFreq)

    def formatFrequency(self, orig_frequency):
        frequency = str(orig_frequency).replace(",", "").replace(".", "").zfill(12)
        gHz = frequency[0:1]
        decimals = frequency[10:12]
        mainDigits = frequency[1:10]
        formattedFreq = gHz + "," + ','.join([mainDigits[i:i+3] for i in range(0, len(mainDigits), 3)]) + "." + decimals
        return formattedFreq
        
    def frequencyTextComplete(self):
        origVal = self.setFrequencyValueLable.text()
        newVal = origVal.replace(",", "").replace(".", "")
        self.setFrequencyValueLable.setText(self.formatFrequency(newVal))

    #####################################
    #END - Helper Functions
    #####################################
Example #39
0
class MainWindow(QWidget):
	"""
	Simple dialog that consists of a Progress Bar and a Button.
	Clicking on the button results in the start of a timer and
	updates the progress bar.
	"""
	start_flag = 1

	def __init__(self):
		QWidget.__init__(self)
		self.setStyleSheet("color: black; background-color: rgb(0,162,232);")
		self.setGeometry(60,80,500,600)

		self.setWindowTitle('Watching SVC Files FOR TYPE3-ABC')
		
		#button
		self.button = QPushButton('Start', self)
		self.button.setStyleSheet("color: black; font-size : 23px; border : 3px solid black")
		self.button.setGeometry(40, 30, 130, 40)
		self.button.clicked.connect(self.onButtonClick)

		#progressbar
		self.progress = QProgressBar(self)
		self.progress.setGeometry(40, 100, 420, 15)
		self.progress.setMaximum(ENV.CYCLE_TIME)


		#List label
		list_label = QLabel(self)
		list_label.setStyleSheet("color: black; font-size : 23px;")
		list_label.setText("PRINTING LOG")
		list_label.setGeometry(60, 160, 200, 30)
		#listbox
		self.listwidget = QListWidget(self)
		self.listwidget.setStyleSheet("color: black; border : 3px solid black; font-size : 16px")
		self.listwidget.setGeometry(40, 200, 420, 300)

		self.time_label = QLabel(self)
		self.time_label.setStyleSheet("color: black; font-size : 20px; border : 3px solid black")
		self.time_label.setText("")
		self.time_label.setGeometry(40, 520, 300, 30)

		timer = QTimer(self)
		timer.timeout.connect(self.showTime)
		timer.start(1000)

		self.show()
		self.start_flag = 1

	def onButtonClick(self):
		if self.start_flag == 0 :
			print ("It started already")
			return
		self.start_flag = 0
		print (self.start_flag)
		try:
		    with open(ENV.MASTERFILEPATH + ENV.TYPE3_PRINT):
		        os.remove(ENV.MASTERFILEPATH + ENV.TYPE3_PRINT)
		        print ("Old TYPE3.csv file will be removed and create a new one.")
		except IOError:
			print ("New TYPE3.csv file will be created")

		try:
		    with open(ENV.MASTERFILEPATH + "Type3_info.csv"):
		        os.remove(ENV.MASTERFILEPATH + "Type3_info.csv")
		        print ("Old TYPE3_info.csv file will be removed and create a new one.")
		except IOError:
			print ("New TYPE3_info.csv file will be created")

		#for type3 processes
		print ("======================================OPENING MASTERSHEET EXCEL FILES================================")
		print ("-------------------------------------- TYPE3 MASTERSHEET ------------------------------------")
		
		#read the master sheet file for each csv files		
		mastersheet = pd.read_excel (ENV.MASTERFILEPATH + ENV.TYPE3_MASTER_FILENAME)
		records = mastersheet.to_records()

		groupmastersheet = pd.read_excel(ENV.MASTERFILEPATH + ENV.GROUP_TYPE3_MASTER_FILENAME)
		group_cnt = len(groupmastersheet.columns)
		key_values = list(groupmastersheet.keys())
		if key_values[-1] == "SKIP n/a" :
			group_cnt -= 1

		self.type3_Run = []

		for x in range(0,group_cnt) :
			groupmastersheet = pd.read_excel(ENV.MASTERFILEPATH + ENV.GROUP_TYPE3_MASTER_FILENAME, usecols = [x])
			group_temp = groupmastersheet.to_records()

			#run new process for new group
			run_index = len(self.type3_Run)
			self.type3_Run.append(TYPE3_LOGIC_THREAD.External())
			self.type3_Run[run_index].files = []
			index = 0
			while 1 :
				if type(group_temp[index][1]) == float:
					break
				#new file object created
				#read file name
				self.type3_Run[run_index].files.append(group_temp[index][1])
				index += 1


			index += 1
			#for triggering B of TVA condition
			self.type3_Run[run_index].Enter_B_INDEX_need = int(group_temp[index][1].replace("B: All Asset Index 4/5 = ", "").replace(" > + Total TVA Sum is Positive All Assets.", ""))
			index += 1

			#for triggering S of TVA condition
			self.type3_Run[run_index].Print_C_IN_B_INDEX = int(group_temp[index][1].replace("C: All Asset Index 4/5 = < ", ""))
			index += 2


			#for printing C in B of TVA condition
			self.type3_Run[run_index].Enter_S_INDEX_need = int(group_temp[index][1].replace("S: All Asset Index 2/3 = ", "").replace(" > + Total TVA Sum is Negative All Assets.", ""))
			index += 1

			#for printing C in S of TVA condition
			self.type3_Run[run_index].Print_C_IN_S_INDEX = int(group_temp[index][1].replace("C: All Asset Index 2/3 = < ", ""))
			index += 2


			#for starting time for this group
			self.type3_Run[run_index].start_hour = int(group_temp[index][1].replace("Start : ", ""))
			index += 1

			#for ending time for this group
			self.type3_Run[run_index].end_hour = int(group_temp[index][1].replace("End : ", ""))
			index += 2

			if len(group_temp) > index and group_temp[index][1] == "OPPOSITE" :
				self.type3_Run[run_index].opposite = group_temp[index + 1][1]

			self.type3_Run[run_index].countChanged.connect(self.onCountChanged)
			self.type3_Run[run_index].printChanged.connect(self.onPrintChanged)
			
			self.type3_Run[run_index].start()


	def onCountChanged(self, value):
		self.progress.setValue(value)

	def onPrintChanged(self, value) :
		self.listwidget.addItems([value])

	def showTime(self) :
		format = "%H:%M:%S"
		# Current time in UTC
		now_gmt = datetime.now(timezone('GMT'))
		gmt_time = now_gmt.astimezone(timezone('Europe/Moscow'))
		self.time_label.setText("GMT+3      " + gmt_time.strftime(format))
Example #40
0
class Dialog(QDialog, Ui_Dialog):
    sendUser = pyqtSignal(object)
    sendCreated = pyqtSignal(object)

    def __init__(self, app, parent=None):
        super(Dialog, self).__init__(parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.setWindowTitle("Process Video")
        self.dir = os.path.dirname(os.path.realpath(__file__))
        self.created = {}
        self.user = None
        self.thread = None
        self.progressBar = None
        self.progressAllBar = None
        self.progressLabel = None
        self.img_exist = False
        self.params_dict = None
        self.of_exist = False
        self.back_of_exist = False
        self.depth_exist = False
        self.gt_exist = False
        self.create_super_pixel_label = False
        self.no_error = True
        self.object_detection_dir_exist = False
        self.vid_name = None
        self.all_run = 1
        self.run_count = 1
        self.fps = 30
        self.fps_limit = 60
        self.low = 0.0
        self.high = 1.0
        self.run_dict = {}
        self.super_pixel_method = ""
        self.app = app
        self.ui.b_info.setIconSize(QSize(50, 50))
        self.ui.b_info.setIcon(QApplication.style().standardIcon(
            QStyle.SP_MessageBoxInformation))
        homedir = os.path.expanduser("~")

        if platform.system() == "Windows":
            datadir = os.sep.join([homedir, "Analyser"])
        else:
            datadir = os.sep.join([homedir, ".analyser"])

        if not os.path.exists(datadir):
            os.makedirs(datadir)

        self.user_file = os.path.join(datadir, ".userInfo.json")

        self.signalSetup()
        self.loadUser()
        self.userSetup()

    def signalSetup(self):
        """
        Setup for signal connections
        """
        self.ui.b_info.clicked.connect(self.showInfo)
        self.ui.b_save.clicked.connect(self.openSave)
        self.ui.b_vid.clicked.connect(self.openVideo)
        self.ui.b_run.clicked.connect(self.startRun)
        self.ui.b_colour.clicked.connect(self.pickColour)
        self.ui.b_ground_truth.clicked.connect(self.openGroundTruth)

        self.ui.t_fps.textChanged.connect(self.changeFps)
        self.ui.t_low.editingFinished.connect(self.changeLow)
        self.ui.t_high.editingFinished.connect(self.changeHigh)
        self.ui.c_error_plot.stateChanged.connect(self.checkFiles)
        self.ui.c_speed_plot.stateChanged.connect(self.checkFiles)
        self.ui.c_crash_plot.stateChanged.connect(self.checkFiles)
        self.ui.combo_superpixel.currentIndexChanged.connect(
            self.changeSuperPixelMethod)
        self.ui.c_optimize.stateChanged.connect(self.checkFiles)
        self.ui.c_draw.stateChanged.connect(self.checkFiles)
        self.ui.c_velocity.stateChanged.connect(self.checkFiles)
        self.ui.c_object_detection.stateChanged.connect(self.checkFiles)

    def showInfo(self):
        """Show information dialog
        """
        widget = DialogInfo(app=self.app, parent=self)
        widget.exec_()

    def changeLow(self):
        """Change the value of the low drop based on the text inside t_low
        """
        self.changeLowHigh(self.ui.t_low, t_type="low")

    def changeHigh(self):
        """Change the value of the high drop based on the text inside t_high
        """
        self.changeLowHigh(self.ui.t_high, t_type="high")

    def changeLowHigh(self, text_widget, t_type="low"):
        """Change the value of low/high drop
        
        Arguments:
            text_widget {QLineEdit} -- t_low or t_high
        
        Keyword Arguments:
            t_type {str} -- which line edit was given (default: {"low"})
        """
        check = re.search("(0[.][0-9]+|1)", text_widget.text())
        if check and self.ui.t_low.text() != self.ui.t_high.text():
            num = check.group()
            i_num = float(num)
            if t_type == "low":
                self.low = i_num
            else:
                self.high = i_num
            text_widget.setText(str(i_num))
        else:
            logging.info("Wrong Input For low or high")
            if t_type == "low":
                text_widget.setText("0.0")
                self.low = 0.0
            else:
                text_widget.setText("1")
                self.high = 1

    def changeSuperPixelMethod(self, index):
        """Change the super pixel method
        
        Arguments:
            index {int} -- index of the selected super pixel method
        """
        if index == 0:
            self.super_pixel_method = ""
        elif index == 1:
            self.super_pixel_method = "Felzenszwalb"
        elif index == 2:
            self.super_pixel_method = "Quickshift"
        elif index == 3:
            self.super_pixel_method = "Slic"
        elif index == 4:
            self.super_pixel_method = "Watershed"

        self.checkFiles()

    def openGroundTruth(self):
        """Open file with ground truth values for speed
        """
        gt_dir = self.openFile(
            self.user["GT"],
            title="Load Ground Truth Data",
            file_filter="Numpy Files (*.npy)",
        )
        if gt_dir != "":
            self.user["GT"] = gt_dir
            self.ui.l_ground_truth.setText("Load: " +
                                           self.splitPath(gt_dir)[-1])
        self.checkFiles()

    def changeFps(self):
        """
        Change fps for the created videos
        """
        check = re.search("[1-9][0-9]*", self.ui.t_fps.text())
        if check:
            num = check.group()
            fps = int(num)
            if fps > self.fps_limit:
                logging.warning(
                    "Too big number for fps. Falling back to {0} fps.".format(
                        self.fps_limit))
                fps = self.fps_limit
            self.fps = fps
            self.ui.t_fps.setText(str(fps))
        else:
            logging.info("Wrong Input For Fps")
            self.ui.t_fps.setText("30")
            self.fps = 30

    def splitPath(self, path):
        """Split the given path based on filesystem
        
        Arguments:
            path {str} -- path you want to split
        
        Returns:
            path splitted on / or \ -- only uses \ on windows
        """
        return os.path.split(path)

    def openSave(self):
        """Open directory to save results
        """
        save_dir = QFileDialog.getExistingDirectory(self, "Select a folder",
                                                    self.user["Save"],
                                                    QFileDialog.ShowDirsOnly)
        if save_dir != "":
            self.user["Save"] = save_dir
            name_split = self.splitPath(save_dir)[-1]
            name = name_split.split(".")[0]
            self.ui.l_save.setText("Save to: " + name)
            self.checkFiles()

    def checkFiles(self):
        """Checks if there are folders from previous runs, so we don't need to create them.
        Also, checks condotions for checkboxes and buttons 
        """
        if self.user["Save"] != "":
            self.of_exist = os.path.exists(
                os.path.join(self.user["Save"], "Of"))
            self.back_of_exist = os.path.exists(
                os.path.join(self.user["Save"], "Back_Of"))
            self.img_exist = os.path.exists(
                os.path.join(self.user["Save"], "Images"))
            self.depth_exist = os.path.exists(
                os.path.join(self.user["Save"], "Depth"))

            self.object_detection_dir_exist = os.path.exists(
                os.path.join(self.user["Save"], "ObjectDetection"))

        self.gt_exist = self.user["GT"] != ""

        self.create_super_pixel_label = (
            self.super_pixel_method != "" and not os.path.exists(
                os.path.join(self.savePathJoin("Super_Pixel"),
                             self.super_pixel_method)))

        self.ui.c_crash_plot_video.setEnabled(self.ui.c_crash_plot.isChecked())
        self.ui.t_low.setEnabled(not self.ui.c_optimize.isChecked())
        self.ui.t_high.setEnabled(not self.ui.c_optimize.isChecked())
        self.ui.c_optimize.setEnabled(self.gt_exist)
        self.ui.c_error_plot.setEnabled(self.gt_exist)
        self.ui.c_error_plot_video.setEnabled(self.ui.c_error_plot.isChecked())
        self.ui.c_speed_plot_video.setEnabled(self.ui.c_speed_plot.isChecked())
        self.ui.c_super_pixel_video.setEnabled(
            self.ui.combo_superpixel.currentIndex() != 0)
        self.ui.c_csv.setEnabled(self.ui.c_error_plot.isChecked())

        if self.runRequirements():
            self.ui.b_run.setEnabled(True)
        else:
            self.ui.b_run.setEnabled(False)

    def runRequirements(self):
        """Basic requirements to start run
        
        Returns:
            bool -- returns true if the requirements are satisfied
        """
        ready = (self.user["Save"] != ""
                 and self.user["Video"] != "") or self.img_exist
        return ready

    def openVideo(self):
        """Open video to analyze
        """
        fname = self.openFile(self.user["Video"])
        if fname != "":
            error_opening_video = False

            cam = cv2.VideoCapture(fname)
            logging.info("Opening video Check: {0}".format(fname))

            currentframe = 0
            ret, frame = cam.read()

            if ret is False:
                error_opening_video = True
            # Release all space and windows once done
            cam.release()
            cv2.destroyAllWindows()

            if error_opening_video:
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Information)
                msg.setText("Error on opening the video: {0}".format(fname))
                msg.setWindowTitle("Information")
                msg.setStandardButtons(QMessageBox.Ok)
                msg.exec_()
            else:
                self.user["Video"] = fname
                name = self.splitPath(fname)[-1]
                self.vid_name = name.split(".")[0]
                self.ui.l_vid.setText("Load: " + self.vid_name)
                self.checkFiles()

    def openFile(self,
                 folder,
                 title="Open Video",
                 file_filter="Video Files (*.mp4 *.avi *.mkv)"):
        """Open QFileDialog with the given parameters, returns selected file
        
        Arguments:
            folder {str} -- path where the file dialog should start
        
        Keyword Arguments:
            title {str} -- title of the file dialog (default: {"Open Video"})
            file_filter {str} -- filter for file extensions (default: {"Video Files (*.mp4 *.avi *.mkv)"})
        
        Returns:
            str -- path to file
        """
        fname = QFileDialog.getOpenFileName(self, title, folder, file_filter)

        return fname[0]

    def userSetup(self):
        """Label text setup if the user json is not empty
        """
        if self.user["Save"] == "":
            self.ui.b_run.setEnabled(False)
        else:
            name_split = self.splitPath(self.user["Save"])[-1]
            name = name_split.split(".")[0]
            self.ui.l_save.setText("Save to: " + name)

            if self.user["GT"] != "":
                self.ui.l_ground_truth.setText(
                    self.splitPath(self.user["GT"])[-1])

            self.ui.l_colour.setText(self.user["Colour"])

    def loadUser(self):
        """Load user file if exists, create empty otherwise
        """
        if os.path.isfile(self.user_file):
            logging.info("Found User File")
            with open(self.user_file, "r") as json_file:
                self.user = json.load(json_file)
            self.checkFiles()
        else:
            self.user = {
                "Save": "",
                "Of": "",
                "Depth": "",
                "Video": "",
                "Colour": "#1a1a1b",
                "GT": "",
            }
            self.saveUser()

    def saveUser(self):
        """Saves user data to json file
        """
        self.user["Video"] = ""
        with open(self.user_file, "w+") as json_file:
            json.dump(self.user, json_file, indent=4)

    def errorChecks(self):
        """Check for errors and inform the user in a QMessageBox if found any
        
        Returns:
            bool -- if true then the execution stops
        """
        stop_calculation = False
        found_error = False
        errors = {"Info": [], "Critical": []}
        error_types = []
        ori_images = 0
        of_images = 0
        depth_images = 0
        back_of_images = 0

        if os.path.exists(self.savePathJoin("Images")):
            ori_images = len(
                listDirectory(self.savePathJoin("Images"), extension="png"))
        # Check image folder
        if self.img_exist and not os.path.exists(self.savePathJoin("Images")):
            if os.path.exists(self.user["Video"]):
                errors["Info"].append(
                    "Images folder {0} doesn't exist -> Recreate it and recalculate optical flow and depth estimations"
                    .format(self.savePathJoin("Images")))
                error_types.append("NoImages")
            else:
                stop_calculation = True
                errors["Critical"].append((
                    "Images folder {0} and video file {1} don't exist -> Stopping run"
                    .format(self.savePathJoin("Images"), self.user["Video"])))
        elif self.img_exist and os.path.exists(self.user["Video"]):
            errors["Info"].append(
                "Both the video {0} and Images folder {1} exist -> using Images folder by default"
                .format(self.user["Video"], self.savePathJoin("Images")))
        elif not self.img_exist and not os.path.isfile(self.user["Video"]):
            stop_calculation = True
            errors["Critical"].append((
                "Images folder {0} and video file {1} don't exist -> Stopping run"
                .format(self.savePathJoin("Images"), self.user["Video"])))

        # Check video file
        if self.user["Video"] != "" and not os.path.isfile(self.user["Video"]):
            if os.path.exists(self.savePathJoin("Images")):
                errors["Info"].append((
                    "Video file {0} doesn't exist -> Using images in the Images folder instead"
                    .format(self.user["Video"])))
            else:
                stop_calculation = True
                errors["Critical"].append((
                    "Images folder {0} and video file {1} don't exist -> Stopping run"
                    .format(self.savePathJoin("Images"), self.user["Video"])))
        elif os.path.isfile(self.user["Video"]) and os.path.exists(
                self.savePathJoin("Images")):
            pass

        # Check optical flow
        if self.of_exist and not os.path.exists(self.savePathJoin("Of")):
            errors["Info"].append((
                "Optical flow folder {0} doesn't exist -> Recalculating optical flow"
                .format(self.savePathJoin("Of"))))
            error_types.append("NoOf")
        elif self.of_exist:
            of_images = len(
                listDirectory(self.savePathJoin("Of"), extension="png"))
            if of_images != ori_images - 1 and ori_images != 0:
                errors["Info"].append((
                    "Optical flow image number {0} doesn't match video image number {1} - 1 -> Recalculating optical flow"
                    .format(of_images, ori_images)))
                error_types.append("NoOf")

        # Check backward optical flow
        if self.back_of_exist and not os.path.exists(
                self.savePathJoin("Back_Of")):
            errors["Info"].append((
                "Backward optical flow folder {0} doesn't exist -> Recalculating backward optical flow"
                .format(self.savePathJoin("Back_Of"))))
            error_types.append("NoOf")
        elif self.back_of_exist:
            back_of_images = len(
                listDirectory(self.savePathJoin("Back_Of"), extension="png"))
            if back_of_images != of_images:
                errors["Info"].append((
                    "Backward optical flow image number {0} doesn't match optical flow image number {1} -> Recalculating backward optical flow"
                    .format(back_of_images, of_images)))
                error_types.append("NoOf")

        # Check depth estimation
        if self.depth_exist and not os.path.exists(self.savePathJoin("Depth")):
            errors["Info"].append((
                "Depth folder {0} doesn't exist -> Recalculating depth".format(
                    self.savePathJoin("Depth"))))
            error_types.append("NoDepth")
        elif self.depth_exist:
            depth_images = len(
                listDirectory(self.savePathJoin("Depth"), extension="png"))
            if depth_images != ori_images and ori_images != 0:
                errors["Info"].append((
                    "Depth image number {0} doesn't match video image number {1} -> Recalculating depth"
                    .format(depth_images, ori_images)))
                error_types.append("NoDepth")

        # Check ground truth
        if self.gt_exist and not os.path.isfile(self.user["GT"]):
            errors["Info"].append(
                ("Ground Truth file {0} doesn't exist -> File won't be used".
                 format(self.user["GT"])))
            error_types.append("NoGT")

        # Check super pixel labels
        if (self.super_pixel_method != "" and os.path.exists(
                os.path.join(self.savePathJoin("Super_Pixel"),
                             self.super_pixel_method)) and ori_images != 0
                and len(
                    listDirectory(
                        os.path.join(self.savePathJoin("Super_Pixel"),
                                     self.super_pixel_method),
                        extension=".npy",
                    )) != ori_images):
            errors["Info"].append((
                "Super pixel label number {0} doesn't match image number {1} -> Recalculating super pixel labels"
                .format(
                    len(
                        listDirectory(
                            os.path.join(
                                self.savePathJoin("Super_Pixel"),
                                self.super_pixel_method,
                            ),
                            extension=".npy",
                        )),
                    ori_images,
                )))
            error_types.append("LabelError")

        # Check object detection
        if self.ui.c_object_detection.isChecked() and os.path.exists(
                self.savePathJoin("ObjectDetection")):
            if (len(
                    listDirectory(self.savePathJoin("ObjectDetection"),
                                  extension=".png")) != ori_images):
                errors["Info"].append(
                    "Object Detection image number {0} doesn't match image number of video {1} -> Recalculating object detection"
                    .format(
                        len(
                            listDirectory(self.savePathJoin("ObjectDetection"),
                                          extension=".png")),
                        ori_images,
                    ))
                error_types.append("ObDetError")
            elif (len(
                    listDirectory(self.savePathJoin("ObjectDetection"),
                                  extension=".npy")) != ori_images):
                errors["Info"].append(
                    "Object Detection numpy array number {0} doesn't match image number of video {1} -> Recalculating object detection"
                    .format(
                        len(
                            listDirectory(self.savePathJoin("ObjectDetection"),
                                          extension=".npy")),
                        ori_images,
                    ))
                error_types.append("ObDetError")

        answer = ""
        if len(errors["Info"]) > 0 and len(errors["Critical"]) == 0:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Information)
            msg.setText(
                "Some calculations might not run the way you expect them.\nIn show details check the right side of the arrows to see what will happen."
            )
            msg.setWindowTitle("Information")
            all_info = ""
            for info in errors["Info"]:
                all_info += info + "\n\n"
            msg.setDetailedText(all_info)
            msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Abort)
            answer = msg.exec_()
        elif len(errors["Critical"]) > 0:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText(
                "Found critical error\nCouldn't start run, see show details for more information"
            )
            msg.setWindowTitle("Critical Error")
            all_info = ""
            for info in errors["Critical"]:
                all_info += info + "\n"
            msg.setDetailedText(all_info)
            msg.setStandardButtons(QMessageBox.Abort)
            answer = msg.exec_()

        if answer != int("0x00040000", 16):
            for ty in error_types:
                logging.info("Solve error: {0}".format(ty))
                if ty == "NoImage":
                    self.img_exist = False
                    self.of_exist = False
                    self.back_of_exist = False
                    self.depth_exist = False
                elif ty == "NoOf":
                    self.of_exist = False
                    self.back_of_exist = False
                elif ty == "NoDepth":
                    self.depth_exist = False
                elif ty == "NoGT":
                    self.gt_exist = False
                    self.user["GT"] = ""
                elif ty == "LabelError":
                    self.create_super_pixel_label = True
                    shutil.rmtree(
                        os.path.join(self.savePathJoin("Super_Pixel"),
                                     self.super_pixel_method))
                elif ty == "ObDetError":
                    self.object_detection_dir_exist = False
                    shutil.rmtree(self.savePathJoin("ObjectDetection"))

        return answer == int("0x00040000", 16) or stop_calculation

    def calculateError(self, errorMessage):
        """Called if there were errors while calculating the results, creates QMessageBox
        
        Arguments:
            errorMessage {str} -- error message to be shown in the QMessageBox
        """
        self.no_error = False
        QMessageBox.warning(self, "Found Error", errorMessage, QMessageBox.Ok,
                            QMessageBox.Ok)

    def buildParamsDict(self):
        """Build parameter dictionary to forward parameters for the calcRunner class
        """
        self.params_dict = {
            "img_dir":
            self.savePathJoin("Images"),
            "depth_dir":
            self.savePathJoin("Depth"),
            "back_of_dir":
            self.savePathJoin("Back_Of"),
            "of_dir":
            self.savePathJoin("Of"),
            "save_dir":
            self.user["Save"],
            "high":
            self.high,
            "low":
            self.low,
            "run_dict":
            self.run_dict,
            "of_model":
            self.app.get_resource(
                os.path.join("of_models", "network-default.pytorch")),
            "depth_model":
            self.app.get_resource(
                os.path.join("depth_models", "model_city2kitti.meta")),
            "yolo_weights":
            self.app.get_resource(os.path.join("yolo", "yolov3.weights")),
            "yolo_v":
            self.app.get_resource(os.path.join("yolo", "yolov3.cfg")),
            "coco_names":
            self.app.get_resource(os.path.join("yolo", "coco.names")),
            "object_detection_dir":
            self.savePathJoin("ObjectDetection"),
            "plot_speed_dir":
            PLOT_SPEED_DIR,
            "plot_crash_dir":
            PLOT_CRASH_DIR,
            "numbers_dir":
            NP_DIR,
            "plot_error_dir":
            PLOT_ERROR_DIR,
            "speed_gt":
            self.user["GT"],
            "vid_path":
            self.user["Video"],
            "super_pixel_method":
            self.super_pixel_method,
            "super_pixel_dir":
            SUPER_PIXEL_DIR,
            "send_video_frame":
            False,
            "create_csv":
            self.ui.c_csv.isChecked(),
            "create_draw":
            self.ui.c_draw.isChecked(),
            "create_velocity":
            self.ui.c_velocity.isChecked(),
            "create_video_fps":
            int(self.ui.t_fps.text()),
            "optimize_params":
            self.ui.c_optimize.isChecked(),
            "super_pixel_label_dir":
            os.path.join(self.savePathJoin("Super_Pixel"),
                         self.super_pixel_method),
        }

    def startRun(self):
        """Check for errors and start calculations
        """
        self.checkFiles()
        if self.errorChecks():
            logging.info("Error Check Failed")
            return

        self.disableButtons()
        self.sendUser.emit(self.user)
        logging.info("Start Run Class")
        self.createDirs()
        self.buildRunDict()

    def startCalcThread(self):
        """Starting calculations on another thread
        """
        # 1 - create Worker and Thread inside the Form
        self.worker = calcRunner.CalculationRunner(self.params_dict)
        self.thread = QThread()  # no parent!

        self.worker.labelUpdate.connect(self.labelUpdate)

        self.worker.update.connect(self.progressUpdate)

        self.worker.error.connect(self.calculateError)

        self.worker.finished.connect(self.finishThread)

        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker.startThread)
        # 6 - Start the thread
        self.thread.start()

    def progressUpdate(self, value):
        """Updating both progressbar
        
        Arguments:
            value {int} -- current progress
        """
        self.progressBar.setValue(value)
        logging.info("Update progressbar to: {0}".format(self.run_count))
        if self.progressAllBar is not None:
            self.run_count += 1
            self.progressAllBar.setValue(self.run_count)

    def finishThread(self):
        """Clean up after calculations thread finished
        """
        logging.info("Fin Thread")
        self.buildCreatedDict()
        self.cleanThread()
        self.accept()

    def cleanThread(self):
        """Cleans the active thread
        """
        logging.info("Clean Thread")
        self.thread.quit()
        self.thread.wait()

    def labelUpdate(self, run_dict):
        """Update progressbar label's text to show the current calculation
        
        Arguments:
            run_dict {dictionary} -- dictionary of the current process
        """
        self.progressBar.reset()
        self.progressBar.setMinimum(1)
        self.progressBar.setMaximum(run_dict["Progress"])
        self.progressLabel.setText(run_dict["Text"])

    def showProgressBar(self):
        """Creates two progressbars to show how the calculation progresses
        """
        logging.info("Show progress bar")
        self.progressLabel = QLabel(self)
        font = QFont()
        font.setFamily("GE Inspira")
        font.setPointSize(20)
        self.progressLabel.setFont(font)
        self.progressLabel.setAlignment(Qt.AlignCenter)
        self.progressLabel.setText("Hello")
        self.ui.layout_v.addWidget(self.progressLabel)

        self.progressBar = QProgressBar(self)  # Progress bar created
        self.progressBar.setRange(0, 0)
        self.ui.layout_v.addWidget(self.progressBar)

    def addAllProgressBar(self):
        """Adds the progress bar which tracks the progress of all calculations
        """
        all_run = sum([
            self.run_dict[key]["Progress"] for key in self.run_dict
            if self.run_dict[key]["Run"]
        ])
        logging.info("All run: {0}".format(all_run))
        self.progressAllBar = QProgressBar(self)  # Progress bar created
        self.progressAllBar.setMinimum(1)
        self.progressAllBar.setMaximum(all_run)
        self.ui.layout_v.addWidget(self.progressAllBar)
        self.progressAllBar.setValue(1)

    def buildCreatedDict(self):
        """Build dictionary containing the created plots (if there's any).
        Send signal with this dictionary
        """
        self.created = {}
        if self.ui.c_speed_plot.isChecked():
            self.created["Speed_Plot"] = self.savePathJoin(PLOT_SPEED_DIR)
        if self.ui.c_error_plot.isChecked() and self.no_error:
            self.created["Error_Plot"] = self.savePathJoin(PLOT_ERROR_DIR)
        if self.ui.c_crash_plot.isChecked():
            self.created["Crash_Plot"] = self.savePathJoin(PLOT_CRASH_DIR)
        self.sendCreated.emit(self.created)

    def buildRunDict(self):
        """Create images from video in another thread, loads the image number otherwise
        """
        self.showProgressBar()
        ori_images = 0
        if self.img_exist:
            ori_images = len(listDirectory(self.savePathJoin("Images")))
            self.buildRunDictMain(ori_images)
        else:
            self.run_dict["Video"] = {
                "Run": True,
                "Progress": ori_images,
                "Text": "Preparing video",
            }
            self.buildParamsDict()
            self.params_dict["send_video_frame"] = True

            self.progressLabel.setText("Create images from video")

            self.worker = calcRunner.CalculationRunner(
                self.params_dict)  # no parent!
            self.thread = QThread()  # no parent!

            self.worker.labelUpdate.connect(self.labelUpdate)

            self.worker.update.connect(self.progressUpdate)
            self.worker.videoFrame.connect(self.setVidFrame)

            self.worker.moveToThread(self.thread)
            self.thread.started.connect(self.worker.startThread)
            self.thread.start()

    def setVidFrame(self, ori_images):
        """Gets called when the image creation from video finishes
        
        Arguments:
            ori_images {int} -- number of images in the video
        """
        self.cleanThread()
        if ori_images == 0:
            logging.critical("Video Image number 0")
        else:
            self.buildRunDictMain(ori_images)

    def buildRunDictMain(self, ori_images):
        """Build dictionary with all calculations
        Dictionary fields:
            -Run: {bool} true if needs to be calculated, false otherwise
            -Progress: {int} the amount of steps to complete the calculation (used to update the progressbar)
            -Text: {str} the text to be showed in the progressbar label's when the calculation is running   
        """
        self.run_dict["Of"] = {
            "Run": not self.of_exist,
            "Progress": ori_images,
            "Text": "Running optical flow",
        }
        self.run_dict["Back_Of"] = {
            "Run": not self.back_of_exist,
            "Progress": ori_images,
            "Text": "Running back optical flow",
        }
        self.run_dict["Depth"] = {
            "Run": not self.depth_exist,
            "Progress": ori_images,
            "Text": "Running depth estimation",
        }
        self.run_dict["Speed"] = {
            "Run": True,
            "Progress": ori_images,
            "Text": "Running speed estimation",
        }
        self.run_dict["Optimization"] = {
            "Run": self.ui.c_optimize.isChecked(),
            "Progress": ori_images * 9,
            "Text": "Running parameter optimization",
        }

        self.run_dict["Of_Vid"] = {
            "Run": self.ui.c_of.isChecked(),
            "Progress": ori_images,
            "Text": "Creating optical flow video",
        }
        self.run_dict["Back_Of_Vid"] = {
            "Run": self.ui.c_back_of.isChecked(),
            "Progress": ori_images,
            "Text": "Creating backward optical flow video",
        }
        self.run_dict["Depth_Vid"] = {
            "Run": self.ui.c_depth.isChecked(),
            "Progress": ori_images,
            "Text": "Creating depth estimation video",
        }

        self.run_dict["Speed_Plot"] = {
            "Run": self.ui.c_speed_plot.isChecked(),
            "Progress": ori_images,
            "Text": "Creating plot for speed values",
        }
        self.run_dict["Crash_Plot"] = {
            "Run": self.ui.c_crash_plot.isChecked(),
            "Progress": ori_images,
            "Text": "Creating plot for time to crash",
        }
        self.run_dict["Error_Plot"] = {
            "Run": self.ui.c_error_plot.isChecked() and self.gt_exist,
            "Progress": ori_images,
            "Text": "Creating plot for speed error",
        }

        self.run_dict["Speed_Plot_Video"] = {
            "Run": self.ui.c_speed_plot_video.isChecked(),
            "Progress": ori_images,
            "Text": "Creating speed plot video",
        }
        self.run_dict["Error_Plot_Video"] = {
            "Run": self.ui.c_error_plot_video.isChecked() and self.gt_exist,
            "Progress": ori_images,
            "Text": "Creating error plot video",
        }
        self.run_dict["Crash_Plot_Video"] = {
            "Run": self.ui.c_crash_plot_video.isChecked(),
            "Progress": ori_images,
            "Text": "Creating time to crash plot video",
        }

        self.run_dict["Super_Pixel_Video"] = {
            "Run":
            self.ui.combo_superpixel.currentIndex() != 0
            and self.ui.c_super_pixel_video.isChecked(),
            "Progress":
            ori_images,
            "Text":
            "Creating super pixel video",
        }
        self.run_dict["Super_Pixel_Label"] = {
            "Run":
            self.create_super_pixel_label,
            "Progress":
            ori_images,
            "Text":
            "Creating {0} superpixel labels".format(self.super_pixel_method),
        }

        self.run_dict["Object_Detection"] = {
            "Run": (self.ui.c_object_detection.isChecked()
                    or self.ui.c_crash_plot.isChecked())
            and not self.object_detection_dir_exist,
            "Progress":
            ori_images,
            "Text":
            "Running Object Detection",
        }

        self.addAllProgressBar()
        self.buildParamsDict()
        self.saveUser()
        self.startCalcThread()

    def disableButtons(self):
        """Disable widgets while the calculation is running
        """
        self.ui.b_run.setEnabled(False)
        self.ui.b_colour.setEnabled(False)
        self.ui.b_ground_truth.setEnabled(False)
        self.ui.b_vid.setEnabled(False)
        self.ui.b_save.setEnabled(False)
        self.ui.t_low.setEnabled(False)
        self.ui.t_high.setEnabled(False)
        self.ui.t_fps.setEnabled(False)
        self.ui.combo_superpixel.setEnabled(False)
        self.ui.c_super_pixel_video.setEnabled(False)
        self.ui.c_csv.setEnabled(False)
        self.ui.c_draw.setEnabled(False)
        self.ui.c_velocity.setEnabled(False)
        self.ui.c_of.setEnabled(False)
        self.ui.c_back_of.setEnabled(False)
        self.ui.c_depth.setEnabled(False)
        self.ui.c_speed_plot.setEnabled(False)
        self.ui.c_error_plot.setEnabled(False)
        self.ui.c_crash_plot.setEnabled(False)
        self.ui.c_error_plot_video.setEnabled(False)
        self.ui.c_speed_plot_video.setEnabled(False)
        self.ui.c_crash_plot_video.setEnabled(False)
        self.ui.c_optimize.setEnabled(False)
        self.ui.c_object_detection.setEnabled(False)

    def savePathJoin(self, path):
        """Join the given path with the save path (stored in user info)
        
        Arguments:
            path {str} -- path to join after the save path
        
        Returns:
            str -- joined path
        """
        return os.path.join(self.user["Save"], path)

    def createDir(self, dir_name):
        """Create directory with the given name in the save path (stored in user info)
        
        Arguments:
            dir_name {str} -- path to the newly created dir
        """
        os.mkdir(os.path.join(self.user["Save"], dir_name))

    def createDirs(self):
        """Create or recreate (destroy and create) directories for the calculations
        """
        logging.info("Creating Directories")

        if not self.img_exist:
            self.reCreateDir(self.savePathJoin("Images"))
        if not self.of_exist:
            self.reCreateDir(self.savePathJoin("Of"))
        if not self.back_of_exist:
            self.reCreateDir(self.savePathJoin("Back_Of"))
        if not self.depth_exist:
            self.reCreateDir(self.savePathJoin("Depth"))
        if not self.object_detection_dir_exist and (
                self.ui.c_object_detection.isChecked()
                or self.ui.c_crash_plot.isChecked()):
            self.reCreateDir(self.savePathJoin("ObjectDetection"))
        if self.super_pixel_method != "" and not os.path.exists(
                os.path.join(self.savePathJoin("Super_Pixel"),
                             self.super_pixel_method)):
            os.makedirs(
                os.path.join(self.savePathJoin("Super_Pixel"),
                             self.super_pixel_method))

        self.reCreateDir(RESULTS)
        self.reCreateDir(NP_DIR)
        self.reCreateDir(MASK_DIR)

        if self.ui.c_crash_plot.isChecked():
            self.reCreateDir(PLOT_CRASH_DIR)
        if self.ui.c_draw.isChecked():
            self.reCreateDir(DRAW_DIR)
        if self.ui.c_velocity.isChecked():
            self.reCreateDir(VL_DIR)
        if self.ui.c_speed_plot.isChecked():
            self.reCreateDir(PLOT_SPEED_DIR)
        if self.super_pixel_method != "":
            self.reCreateDir(SUPER_PIXEL_DIR)
        if self.user["GT"] != "" and self.ui.c_error_plot.isChecked():
            self.reCreateDir(PLOT_ERROR_DIR)

    def reCreateDir(self, name):
        """Create directory with the given name in save dir (stored in user info).
        If it already exists, then delete it first
        
        Arguments:
            name {str} -- name of the new directory
        """
        path = self.savePathJoin(name)
        if os.path.exists(path):
            shutil.rmtree(path)
        os.makedirs(path)

    def pickColour(self):
        """Opens a QColorDialog to choose a colour
        """
        colour = QColorDialog.getColor()
        if colour.isValid():
            self.user["Colour"] = colour.name()
            self.ui.l_colour.setText(self.user["Colour"])
Example #41
0
    def __init__(self, configFile):
        super(WSPRUI, self).__init__()

        #Things that we need to keep track of to update
        self.wsprDevice = WSPRInterfaceObject(configFile)
        
        self.bandCheckboxes = []
        self.CurrentGPSStatus = QProgressBar(self)
        self.gpsTime = QLabel("00:00:00")
        self.gpsPosition = QLabel("0000")
        self.gpsPower = QLabel("0")
        self.outputFreq = QLabel(self.formatFrequency("0"))
        self.setFrequencyValueLable = QLineEdit(self.formatFrequency("0"))
        self.dialFrequency = QDial()
        self.gpsLocked = QLabel("GPS Signal Quality:")
        
        self.portConnectionIcon = QLabel()
        self.portConnectionIcon.setFixedSize(50, 50)
        self.portConnectionIcon.mousePressEvent = self.handleConnectionIconClick

        self.txtCallsign = QLineEdit()

        self.portConnectionLabel = QLabel(self.wsprDevice.config.notconnectedtext)

        self.rdoStartUpSignalGen = QRadioButton("Signal Generator")
        self.rdoStartUpWSPRBeacon = QRadioButton("WSPR Beacon")
        self.rdoStartUpIdle = QRadioButton("Idle")

        self.pauseAfterTransmission = QLineEdit("120")
        self.manualLocationSetting = QLineEdit("FN44")
        self.useManualLocation = QCheckBox()

        self.chkCurrentSignalGen = QCheckBox("Signal Generator")
        self.chkCurrentWSPRBeacon = QCheckBox("WSPR Beacon")

        self.valCurrentMode = QLabel("")
        self.transmitStatus = QLabel("")

        self.buttonReload = QPushButton("Reload")
        self.buttonReload.setFixedSize(100, 50)
        self.buttonReload.clicked.connect(self.handleReloadPush)
        self.buttonReload.setVisible(self.wsprDevice.config.debug)

        self.buttonSave = QPushButton("Save")
        self.buttonChangeCurrentMode = QPushButton("Start")

        self.debugSection = QGroupBox("Info")

        self.textArea = QPlainTextEdit()
        self.textArea.setMaximumBlockCount(self.wsprDevice.config.debugAreaMaximumBlockCount)
        self.textArea.setReadOnly(True)
        
        self.commandArray = [Command.CALLSIGN,
                             Command.BANDS,
                             Command.STARTUP_MODE,
                             Command.CURRENT_MODE,
                             Command.POWER,
                             Command.GENERATOR_FREQUENCY]

        self.factorySettingsArray = [Command.FACTORY_FREQUENCY_REFERENCE_OSCILLATOR_FREQUENCY,
                                    Command.FACTORY_HARDWARE_REVISION,
                                    Command.FACTORY_HARDWARE_VERSION,
                                    Command.FACTORY_LOWPASS_FINTER_INSTALLED,
                                    Command.FACTORY_PRODUCT_NUMBER,
                                    Command.FACTORY_SOFTWARE_REVISION,
                                    Command.FACTORY_SOFTWARE_VERSION]
        #Create the UI
        self.initUI()
        
        #Threads
        self.createThreads()
Example #42
0
    def initUI(self):
        global button1
        global button2
        global button3
        global button4
        global button5

        self.setWindowTitle(self.title)
        self.setMaximumSize(620, 400)
        self.setMinimumSize(620, 700)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setWindowIcon(QIcon("images.ico"))

        button1 = QPushButton('Select Files', self)
        button1.setToolTip('This is an example button')
        button1.move(70, 60)
        button1.resize(100, 30)
        button1.clicked.connect(self.openFileNamesDialog)

        button2 = QPushButton('Run for All', self)
        button2.setToolTip('This is an example button')
        button2.move(70, 480)
        button2.resize(240, 30)
        button2.clicked.connect(self.trim)
        button2.setEnabled(False)

        button3 = QPushButton('Run for Affacted', self)
        button3.setToolTip('This is an example button')
        button3.move(310, 450)
        button3.resize(240, 30)
        button3.clicked.connect(self.trim_affacted)
        button3.setEnabled(False)

        button4 = QPushButton('Check Affacted Files', self)
        button4.setToolTip('This is an example button')
        button4.move(70, 450)
        button4.resize(240, 30)
        button4.clicked.connect(self.check_Extra_spaces, )
        button4.setEnabled(False)

        button5 = QPushButton('Reset', self)
        button5.setToolTip('This is an example button')
        button5.move(310, 480)
        button5.resize(240, 30)
        button5.clicked.connect(self.reset)
        button5.setEnabled(False)

        button6 = QPushButton('Close', self)
        button6.setToolTip('This is an example button')
        button6.move(450, 630)
        button6.resize(100, 30)
        button6.clicked.connect(self.close_window)

        # button7 = QPushButton('See logs', self)
        # button7.setToolTip('This is an example button')
        # button7.move(250, 630)
        # button7.resize(100, 30)
        # button7.clicked.connect(self.openpop_up)

        label2 = QLabel('Set Output Path :', self)
        label2.move(70, 155)

        global textbox1
        global textbox2
        global textbox3
        global model, list1

        textbox1 = QLineEdit(self)
        textbox1.move(170, 60)
        textbox1.resize(380, 30)
        textbox1.setReadOnly(True)

        textbox2 = QLineEdit(desktop, self)
        textbox2.move(170, 150)
        textbox2.resize(380, 30)

        list1 = QListView(self)
        list1.setWindowTitle('Affected File List')
        list1.setMinimumSize(100, 200)
        list1.move(70, 240)
        list1.resize(480, 26)
        list1.setEditTriggers(QAbstractItemView.NoEditTriggers)

        global progress
        progress = QProgressBar(self)
        progress.move(70, 530)
        progress.resize(500, 26)
        progress.setValue(0)

        self.show()
Example #43
0
class ScreenshotsDialog(QDialog):

    MAX_HEIGHT = 600
    MAX_WIDTH = 800

    def __init__(self, pkg: PackageView, http_client: HttpClient,
                 icon_cache: MemoryCache, i18n: I18n,
                 screenshots: List[QPixmap], logger: logging.Logger):
        super(ScreenshotsDialog, self).__init__()
        self.setWindowTitle(str(pkg))
        self.screenshots = screenshots
        self.logger = logger
        self.loaded_imgs = []
        self.download_threads = []
        self.resize(1280, 720)
        self.i18n = i18n
        self.http_client = http_client
        self.progress_bar = QProgressBar()
        self.progress_bar.setMaximumHeight(10 if QApplication.instance().style(
        ).objectName().lower() == 'windows' else 6)
        self.progress_bar.setTextVisible(False)
        self.thread_progress = AnimateProgress()
        self.thread_progress.signal_change.connect(self._update_progress)
        self.thread_progress.start()

        # THERE ARE CRASHES WITH SOME RARE ICONS ( like insomnia ). IT CAN BE A QT BUG. IN THE MEANTIME, ONLY THE TYPE ICON WILL BE RENDERED
        #
        # icon_data = icon_cache.get(pkg.model.icon_url)
        #
        # if icon_data and icon_data.get('icon'):
        #     self.setWindowIcon(icon_data.get('icon'))
        # else:
        #     self.setWindowIcon(QIcon(pkg.model.get_type_icon_path()))
        self.setWindowIcon(QIcon(pkg.model.get_type_icon_path()))
        self.setLayout(QVBoxLayout())

        self.img = QLabel()
        self.layout().addWidget(self.img)

        self.bottom_bar = QToolBar()

        self.bt_back = QPushButton(
            ' < ' + self.i18n['screenshots.bt_back.label'].capitalize())
        self.bt_back.setCursor(QCursor(Qt.PointingHandCursor))
        self.bt_back.clicked.connect(self.back)
        self.ref_bt_back = self.bottom_bar.addWidget(self.bt_back)
        self.bottom_bar.addWidget(new_spacer(50))

        self.img_label = QLabel()
        self.img_label.setStyleSheet(
            'QLabel { font-weight: bold; text-align: center }')
        self.ref_img_label = self.bottom_bar.addWidget(self.img_label)
        self.ref_img_label.setVisible(False)
        self.ref_progress_bar = self.bottom_bar.addWidget(self.progress_bar)
        self.bottom_bar.addWidget(new_spacer(50))

        self.bt_next = QPushButton(
            self.i18n['screenshots.bt_next.label'].capitalize() + ' > ')
        self.bt_next.setCursor(QCursor(Qt.PointingHandCursor))
        self.bt_next.clicked.connect(self.next)
        self.ref_bt_next = self.bottom_bar.addWidget(self.bt_next)

        self.layout().addWidget(self.bottom_bar)

        self.img_idx = 0

        for idx, s in enumerate(self.screenshots):
            t = Thread(target=self._download_img, args=(idx, s), daemon=True)
            t.start()

        self._load_img()

    def _update_progress(self, val: int):
        self.progress_bar.setValue(val)

    def _load_img(self):
        if len(self.loaded_imgs) > self.img_idx:
            img = self.loaded_imgs[self.img_idx]

            if isinstance(img, QPixmap):
                self.img_label.setText('')
                self.img.setPixmap(img)
            else:
                self.img_label.setText(img)
                self.img.setPixmap(QPixmap())

            self.thread_progress.stop = True
            self.ref_progress_bar.setVisible(False)
            self.ref_img_label.setVisible(True)
        else:
            self.img.setPixmap(QPixmap())
            self.ref_img_label.setVisible(False)
            self.ref_progress_bar.setVisible(True)
            self.thread_progress.start()

        if len(self.screenshots) == 1:
            self.ref_bt_back.setVisible(False)
            self.ref_bt_next.setVisible(False)
        else:
            self.ref_bt_back.setEnabled(self.img_idx != 0)
            self.ref_bt_next.setEnabled(
                self.img_idx != len(self.screenshots) - 1)

        self.adjustSize()
        qt_utils.centralize(self)

    def _download_img(self, idx: int, url: str):
        self.logger.info('Downloading image [{}] from {}'.format(idx, url))
        res = self.http_client.get(url)

        if res:
            if not res.content:
                self.logger.warning('Image [{}] from {} has no content'.format(
                    idx, url))
                self.loaded_imgs.append(
                    self.i18n['screenshots.download.no_content'])
                self._load_img()
            else:
                self.logger.info(
                    'Image [{}] successfully downloaded'.format(idx))
                pixmap = QPixmap()
                pixmap.loadFromData(res.content)

                if pixmap.size().height() > self.MAX_HEIGHT or pixmap.size(
                ).width() > self.MAX_WIDTH:
                    pixmap = pixmap.scaled(self.MAX_WIDTH, self.MAX_HEIGHT,
                                           Qt.KeepAspectRatio,
                                           Qt.SmoothTransformation)

                self.loaded_imgs.append(pixmap)

                if self.img_idx == idx:
                    self._load_img()
        else:
            self.logger.info("Could not retrieve image [{}] from {}".format(
                idx, url))
            self.loaded_imgs.append(
                self.i18n['screenshots.download.no_response'])
            self._load_img()

    def back(self):
        self.img_idx -= 1
        self._load_img()

    def next(self):
        self.img_idx += 1
        self._load_img()
Example #44
0
    def __init__(self, pkg: PackageView, http_client: HttpClient,
                 icon_cache: MemoryCache, i18n: I18n,
                 screenshots: List[QPixmap], logger: logging.Logger):
        super(ScreenshotsDialog, self).__init__()
        self.setWindowTitle(str(pkg))
        self.screenshots = screenshots
        self.logger = logger
        self.loaded_imgs = []
        self.download_threads = []
        self.resize(1280, 720)
        self.i18n = i18n
        self.http_client = http_client
        self.progress_bar = QProgressBar()
        self.progress_bar.setMaximumHeight(10 if QApplication.instance().style(
        ).objectName().lower() == 'windows' else 6)
        self.progress_bar.setTextVisible(False)
        self.thread_progress = AnimateProgress()
        self.thread_progress.signal_change.connect(self._update_progress)
        self.thread_progress.start()

        # THERE ARE CRASHES WITH SOME RARE ICONS ( like insomnia ). IT CAN BE A QT BUG. IN THE MEANTIME, ONLY THE TYPE ICON WILL BE RENDERED
        #
        # icon_data = icon_cache.get(pkg.model.icon_url)
        #
        # if icon_data and icon_data.get('icon'):
        #     self.setWindowIcon(icon_data.get('icon'))
        # else:
        #     self.setWindowIcon(QIcon(pkg.model.get_type_icon_path()))
        self.setWindowIcon(QIcon(pkg.model.get_type_icon_path()))
        self.setLayout(QVBoxLayout())

        self.img = QLabel()
        self.layout().addWidget(self.img)

        self.bottom_bar = QToolBar()

        self.bt_back = QPushButton(
            ' < ' + self.i18n['screenshots.bt_back.label'].capitalize())
        self.bt_back.setCursor(QCursor(Qt.PointingHandCursor))
        self.bt_back.clicked.connect(self.back)
        self.ref_bt_back = self.bottom_bar.addWidget(self.bt_back)
        self.bottom_bar.addWidget(new_spacer(50))

        self.img_label = QLabel()
        self.img_label.setStyleSheet(
            'QLabel { font-weight: bold; text-align: center }')
        self.ref_img_label = self.bottom_bar.addWidget(self.img_label)
        self.ref_img_label.setVisible(False)
        self.ref_progress_bar = self.bottom_bar.addWidget(self.progress_bar)
        self.bottom_bar.addWidget(new_spacer(50))

        self.bt_next = QPushButton(
            self.i18n['screenshots.bt_next.label'].capitalize() + ' > ')
        self.bt_next.setCursor(QCursor(Qt.PointingHandCursor))
        self.bt_next.clicked.connect(self.next)
        self.ref_bt_next = self.bottom_bar.addWidget(self.bt_next)

        self.layout().addWidget(self.bottom_bar)

        self.img_idx = 0

        for idx, s in enumerate(self.screenshots):
            t = Thread(target=self._download_img, args=(idx, s), daemon=True)
            t.start()

        self._load_img()
Example #45
0
class Window(QMainWindow, Ui_MainWindow):
    state_change = pyqtSignal()

    def __init__(self):
        super(Window, self).__init__()
        self.final_clip = None
        self.audio_backend = None
        self.video_backend = None
        self.audio = None
        self.cutter_end = 0
        self.cutter_start = 0
        self.product = ''
        self.index = 0
        self.generator = None
        self.t = 0
        self.tt = None
        self.setupUi(self)
        self.pushButton.clicked.connect(self.openFile)
        # self.pushButton_3.clicked.connect(self.process)
        self.pushButton_3.setEnabled(False)
        self.pushButton_2.setEnabled(False)
        self.pushButton_2.setIcon(self.style().standardIcon(
            QStyle.SP_MediaPlay))
        self.pushButton_2.clicked.connect(self.play)
        self.pushButton_9.clicked.connect(self.tiktok)
        self.horizontalSlider.setRange(0, 0)
        # self.horizontalSlider.sliderMoved.connect(self.setPosition)
        self.progressBar = QProgressBar()
        self.progressBar.setVisible(False)
        self.progressBar.setSizePolicy(QSizePolicy.Expanding,
                                       QSizePolicy.Fixed)
        self.statusbar.addPermanentWidget(self.progressBar)
        self.widget = MyWidget()

        self.state_change.connect(self.fitState)
        self.widget.finish.connect(self.processfinish)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                           QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.widget.sizePolicy().hasHeightForWidth())
        self.widget.setSizePolicy(sizePolicy)

        self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)

        self.timer = QTimer()
        self.timer.setTimerType(Qt.PreciseTimer)
        self.timer.timeout.connect(self.widget.update)

        self.state = State.IDLE
        self.playObject = None
        self.playThread = None

    def tiktok(self):
        temp = time.time()
        self.video_backend = self.video_backend.fl_image(tiktok_effect)
        print("copy time: %f" % (time.time() - temp))

    def fitState(self):
        if self.state == State.PLAYING:
            self.pushButton_2.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))

        elif self.state in (State.PAUSE, State.IDLE, State.FINISHED):
            self.pushButton_2.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def processfinish(self):
        self.state = State.FINISHED
        self.t = 0
        self.state_change.emit()

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Open Video", QDir.homePath(),
            "Video(*.mp4;*.wmv;*.rmvb;*.avi)")

        if fileName != '':
            if self.video_backend is not None:
                self.video_backend.close()
            if self.audio_backend is not None:
                self.audio_backend.close()

            self.video_backend = VideoFileClip(fileName)
            # self.video_backend = clip.resize(width=clip.w//2,height=clip.h//2)

            self.audio_backend = self.video_backend.audio
            fps = self.video_backend.fps
            duration = self.video_backend.duration
            self.tt = np.arange(0, duration, 1.0 / fps)
            self.widget.drawFrame(0)
            if self.state != State.IDLE:
                self.audio.stop()
                self.timer.stop()
                self.t = 0
                self.state = State.IDLE
                self.state_change.emit()
            else:
                self.pushButton_2.setEnabled(True)
                self.pushButton_3.setEnabled(True)

    def play(self):
        if self.state in (State.IDLE, State.FINISHED):
            self.state = State.PLAYING
            self.state_change.emit()
            self.timer.start(1000 / self.video_backend.fps)
            if self.audio_backend is not None:
                blocksize = int(1.0 / self.video_backend.fps *
                                self.audio_backend.fps)
                self.audio = audio(self.audio_backend, self.audio_backend.fps,
                                   blocksize, 2)
                self.audio.start()

        elif self.state == State.PLAYING:
            self.state = State.PAUSE
            self.timer.stop()
            self.audio.pause()
            self.state_change.emit()
        elif self.state == State.PAUSE:
            self.audio.resume()
            self.timer.start(1000 / self.video_backend.fps)
            self.state = State.PLAYING
            self.state_change.emit()
Example #46
0
class window(QMainWindow):
    def __init__(self):
        super(window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle(' lesson 5 liao !')
        self.setWindowIcon(QIcon('icon-mongol.jpg'))

        extractAction = QAction(' Get to the choppa', self)
        extractAction.setShortcut('Ctrl+Q')
        extractAction.setStatusTip('leave the app')
        extractAction.triggered.connect(self.close_application)

        openEditor = QAction("&Editor", self)
        openEditor.setShortcut("Ctrl+E")
        openEditor.setStatusTip('Open Editor')
        openEditor.triggered.connect(self.editor)

        openFile = QAction("&Open File", self)
        openFile.setShortcut("Ctrl+O")
        openFile.setStatusTip('Open File')
        openFile.triggered.connect(self.file_open)

        self.statusBar()

        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('&File')
        fileMenu.addAction(extractAction)

        editorMenu = mainMenu.addMenu("&Editor")
        editorMenu.addAction(openEditor)
        fileMenu.addAction(openFile)

        self.home()

    def home(self):
        btn = QPushButton('quit', self)
        btn.clicked.connect(self.close_application)
        # btn.resize(btn.sizeHint()) # auto size for btn
        btn.resize(btn.minimumSizeHint())
        btn.move(0, 100)

        extractAction = QAction(QIcon('icon-smoker.jpg'), 'Flee the scene',
                                self)
        extractAction.triggered.connect(self.close_application)
        self.toolBar = self.addToolBar('Extraction')
        self.toolBar.addAction(extractAction)

        bsAction = QAction(QIcon('icon-me.jpg'), 'bullshit time', self)
        bsAction.triggered.connect(self.bullshit)
        self.toolBar.addAction(bsAction)

        fontChoice = QAction('font', self)
        fontChoice.triggered.connect(self.font_choice)
        self.toolBar.addAction(fontChoice)

        color = QColor(0, 0, 0)
        fontColor = QAction('Font bg Color', self)
        fontColor.triggered.connect(self.color_picker)
        self.toolBar.addAction(fontColor)

        cal = QCalendarWidget(self)
        cal.move(500, 200)
        cal.resize(200, 200)

        checkBox = QCheckBox('window size', self)
        checkBox.move(300, 25)
        # checkBox.toggle()
        checkBox.stateChanged.connect(self.enlargeWindow)

        self.progress = QProgressBar(self)
        self.progress.setGeometry(200, 80, 250, 20)

        self.btn = QPushButton('download', self)
        self.btn.move(200, 120)
        self.btn.clicked.connect(self.download)

        # print(self.style().objectName())
        self.styleChoice = QLabel('Windows', self)

        comboBox = QComboBox(self)
        # comboBox.addItem('motif')
        # comboBox.addItem('Windows')
        # comboBox.addItem('cde')
        # comboBox.addItem('Plastique')
        # comboBox.addItem('Cleanlooks')
        # comboBox.addItem('windowsvista')
        comboBox.addItems(QStyleFactory.keys())

        comboBox.move(25, 250)
        self.styleChoice.move(50, 150)
        comboBox.activated[str].connect(self.style_choice)

        self.show()

    def color_picker(self):
        color = QColorDialog.getColor()
        self.styleChoice.setStyleSheet("QWidget {background-color: %s}" %
                                       color.name())

    def file_open(self):
        '''need to make name an tupple otherwise i had an error and app crashed'''
        name, _ = QFileDialog.getOpenFileName(
            self, 'Open File', options=QFileDialog.DontUseNativeDialog)
        print('name', name, '2nd thing', _)
        file = open(name, 'r')

        self.editor()
        with file:
            text = file.read()
            self.textEdit.setText(text)

    def editor(self):
        self.textEdit = QTextEdit()
        self.setCentralWidget(self.textEdit)  # take up all the space

    def font_choice(self):
        font, valid = QFontDialog.getFont()
        if valid:
            self.styleChoice.setFont(font)

    def style_choice(self, text):
        self.styleChoice.setText(text)
        self.styleChoice.resize(
            self.styleChoice.sizeHint())  # change font size on render
        QApplication.setStyle(QStyleFactory.create(text))

    def download(self):
        self.completed = 0
        while self.completed < 100:
            self.completed += 0.0001
            self.progress.setValue(self.completed)

    def close_application(self):
        # print('whoooo sooo custooom')
        choice = QMessageBox.question(self, 'Extract', "Get into the choppa?",
                                      QMessageBox.Yes | QMessageBox.No)

        if choice == QMessageBox.Yes:
            print('Extracting Naaaoooowww!')
            sys.exit()
        else:
            pass

    # def closeEvent(self, event):	# actually works in pyqt5 too
    # event.ignore()
    # self.close_application()

    def closeEvent(self, QCloseEvent):
        '''for closing the window from the corner "x" '''
        QCloseEvent.ignore()
        self.close_application()

    def bullshit(self):
        print('I am the greatest!!!')

    def enlargeWindow(self, state):
        if state == Qt.Checked:
            self.setGeometry(50, 50, 1000, 600)
        else:
            self.setGeometry(50, 50, 500, 300)
Example #47
0
    def setupStatusBar(self, iface, previewEnabled=True):
        w = QProgressBar(self.ui.statusbar)
        w.setObjectName("progressBar")
        w.setMaximumWidth(250)
        w.setAlignment(Qt.AlignCenter)
        w.setVisible(False)
        self.ui.statusbar.addPermanentWidget(w)
        self.ui.progressBar = w

        w = QCheckBox(self.ui.statusbar)
        w.setObjectName("checkBoxPreview")
        w.setText("Preview")  # _translate("Q3DWindow", "Preview"))
        w.setChecked(previewEnabled)
        self.ui.statusbar.addPermanentWidget(w)
        self.ui.checkBoxPreview = w
        self.ui.checkBoxPreview.toggled.connect(iface.previewStateChanged)
Example #48
0
    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.vocalMax = 60
        self.vocalMin = 50

        self.move(100, 100)
        self.songfile = '../data/13_LeadVox.wav'
        self.m = PlotCanvas(self,
                            width=5,
                            height=4,
                            songfile=self.songfile,
                            vocalRange=[self.vocalMin, self.vocalMax])
        self.m.move(0, 70)

        self.addToolBar(NavigationToolbar(self.m, self))

        button = QPushButton('Change Plot', self)
        button.setToolTip('This s an example button')
        button.clicked.connect(self.m.plot)
        button.move(500, 20)
        button.resize(140, 20)

        button = QPushButton('Input', self)
        button.setToolTip('This s an example button')
        button.clicked.connect(self.getInteger)
        button.move(500, 40)
        button.resize(140, 20)

        button = QPushButton('Open File', self)
        button.setToolTip('This s an example button')
        button.clicked.connect(self.getSongName)
        button.move(500, 60)
        button.resize(140, 20)

        self.label = QLabel(self)
        self.label.move(500, 80)
        self.label.resize(140, 40)
        self.label.show()

        self.songNameLabel = QLabel(self)
        newfont = QFont("Times", 12, QFont.Normal)
        self.songNameLabel.setFont(newfont)
        self.songNameLabel.move(10, 35)
        self.songNameLabel.resize(500, 40)
        self.songNameLabel.setWordWrap(True)
        self.songNameLabel.setAlignment(Qt.AlignTop)
        self.songNameLabel.show()

        self.songScoreLabel = QLabel(self)
        newfont = QFont("Times", 16, QFont.Bold)
        self.songScoreLabel.setFont(newfont)
        self.songScoreLabel.move(500, 130)
        self.songScoreLabel.resize(140, 30)
        self.songScoreLabel.show()

        self.progressBar = QProgressBar(self)
        self.progressBar.setRange(0, 1)
        self.progressBar.move(self.width - 140, self.height - 20)
        self.progressBar.resize(140, 20)
        self.progressBar.show()

        self.show()
        self.updateLabel()
Example #49
0
class MainWindow(QWidget):

    progress_signal = pyqtSignal(object)
    complete_signal = pyqtSignal(object)
    error_signal = pyqtSignal(object)

    def __init__(self):
        super().__init__()

        self.dev = None

        self.progress_signal.connect(self._on_progress)
        self.complete_signal.connect(self._on_complete)
        self.error_signal.connect(self._on_error)

        lbl_warning = QLabel(
            "<font color='red'><b>Make sure jumploader is installed before you flash QMK</b></font>"
        )
        lbl_warning.setWordWrap(True)

        btn_flash_qmk = QPushButton("Flash QMK...")
        btn_flash_qmk.clicked.connect(self.on_click_flash_qmk)

        lbl_help = QLabel(
            "After jumploader is installed, hold Backspace while plugging in the keyboard to start in bootloader mode."
        )
        lbl_help.setWordWrap(True)

        btn_reboot_bl = QPushButton("Reboot to Bootloader")
        btn_reboot_bl.clicked.connect(self.on_click_reboot)
        btn_flash_jumploader = QPushButton("Flash Jumploader")
        btn_flash_jumploader.clicked.connect(self.on_click_flash_jumploader)
        btn_restore_stock = QPushButton("Revert to Stock Firmware")
        btn_restore_stock.clicked.connect(self.on_click_revert)

        self.progress = QProgressBar()
        self.progress.setRange(0, 100)
        self.progress_label = QLabel("Ready")

        self.combobox_devices = QComboBox()
        btn_refresh_devices = QToolButton()
        btn_refresh_devices.setToolButtonStyle(Qt.ToolButtonTextOnly)
        btn_refresh_devices.setText("Refresh")
        btn_refresh_devices.clicked.connect(self.on_click_refresh)

        devices_layout = QHBoxLayout()
        devices_layout.addWidget(self.combobox_devices)
        devices_layout.addWidget(btn_refresh_devices)

        layout_qmk = QVBoxLayout()
        layout_qmk.setAlignment(Qt.AlignTop)
        layout_qmk.addWidget(lbl_warning)
        layout_qmk.addWidget(btn_flash_qmk)
        layout_qmk.addWidget(lbl_help)

        layout_stock = QVBoxLayout()
        layout_stock.setAlignment(Qt.AlignTop)
        layout_stock.addWidget(btn_reboot_bl)
        layout_stock.addWidget(btn_flash_jumploader)
        layout_stock.addWidget(btn_restore_stock)

        layout_progress = QVBoxLayout()
        layout_progress.addWidget(self.progress_label)
        layout_progress.addWidget(self.progress)

        group_qmk = QGroupBox("QMK")
        group_qmk.setLayout(layout_qmk)

        group_stock = QGroupBox("Stock")
        group_stock.setLayout(layout_stock)

        group_progress = QGroupBox("")
        group_progress.setLayout(layout_progress)

        group_layout = QHBoxLayout()
        group_layout.addWidget(group_qmk)
        group_layout.addWidget(group_stock)

        layout = QVBoxLayout()
        layout.addLayout(devices_layout, stretch=0)
        layout.addLayout(group_layout, stretch=1)
        layout.addWidget(group_progress, stretch=0)
        self.setLayout(layout)

        self.lockable = [
            btn_flash_qmk, btn_reboot_bl, btn_flash_jumploader,
            btn_restore_stock, self.combobox_devices, btn_refresh_devices
        ]

        self.on_click_refresh()

    def lock_user(self):
        for obj in self.lockable:
            obj.setEnabled(False)

    def unlock_user(self):
        self.close_dev()
        for obj in self.lockable:
            obj.setEnabled(True)

    def close_dev(self):
        if self.dev is not None:
            self.dev.close()
            self.dev = None

    def _on_progress(self, args):
        msg, progress = args
        progress = int(progress * 100)
        self.progress.setValue(progress)
        self.progress_label.setText(msg)

    def _on_complete(self, args):
        self.progress.setValue(100)
        self.progress_label.setText("Finished")
        self.on_click_refresh()
        self.unlock_user()

    def _on_error(self, msg):
        self.progress_label.setText("Failed")
        QMessageBox.critical(window, "Error", msg)
        self.unlock_user()

    def on_progress(self, msg, progress):
        self.progress_signal.emit([msg, progress])

    def on_complete(self):
        self.complete_signal.emit(None)

    def on_error(self, msg):
        self.error_signal.emit(msg)

    def on_click_refresh(self):
        self.devices = []
        self.combobox_devices.clear()

        for dev in hid.enumerate():
            vid, pid = dev["vendor_id"], dev["product_id"]
            if (vid, pid) in DEVICE_DESC:
                self.combobox_devices.addItem(
                    "{} [{:04X}:{:04X}:{:02X}:{:02X}]".format(
                        DEVICE_DESC[(vid, pid)], vid, pid,
                        dev["interface_number"], dev["usage"]))
                self.devices.append(dev)

    def get_active_device(self):
        idx = self.combobox_devices.currentIndex()
        if idx == -1:
            self._on_error("No device selected")
            return None

        try:
            dev = hid.device()
            dev.open_path(self.devices[idx]["path"])
            return dev
        except OSError:
            self._on_error(
                "Failed to open the device. You might not have sufficient permissions."
            )
            return None

    def sanity_check_qmk_firmware(self, firmware):
        # check the size so we don't trash bootloader
        # (ok, we wouldn't overwrite it anyway as it's checked again in cmd_flash)
        if len(firmware) > QMK_MAX_FIRMWARE:
            self._on_error(
                "Firmware is too large: 0x{:X} max allowed is 0x{:X}".format(
                    len(firmware), QMK_MAX_FIRMWARE))
            return False
        if len(firmware) < 0x100:
            self._on_error("Firmware is too small")
            return False
        firmware_valid = True
        # check stack pointer is valid and that first 3 vectors have bit0 set
        sp, *vecs = struct.unpack("<IIII", firmware[0:16])
        if sp < 0x20000000 or sp > 0x20000800 or vecs[0] & 1 != 1 or vecs[
                1] & 1 != 1 or vecs[2] & 1 != 1:
            self._on_error("Firmware appears to be corrupted")
            return False
        return True

    def on_click_flash_qmk(self):
        self.dev = self.get_active_device()
        if not self.dev:
            return

        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        filename = QFileDialog.getOpenFileName(None,
                                               "Select firmware to flash",
                                               "",
                                               "Firmware Files (*.bin)",
                                               options=options)[0]
        if not filename:
            self.close_dev()
            return

        with open(filename, "rb") as inf:
            firmware = inf.read()

        if not self.sanity_check_qmk_firmware(firmware):
            self.close_dev()
            return

        self.lock_user()
        threading.Thread(target=lambda: cmd_flash(
            self.dev, QMK_OFFSET, firmware, self.on_progress, self.on_complete,
            self.on_error)).start()

    def on_click_reboot(self):
        self.dev = self.get_active_device()
        if not self.dev:
            return

        self.lock_user()
        threading.Thread(
            target=lambda: cmd_reboot(self.dev, self.on_progress, self.
                                      on_complete, self.on_error)).start()

    def dangerous_flash(self, path):
        reply = QMessageBox.question(
            self, "Warning",
            "This is a potentially dangerous operation, are you sure you want to continue?",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if reply != QMessageBox.Yes:
            return

        self.dev = self.get_active_device()
        if not self.dev:
            return

        with open(path, "rb") as inf:
            firmware = inf.read()

        self.lock_user()
        threading.Thread(
            target=lambda: cmd_flash(self.dev, 0, firmware, self.on_progress,
                                     self.on_complete, self.on_error)).start()

    def on_click_revert(self):
        self.dangerous_flash(appctxt.get_resource("stock-firmware.bin"))

    def on_click_flash_jumploader(self):
        self.dangerous_flash(appctxt.get_resource("jumploader.bin"))
Example #50
0
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.left = 10
        self.top = 10
        self.title = 'MIR Final Demo'
        self.width = 640
        self.height = 450
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.vocalMax = 60
        self.vocalMin = 50

        self.move(100, 100)
        self.songfile = '../data/13_LeadVox.wav'
        self.m = PlotCanvas(self,
                            width=5,
                            height=4,
                            songfile=self.songfile,
                            vocalRange=[self.vocalMin, self.vocalMax])
        self.m.move(0, 70)

        self.addToolBar(NavigationToolbar(self.m, self))

        button = QPushButton('Change Plot', self)
        button.setToolTip('This s an example button')
        button.clicked.connect(self.m.plot)
        button.move(500, 20)
        button.resize(140, 20)

        button = QPushButton('Input', self)
        button.setToolTip('This s an example button')
        button.clicked.connect(self.getInteger)
        button.move(500, 40)
        button.resize(140, 20)

        button = QPushButton('Open File', self)
        button.setToolTip('This s an example button')
        button.clicked.connect(self.getSongName)
        button.move(500, 60)
        button.resize(140, 20)

        self.label = QLabel(self)
        self.label.move(500, 80)
        self.label.resize(140, 40)
        self.label.show()

        self.songNameLabel = QLabel(self)
        newfont = QFont("Times", 12, QFont.Normal)
        self.songNameLabel.setFont(newfont)
        self.songNameLabel.move(10, 35)
        self.songNameLabel.resize(500, 40)
        self.songNameLabel.setWordWrap(True)
        self.songNameLabel.setAlignment(Qt.AlignTop)
        self.songNameLabel.show()

        self.songScoreLabel = QLabel(self)
        newfont = QFont("Times", 16, QFont.Bold)
        self.songScoreLabel.setFont(newfont)
        self.songScoreLabel.move(500, 130)
        self.songScoreLabel.resize(140, 30)
        self.songScoreLabel.show()

        self.progressBar = QProgressBar(self)
        self.progressBar.setRange(0, 1)
        self.progressBar.move(self.width - 140, self.height - 20)
        self.progressBar.resize(140, 20)
        self.progressBar.show()

        self.show()
        self.updateLabel()

    def getVocalValue(self):
        return self.vocalMin, self.vocalMax

    def getInteger(self):
        dialog = Dialog(parent=self)
        if dialog.exec_():
            #todo
            self.vocalMax, self.vocalMin = dialog.value()
            self.updateLabel()
            self.m.computeSongFeatureScore(self.vocalMin, self.vocalMax)
            self.m.plot()
        dialog.destroy()

    def getSongName(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(
            self,
            "QFileDialog.getOpenFileName()",
            "",
            "All Files (*);;Wave Files (*.wave)",
            options=options)
        oldSongFile = self.songfile
        if fileName:
            self.songfile = fileName
            print('load new song:', fileName)

            self.updateLoadingLabel()
            ok = self.m.loadSong(self.songfile)
            #task = loadSongTaskThread()
            if ok:
                self.m.computeSongFeatureScore(self.vocalMin, self.vocalMax)
                self.updateLabel()
                self.m.plot()
            else:
                self.songfile = oldSongFile
                self.updateLabel()
        else:
            QMessageBox.critical(self, 'File name error', u'沒有此檔案或檔名錯誤!',
                                 QMessageBox.Ok, QMessageBox.Ok)
            self.songfile = oldSongfile
            return False

    def updateLabel(self):
        self.label.setText("Vocal Range: \nmin:{min}, max:{max}".format(
            min=self.vocalMin, max=self.vocalMax))
        self.songNameLabel.setText("Song: \n{}".format(self.songfile))
        self.songScoreLabel.setText(
            "Score: {s:2.2f}".format(s=self.m.data[-1]))

    def updateLoadingLabel(self):
        print('update loading label')
        self.songNameLabel.setText("Loading Song: \n{}".format(self.songfile))

    def updateProgressBar(self, text, value):
        self.progress_bar.setValue(value)
Example #51
0
class WidgetGallery(QDialog):
    def __init__(self, parent=None):
        super(WidgetGallery, self).__init__(parent)

        self.originalPalette = QApplication.palette()

        styleComboBox = QComboBox()
        styleComboBox.addItems(QStyleFactory.keys())

        styleLabel = QLabel("&Style:")
        styleLabel.setBuddy(styleComboBox)

        self.useStylePaletteCheckBox = QCheckBox("&Use style's standard palette")
        self.useStylePaletteCheckBox.setChecked(True)

        disableWidgetsCheckBox = QCheckBox("&Disable widgets")

        self.createTopLeftGroupBox()
        self.createTopRightGroupBox()
        self.createBottomLeftTabWidget()
        self.createBottomRightGroupBox()
        self.createProgressBar()

        styleComboBox.activated[str].connect(self.changeStyle)
        self.useStylePaletteCheckBox.toggled.connect(self.changePalette)
        disableWidgetsCheckBox.toggled.connect(self.topLeftGroupBox.setDisabled)
        disableWidgetsCheckBox.toggled.connect(self.topRightGroupBox.setDisabled)
        disableWidgetsCheckBox.toggled.connect(self.bottomLeftTabWidget.setDisabled)
        disableWidgetsCheckBox.toggled.connect(self.bottomRightGroupBox.setDisabled)

        topLayout = QHBoxLayout()
        topLayout.addWidget(styleLabel)
        topLayout.addWidget(styleComboBox)
        topLayout.addStretch(1)
        topLayout.addWidget(self.useStylePaletteCheckBox)
        topLayout.addWidget(disableWidgetsCheckBox)

        mainLayout = QGridLayout()
        mainLayout.addLayout(topLayout, 0, 0, 1, 2)
        mainLayout.addWidget(self.topLeftGroupBox, 1, 0)
        mainLayout.addWidget(self.topRightGroupBox, 1, 1)
        mainLayout.addWidget(self.bottomLeftTabWidget, 2, 0)
        mainLayout.addWidget(self.bottomRightGroupBox, 2, 1)
        mainLayout.addWidget(self.progressBar, 3, 0, 1, 2)
        mainLayout.setRowStretch(1, 1)
        mainLayout.setRowStretch(2, 1)
        mainLayout.setColumnStretch(0, 1)
        mainLayout.setColumnStretch(1, 1)
        self.setLayout(mainLayout)

        self.setWindowTitle("Styles")
        self.changeStyle('Windows')

    def changeStyle(self, styleName):
        QApplication.setStyle(QStyleFactory.create(styleName))
        self.changePalette()

    def changePalette(self):
        if self.useStylePaletteCheckBox.isChecked():
            QApplication.setPalette(QApplication.style().standardPalette())
        else:
            QApplication.setPalette(self.originalPalette)

    def advanceProgressBar(self):
        curVal = self.progressBar.value()
        maxVal = self.progressBar.maximum()
        self.progressBar.setValue(curVal + (maxVal - curVal) / 100)

    def createTopLeftGroupBox(self):
        self.topLeftGroupBox = QGroupBox("Group 1")

        radioButton1 = QRadioButton("Radio button 1")
        radioButton2 = QRadioButton("Radio button 2")
        radioButton3 = QRadioButton("Radio button 3")
        radioButton1.setChecked(True)

        checkBox = QCheckBox("Tri-state check box")
        checkBox.setTristate(True)
        checkBox.setCheckState(Qt.PartiallyChecked)

        layout = QVBoxLayout()
        layout.addWidget(radioButton1)
        layout.addWidget(radioButton2)
        layout.addWidget(radioButton3)
        layout.addWidget(checkBox)
        layout.addStretch(1)
        self.topLeftGroupBox.setLayout(layout)

    def createTopRightGroupBox(self):
        self.topRightGroupBox = QGroupBox("Group 2")

        defaultPushButton = QPushButton("Default Push Button")
        defaultPushButton.setDefault(True)

        togglePushButton = QPushButton("Toggle Push Button")
        togglePushButton.setCheckable(True)
        togglePushButton.setChecked(True)

        flatPushButton = QPushButton("Flat Push Button")
        flatPushButton.setFlat(True)

        layout = QVBoxLayout()
        layout.addWidget(defaultPushButton)
        layout.addWidget(togglePushButton)
        layout.addWidget(flatPushButton)
        layout.addStretch(1)
        self.topRightGroupBox.setLayout(layout)

    def createBottomLeftTabWidget(self):
        self.bottomLeftTabWidget = QTabWidget()
        self.bottomLeftTabWidget.setSizePolicy(QSizePolicy.Preferred,
                QSizePolicy.Ignored)

        tab1 = QWidget()
        tableWidget = QTableWidget(10, 10)

        tab1hbox = QHBoxLayout()
        tab1hbox.setContentsMargins(5, 5, 5, 5)
        tab1hbox.addWidget(tableWidget)
        tab1.setLayout(tab1hbox)

        tab2 = QWidget()
        textEdit = QTextEdit()

        textEdit.setPlainText("Twinkle, twinkle, little star,\n"
                              "How I wonder what you are.\n" 
                              "Up above the world so high,\n"
                              "Like a diamond in the sky.\n"
                              "Twinkle, twinkle, little star,\n" 
                              "How I wonder what you are!\n")

        tab2hbox = QHBoxLayout()
        tab2hbox.setContentsMargins(5, 5, 5, 5)
        tab2hbox.addWidget(textEdit)
        tab2.setLayout(tab2hbox)

        self.bottomLeftTabWidget.addTab(tab1, "&Table")
        self.bottomLeftTabWidget.addTab(tab2, "Text &Edit")

    def createBottomRightGroupBox(self):
        self.bottomRightGroupBox = QGroupBox("Group 3")
        self.bottomRightGroupBox.setCheckable(True)
        self.bottomRightGroupBox.setChecked(True)

        lineEdit = QLineEdit('s3cRe7')
        lineEdit.setEchoMode(QLineEdit.Password)

        spinBox = QSpinBox(self.bottomRightGroupBox)
        spinBox.setValue(50)

        dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox)
        dateTimeEdit.setDateTime(QDateTime.currentDateTime())

        slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox)
        slider.setValue(40)

        scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox)
        scrollBar.setValue(60)

        dial = QDial(self.bottomRightGroupBox)
        dial.setValue(30)
        dial.setNotchesVisible(True)

        layout = QGridLayout()
        layout.addWidget(lineEdit, 0, 0, 1, 2)
        layout.addWidget(spinBox, 1, 0, 1, 2)
        layout.addWidget(dateTimeEdit, 2, 0, 1, 2)
        layout.addWidget(slider, 3, 0)
        layout.addWidget(scrollBar, 4, 0)
        layout.addWidget(dial, 3, 1, 2, 1)
        layout.setRowStretch(5, 1)
        self.bottomRightGroupBox.setLayout(layout)

    def createProgressBar(self):
        self.progressBar = QProgressBar()
        self.progressBar.setRange(0, 10000)
        self.progressBar.setValue(0)

        timer = QTimer(self)
        timer.timeout.connect(self.advanceProgressBar)
        timer.start(1000)
Example #52
0
class VideoWidget(QWidget):  #QDock
    Widgets = []

    # Passthrough click events
    mouse_down = pyqtSignal(tuple)
    mouse_move = pyqtSignal(tuple)
    mouse_up = pyqtSignal(tuple)
    mouse_over = pyqtSignal(Video)
    mouse_leave = pyqtSignal(Video)
    scroll_event = pyqtSignal(Video, int, float, float)

    def __init__(self, name="Video", path=None, toolbar=None):
        super().__init__()
        # self.setFloating(False)
        # self.setFeatures(QDockWidget.DockWidgetMovable)
        # self.setAllowedAreas(Qt.AllDockWidgetAreas)

        # Structure
        self.setLayout(QVBoxLayout())
        self.setObjectName("VideoWidget")

        # Close button
        self.closeButton = QPushButton()
        self.closeButton.setText("X")
        self.closeButton.setEnabled(True)
        self.closeButton.clicked.connect(self.deleteLater)
        self.layout().addWidget(self.closeButton)

        # Video
        self.videoContainer = QWidget()
        self.videoContainer.setLayout(QStackedLayout())
        self.video = Video(None, video=path)
        self.videoContainer.layout().addWidget(self.video)
        self.layout().addWidget(self.videoContainer)

        self.video.stateChanged.connect(self.__onPlayerStateChange)
        # self.video.setFixedWidth(640)

        # Buttons
        self.buttonRow = QWidget()
        self.buttonRowLayout = QHBoxLayout()
        self.buttonRow.setLayout(self.buttonRowLayout)
        self.layout().addWidget(self.buttonRow)
        # Play
        self.playButton = QPushButton()
        self.playButton.setText("Play")
        self.playButton.setEnabled(False)
        self.playButton.clicked.connect(self.play)
        self.buttonRowLayout.addWidget(self.playButton)
        # Progress Bar
        self.progressSlider = QSlider(Qt.Horizontal)
        self.progressSlider.setRange(0, int(self.video.number_of_frames - 1))
        self.progressSlider.sliderMoved.connect(
            self.setPosition)  # set position when user moves slider
        self.progressSlider.sliderPressed.connect(
            self.video.pause)  # pause when user presses slider
        self.video.positionChanged.connect(
            self.progressSlider.setValue)  # update the slider as video plays
        self.buttonRowLayout.addWidget(self.progressSlider)

        # Passthrough click events
        self.video.mouse_down.connect(self.mouse_down.emit)
        self.video.mouse_move.connect(self.mouse_move.emit)
        self.video.mouse_up.connect(self.mouse_up.emit)
        self.video.mouse_over.connect(
            lambda data: self.mouse_over.emit(data[1]))
        self.video.mouse_leave.connect(
            lambda data: self.mouse_leave.emit(data[1]))
        self.video.scroll_event.connect(
            lambda val, x, y: self.scroll_event.emit(self.video, val, x, y))

        # Register with Toolbar
        toolbar.register_video(self)
        VideoWidget.Widgets.append(self)
        self.destroyed.connect(lambda: VideoWidget.Widgets.remove(self)
                               )  # TODO: check if this works

    @property
    def display_resolution(self):
        return (self.video.size().width(), self.video.size().height())

    @property
    def video_resolution(self):
        return self.video.resolution

    def pause(self):
        self.video.pause()

    def play(self):
        ''' plays or pauses video '''
        if self.video.playing:
            self.video.pause()
        else:
            self.video.play()

    def __onPlayerStateChange(self, state):
        ''' changes the play/pause button depending on state '''
        if state:
            self.playButton.setText("Pause")
        else:
            self.playButton.setText("Play")

    def setPosition(self, pos):
        ''' Sets the current playback position of the video '''
        self.video.setPosition(pos)

    def reblit(self):
        self.video.reblit()

    def export(self, filename):
        # QThread.thread()
        # threading.Thread(target=self.video.export, args=(filename, ))
        self.__export_progress_bar = QProgressBar()
        self.layout().addWidget(self.__export_progress_bar)
        self.__export_progress_bar.setGeometry(200, 80, 250, 20)
        self.video.export(filename, self.__export_progress_bar)

    # def __onVideoDurationChange(self, duration):
    #     self.progressSlider.setRange(0, duration)

    def deleteLater(self) -> None:
        print("Deleting")
        self.video.deleteLater()
        print("Deleted Video")
        return super().deleteLater()
Example #53
0
class TabGovernance_gui(QWidget):
    def __init__(self, caller, *args, **kwargs):
        QWidget.__init__(self)
        self.caller = caller
        self.initLayout()
        self.loadIcons()
        self.refreshProposals_btn.setIcon(self.refresh_icon)
        self.budgetProjection_btn.setIcon(self.list_icon)
        self.timeIconLabel.setPixmap(
            self.time_icon.scaledToHeight(20, Qt.SmoothTransformation))
        self.questionLabel.setPixmap(
            self.question_icon.scaledToHeight(15, Qt.SmoothTransformation))
        self.loadCacheData()

    def initLayout(self):
        layout = QVBoxLayout(self)

        ## -- ROW 1
        row = QHBoxLayout()
        self.budgetProjection_btn = QPushButton()
        self.budgetProjection_btn.setToolTip("Check Budget Projection...")
        row.addWidget(self.budgetProjection_btn)
        self.selectMN_btn = QPushButton("Select Masternodes...")
        row.addWidget(self.selectMN_btn)
        self.selectedMNlabel = QLabel(
            "<em>0 masternodes selected for voting</em")
        row.addWidget(self.selectedMNlabel)
        row.addStretch(1)
        self.statusLabel = QLabel("")
        self.statusLabel.setMinimumWidth(116)
        self.resetStatusLabel('<b style="color:red">Reload Proposals</b>')
        row.addWidget(self.statusLabel)
        row.addStretch(1)
        self.mnCountLabel = QLabel()
        row.addWidget(self.mnCountLabel)
        self.refreshProposals_btn = QPushButton()
        self.refreshProposals_btn.setToolTip("Refresh Proposal List")
        row.addWidget(self.refreshProposals_btn)
        self.toggleExpiring_btn = QPushButton("Hide Expiring")
        self.toggleExpiring_btn.setToolTip(
            "Hide expiring proposals (yellow background) from list")
        row.addWidget(self.toggleExpiring_btn)
        layout.addLayout(row)

        ## -- ROW 2
        self.proposalBox = QTableWidget()
        self.proposalBox.setMinimumHeight(280)
        self.proposalBox.setSelectionMode(QAbstractItemView.MultiSelection)
        self.proposalBox.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.proposalBox.setShowGrid(True)
        self.proposalBox.setColumnCount(8)
        self.proposalBox.setRowCount(0)
        self.proposalBox.horizontalHeader().setSectionResizeMode(
            0, QHeaderView.Stretch)
        self.proposalBox.setSortingEnabled(True)
        #self.proposalBox.verticalHeader().hide
        self.setProposalBoxHeader()
        self.proposalBox.setColumnWidth(1, 50)
        self.proposalBox.setColumnWidth(2, 50)
        self.proposalBox.setColumnWidth(3, 100)
        self.proposalBox.setColumnWidth(4, 100)
        self.proposalBox.setColumnWidth(5, 150)
        self.proposalBox.setColumnWidth(6, 120)
        self.proposalBox.setColumnWidth(7, 50)
        layout.addWidget(self.proposalBox)

        ## -- ROW 3
        row = QHBoxLayout()
        self.timeIconLabel = QLabel()
        self.timeIconLabel.setToolTip(
            "Check to add a randomized time offset (positive or negative) to enhance privacy"
        )
        row.addWidget(self.timeIconLabel)
        self.randomDelayCheck = QCheckBox()
        self.randomDelayCheck.setToolTip(
            "Check to add a randomized time offset when voting (max +5/-5 hrs)"
        )
        row.addWidget(self.randomDelayCheck)
        self.randomDelayNeg_edt = QSpinBox()
        self.randomDelayNeg_edt.setPrefix('- ')
        self.randomDelayNeg_edt.setSuffix(" secs")
        self.randomDelayNeg_edt.setToolTip(
            "Maximum random time (in seconds) subtracted from each vote timestamp"
        )
        self.randomDelayNeg_edt.setFixedWidth(100)
        self.randomDelayNeg_edt.setMaximum(18000)
        self.randomDelayNeg_edt.setValue(0)
        row.addWidget(self.randomDelayNeg_edt)
        self.randomDelayPos_edt = QSpinBox()
        self.randomDelayPos_edt.setPrefix("+ ")
        self.randomDelayPos_edt.setSuffix(" secs")
        self.randomDelayPos_edt.setToolTip(
            "Maximum random time (in seconds) added to each vote timestamp")
        self.randomDelayPos_edt.setFixedWidth(100)
        self.randomDelayPos_edt.setMaximum(18000)
        self.randomDelayPos_edt.setValue(300)
        row.addWidget(self.randomDelayPos_edt)
        row.addStretch(1)
        self.loadingLine = QLabel(
            "<b style='color:red'>Vote Signatures.</b> Completed: ")
        self.loadingLinePercent = QProgressBar()
        self.loadingLinePercent.setMaximumWidth(200)
        self.loadingLinePercent.setMaximumHeight(10)
        self.loadingLinePercent.setRange(0, 100)
        row.addWidget(self.loadingLine)
        row.addWidget(self.loadingLinePercent)
        self.loadingLine.hide()
        self.loadingLinePercent.hide()
        row.addStretch(1)
        self.selectedPropLabel = QLabel("<em>0 proposals selected</em>")
        row.addWidget(self.selectedPropLabel)
        self.questionLabel = QLabel()
        message = "Refresh proposals.\n"
        message += "GREEN: proposal passing\n"
        message += "WHITE: missing votes in order to pass\n"
        message += "RED: proposal not passing\n"
        message += "YELLOW: proposal expiring (last payment block)\n"
        self.questionLabel.setToolTip(message)
        row.addWidget(self.questionLabel)
        layout.addLayout(row)

        ## -- ROW 4
        row = QHBoxLayout()
        self.voteYes_btn = QPushButton("Vote YES")
        self.voteYes_btn.setToolTip("Vote YES on selected proposals")
        row.addWidget(self.voteYes_btn)
        self.voteAbstain_btn = QPushButton("Vote ABSTAIN")
        self.voteAbstain_btn.setToolTip(
            "Vote ABSTAIN on selected proposals [currently disabled]")
        row.addWidget(self.voteAbstain_btn)
        self.voteNo_btn = QPushButton("Vote NO")
        self.voteNo_btn.setToolTip("Vote NO on selected proposals")
        row.addWidget(self.voteNo_btn)
        layout.addLayout(row)

    def loadCacheData(self):
        if self.caller.parent.cache.get("votingDelayCheck"):
            negative_delay = self.caller.parent.cache.get("votingDelayNeg")
            positive_delay = self.caller.parent.cache.get("votingDelayPos")
            self.randomDelayCheck.setChecked(True)
            self.randomDelayNeg_edt.setValue(negative_delay)
            self.randomDelayPos_edt.setValue(positive_delay)

    def setProposalBoxHeader(self):
        item = QTableWidgetItem()
        item.setTextAlignment(Qt.AlignCenter)
        item.setText("Name")
        item.setToolTip("Proposal Name")
        self.proposalBox.setHorizontalHeaderItem(0, item)

        item = QTableWidgetItem()
        item.setTextAlignment(Qt.AlignCenter)
        item.setText("Hash")
        item.setToolTip("Proposal Hash")
        self.proposalBox.setHorizontalHeaderItem(1, item)

        item = QTableWidgetItem()
        item.setTextAlignment(Qt.AlignCenter)
        item.setText("Link")
        item.setToolTip("Link to Proposal Thread")
        self.proposalBox.setHorizontalHeaderItem(2, item)

        item = QTableWidgetItem()
        item.setTextAlignment(Qt.AlignCenter)
        item.setText("PIV/month")
        item.setToolTip("Monthly PIV Payment requested")
        self.proposalBox.setHorizontalHeaderItem(3, item)

        item = QTableWidgetItem()
        item.setTextAlignment(Qt.AlignCenter)
        item.setText("Payments")
        item.setToolTip("Remaining Payment Count / Total Payment Count")
        self.proposalBox.setHorizontalHeaderItem(4, item)

        item = QTableWidgetItem()
        item.setTextAlignment(Qt.AlignCenter)
        item.setText("Network Votes")
        item.setToolTip("Network Votes: YEAS/ABSTAINS/NAYS")
        self.proposalBox.setHorizontalHeaderItem(5, item)

        item = QTableWidgetItem()
        item.setTextAlignment(Qt.AlignCenter)
        item.setText("My Votes")
        item.setToolTip("My Votes: YEAS/ABSTAINS/NAYS")
        self.proposalBox.setHorizontalHeaderItem(6, item)

        item = QTableWidgetItem()
        item.setTextAlignment(Qt.AlignCenter)
        item.setText("Details")
        item.setToolTip("Check Proposal Details")
        self.proposalBox.setHorizontalHeaderItem(7, item)

    def loadIcons(self):
        self.refresh_icon = QIcon(
            os.path.join(self.caller.imgDir, 'icon_refresh.png'))
        self.time_icon = QPixmap(
            os.path.join(self.caller.imgDir, 'icon_clock.png'))
        self.link_icon = QIcon(
            os.path.join(self.caller.imgDir, 'icon_link.png'))
        self.search_icon = QIcon(
            os.path.join(self.caller.imgDir, 'icon_search.png'))
        self.list_icon = QIcon(
            os.path.join(self.caller.imgDir, 'icon_list.png'))
        self.question_icon = QPixmap(
            os.path.join(self.caller.imgDir, 'icon_question.png'))

    def resetStatusLabel(self, message=None):
        if message is None:
            self.statusLabel.setText(
                '<em><b style="color:purple">Loading proposals...</b></em>')
        else:
            self.statusLabel.setText(message)
        self.statusLabel.setVisible(True)
Example #54
0
File: dxc.py Project: tanqw/test
import sys
import asyncio
import time

from PyQt5.QtWidgets import QApplication, QProgressBar
from quamash import QEventLoop, QThreadExecutor

app = QApplication(sys.argv)
loop = QEventLoop(app)
asyncio.set_event_loop(loop)  # NEW must set the event loop

progress = QProgressBar()
progress.setRange(0, 99)
progress.show()


async def master():
    await first_50()
    with QThreadExecutor(1) as exec:
        await loop.run_in_executor(exec, last_50)
    # TODO announce completion?


async def first_50():
    for i in range(50):
        progress.setValue(i)
        await asyncio.sleep(.01)


def last_50():
    for i in range(50, 100):
Example #55
0
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.init_widgets()
        self.init_UI()
        self.init_connection()

    def init_widgets(self):
        self.Display_Widget = Display_widget()

    def init_UI(self):
        self.setWindowIcon(QIcon("GUI-resourses/FT-icon.png"))
        self.setWindowTitle("FT-ITK  简易三维医学数据可视化平台")
        self.main_widget = QtWidgets.QWidget()  # 创建窗口主部件
        self.main_layout = QtWidgets.QGridLayout()  # 创建主部件的网格布局
        #self.main_widget.setObjectName('main_widget')
        self.setCentralWidget(self.main_widget)  # 设置窗口主部件
        self.main_widget.setLayout(self.main_layout)
        #self.setLayout(self.main_layout)  # 设置窗口主部件布局为网格布局
        self.left_widget = QtWidgets.QWidget()  # 创建窗口左部件
        self.left_layout = QtWidgets.QGridLayout()
        self.left_widget.setLayout(self.left_layout)
        self.main_layout.addWidget(self.left_widget, 0, 0)
        self.main_layout.addWidget(self.Display_Widget, 0, 1)

        self.left_treewidget = Drop_Tree_Widget(self.left_widget)
        self.left_layout.addWidget(self.left_treewidget, 0, 0, 20, 10)

        self.left_pbar_container_widget = QtWidgets.QWidget(self.left_widget)
        self.pbar = QProgressBar(self.left_widget)
        self.model_btn = QRadioButton(self.left_widget)
        self.model_btn.setText("Seg")
        self.left_layout.addWidget(self.pbar, 21, 1, 1, 9)
        self.left_layout.addWidget(self.model_btn, 21, 0, 1, 1)
        self.left_layout.setSpacing(20)
        # self.left_layout.addWidget(self.left_pbar_container_widget)
        # self.left_treewidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.pbar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        self.model_btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        #self.left_pbar_container_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        # self.left_pbar_container_layout= QtWidgets.QHBoxLayout()
        # self.left_pbar_container_widget.setLayout(self.left_pbar_container_layout)
        # self.left_pbar_container_layout.addWidget(self.pbar)

    # self.model_btn=SwitchBtn(self.left_pbar_container_widget)


#        self.left_pbar_container_layout.addWidget(self.model_btn)
#self.pbar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

    def init_connection(self):
        self.left_treewidget.file_text_signal.connect(self.handle_drop_file)
        self.model_btn.toggled.connect(self.handle_model_btn_clicked)
        self.Display_Widget.pbar_signal.connect(self.progress_bar_effect)

    def handle_drop_file(self, file_path: str):
        """
        activated when a file is dropped into treewidget
        :param file_path: the path of the dropped file
        :return:
        """
        self.Display_Widget.load_data(file_path=file_path)
        if self.model_btn.isChecked():  #do segmentation
            self.Display_Widget.load_label_data()
            self.Display_Widget.flash()
        else:
            pass

    def handle_model_btn_clicked(self):
        if self.model_btn.isChecked() == True:  #do segmentation
            self.Display_Widget.load_label_data()
            self.Display_Widget.flash()
        else:
            self.pbar.setValue(0)
            self.Display_Widget.clear_label()
            self.Display_Widget.flash()

    def FixSize(self):
        self.setFixedSize(self.width(), self.height())

    def progress_bar_effect(self):  # just for show
        for i in range(100):
            self.pbar.setValue(i + 1)
            time.sleep(0.01)
Example #56
0
    def mouseReleaseEvent(self, event):
        if self.fIsReadOnly:
            return

        self.fLeftClickDown = False
        QProgressBar.mouseReleaseEvent(self, event)
Example #57
0
class WMain(QMainWindow, TgWai):
    def __init__(self):
        super().__init__()
        self.wn_init()

    def wn_init(self):
        JC_LOG.info(self.tm_wai('Initializing ...'))

        self.wv_i_nop = 0

        self.setWindowTitle(GC_APP_NM)
        self.resize(460, 145)

        self.wu_cw = QWidget()
        self.wu_lo = QGridLayout()
        self.wu_cw.setLayout(self.wu_lo)
        self.setCentralWidget(self.wu_cw)

        def nf2_new_le():
            fu2_le = QLineEdit()
            fu2_le.setMinimumWidth(700)
            fu2_le.setAlignment(Qt.AlignLeft)
            fu2_le.setReadOnly(True)
            return fu2_le

        def nf2_ui_add_input(x_row):
            fv2_row = x_row
            self.wu_lb_i_pn = QLabel('Input path')
            self.wu_le_i_pn = nf2_new_le()
            self.wu_le_i_pn.setText(
                QStandardPaths.writableLocation(
                    QStandardPaths.DesktopLocation))
            self.wu_pb_i_fn = QPushButton('…')
            self.wu_pb_i_fn.setMaximumWidth(25)
            self.wu_lb_i_bn = QLabel('Input base name')
            self.wu_le_i_bn = nf2_new_le()
            self.wu_lb_i_nfo = QLabel('Input file info')
            self.wu_le_i_nfo = nf2_new_le()
            self.wu_lo.addWidget(self.wu_lb_i_pn, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_i_pn, fv2_row, 1, 1, 3)
            self.wu_lo.addWidget(self.wu_pb_i_fn, fv2_row, 4, 2, 1)
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_lb_i_bn, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_i_bn, fv2_row, 1, 1, 3)
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_lb_i_nfo, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_i_nfo, fv2_row, 1, 1, -1)
            return fv2_row

        def nf2_ui_add_hor_ln(x_row):
            fv2_row = x_row
            fu2_fm = QFrame()
            fu2_fm.setGeometry(QRect(1, 1, 1, 1))
            fu2_fm.setFrameShape(QFrame.HLine)
            fu2_fm.setFrameShadow(QFrame.Sunken)
            self.wu_lo.addWidget(fu2_fm, fv2_row, 0, 1, -1)
            return fv2_row

        def nf2_ui_add_config(x_row):
            fv2_row = x_row
            self.wu_lb_cfg = QLabel('Setup')
            self.wu_hbl_cfg = QHBoxLayout()
            self.wu_hbl_cfg.setSpacing(1)

            def ff3_new_sb_repeat():
                fu3_sb = QSpinBox()
                fu3_sb.setMinimum(1)
                fu3_sb.setMaximum(100_000)
                fu3_sb.setValue(fu3_sb.minimum())
                fu3_sb.setPrefix('repeat the PDF file ')
                fu3_sb.setSuffix(' times')
                fu3_sb.setSingleStep(1)
                fu3_sb.setAlignment(Qt.AlignRight)
                return fu3_sb

            self.wu_sb_repeat = ff3_new_sb_repeat()
            self.wu_hbl_cfg.addWidget(self.wu_sb_repeat)
            self.wu_hbl_cfg.addItem(
                QSpacerItem(1, 1, QSizePolicy.Expanding, QSizePolicy.Minimum))
            self.wu_lo.addWidget(self.wu_lb_cfg, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addLayout(self.wu_hbl_cfg, fv2_row, 1, 1, -1)
            return fv2_row

        def nf2_ui_add_output(x_row):
            fv2_row = x_row
            self.wu_lb_o_pn = QLabel('Output path')
            self.wu_le_o_pn = nf2_new_le()
            self.wu_le_o_pn.setText(
                gf_pj(
                    QStandardPaths.writableLocation(
                        QStandardPaths.DownloadLocation), 'TMPS'))
            self.wu_lo.addWidget(self.wu_lb_o_pn, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_o_pn, fv2_row, 1, 1, -1)
            self.wu_lb_o_bn = QLabel('Output base name')
            self.wu_le_o_bn = nf2_new_le()
            self.wu_lb_o_nfo = QLabel('Output file info')
            self.wu_le_o_nfo = nf2_new_le()
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_lb_o_bn, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_o_bn, fv2_row, 1, 1, -1)
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_lb_o_nfo, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_o_nfo, fv2_row, 1, 1, -1)
            return fv2_row

        def nf2_ui_add_process(x_row):
            fv2_row = x_row
            self.wu_lb_process = QLabel('Process')
            self.wu_pgb = QProgressBar()
            self.wu_pgb.setMinimum(0)
            self.wu_pgb.setAlignment(Qt.AlignCenter)
            self.wu_pb_do = QPushButton('Do')
            self.wu_pb_do.setMaximumWidth(80)
            self.wu_pb_do.setEnabled(False)
            self.wu_te_log = QTextEdit()
            self.wu_te_log.setFont(
                QFontDatabase.systemFont(QFontDatabase.FixedFont))
            self.wu_te_log.setReadOnly(True)
            self.wu_te_log.setWordWrapMode(QTextOption.NoWrap)
            self.wu_te_log.setMinimumHeight(250)
            self.wu_lo.addWidget(self.wu_lb_process, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_pgb, fv2_row, 1, 1, 2)
            self.wu_lo.addWidget(self.wu_pb_do, fv2_row, 3, 1, -1,
                                 Qt.AlignCenter)
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_te_log, fv2_row, 1, 1, -1)
            return fv2_row

        nv_row = 0
        nv_row = nf2_ui_add_input(nv_row) + 1
        nv_row = nf2_ui_add_hor_ln(nv_row) + 1
        nv_row = nf2_ui_add_config(nv_row) + 1
        nv_row = nf2_ui_add_hor_ln(nv_row) + 1
        nv_row = nf2_ui_add_output(nv_row) + 1
        nv_row = nf2_ui_add_hor_ln(nv_row) + 1
        nv_row = nf2_ui_add_process(nv_row) + 1

        self.wu_lo.setColumnStretch(1, 1)
        self.wu_pb_i_fn.clicked.connect(self.wn_pb_i_fn_clicked)
        self.wu_sb_repeat.valueChanged.connect(self.wn_sb_repeat_value_changed)
        self.wu_pb_do.clicked.connect(self.wn_pb_do_clicked)

        def pp2_move_center():
            pu2_cp = QDesktopWidget().availableGeometry().center()
            pu2_fg = self.frameGeometry()
            pu2_fg.moveCenter(pu2_cp)
            self.move(pu2_fg.topLeft())

        self.show()
        pp2_move_center()
        self.raise_()

    def wn_pb_i_fn_clicked(self):
        def np2_do():
            pu2_i_fn = QFileDialog.getOpenFileName(self, 'Select PDF file',
                                                   self.wu_le_i_pn.text(),
                                                   'PDF file (*.pdf)')[0]
            if not gf_if(pu2_i_fn): return
            self.wn_log_clear()
            self.wn_log_info(f'Requested file => {pu2_i_fn}')
            self.wn_log_info('Getting total pages of the requested file ...')
            self.wu_le_i_pn.setText(gf_pn(pu2_i_fn))
            self.wv_i_nop = self.wm_pdf_nop(pu2_i_fn)
            self.wu_le_i_bn.setText(gf_bn(pu2_i_fn))
            self.wn_log_info(
                f"Total pages of the requested file => {self.wv_i_nop:,d}")
            self.wu_le_i_nfo.setText(f'{self.wv_i_nop:,d} page(s)')
            self.wn_sb_repeat_value_changed()

        try:
            np2_do()
        except:
            gp_log_exception(self.wn_log_error, 'Following error occurs !!!',
                             gf_exception_to_list(), 30)
            self.wn_log_error('Check your PDF file or this program logic !!!')

    def wn_sb_repeat_value_changed(self):
        if self.wv_i_nop < 1: return
        nu_i_nop = self.wv_i_nop
        nu_repeat = self.wu_sb_repeat.value()
        nu_o_nop = nu_i_nop * nu_repeat
        self.wu_le_o_bn.setText(
            f'{ gf_jn ( self.wu_le_i_bn .text () ) }-(RepeatOneFile)-({nu_i_nop:d}ⅹ{nu_repeat:d})-{nu_o_nop:d}-pages.pdf'
        )
        self.wu_le_o_nfo.setText(
            f'( {nu_i_nop:,d} ⅹ {nu_repeat:,d} ) => {nu_o_nop:,d} pages')
        self.wu_pb_do.setEnabled(True)

    def wn_pb_do_clicked(self):
        nu_st = datetime.now()
        nv_cancelled = False
        gp_log_header(self.wn_log_info, 'Start processing ...', 23)

        def np2_do():
            pu2_w_lst = [self.wu_pb_i_fn, self.wu_sb_repeat, self.wu_pb_do]

            def pp3_set_enabled(x3_bool):
                for bu4_w in pu2_w_lst:
                    bu4_w.setEnabled(x3_bool)

            try:
                pp3_set_enabled(False)
                bu3_o_fn = gf_pj(self.wu_le_o_pn.text(),
                                 self.wu_le_o_bn.text())
                self.wn_log_info(f'Output path => { gf_pn (bu3_o_fn) }')
                self.wn_log_info(
                    f'Base name to generate => { gf_bn (bu3_o_fn) }')
                if gf_if(bu3_o_fn):
                    self.wn_log_warn(
                        f'Oputput file is already exist in { gf_pn (bu3_o_fn) }'
                    )
                    bu4_overwrite = QMessageBox.question(
                        self, GC_APP_NM, 'Overwrite ?')
                    if bu4_overwrite == QMessageBox.No:
                        nonlocal nv_cancelled
                        nv_cancelled = True
                        return
                JC_LOG.info('Make output path if not exist ...')
                gp_mp(gf_pn(bu3_o_fn))
                bu3_i_nop = self.wv_i_nop
                bu3_repeat = self.wu_sb_repeat.value()
                bu3_o_nop = bu3_i_nop * bu3_repeat
                JC_LOG.info(f'Initializing progress bar ...')
                self.wu_pgb.setMaximum(bu3_o_nop)
                self.wu_pgb.setValue(0)
                try:
                    self.wn_log_info('Opening input file ...')
                    bu4_i_doc = CjPdfDocument(
                        CjPdfReader(
                            gf_pj(self.wu_le_i_pn.text(),
                                  self.wu_le_i_bn.text())))
                    self.wn_log_info('Opening output file ...')
                    self.wn_log_info(
                        'Writing output file ( may take a long time ) ...')
                    bu4_o_doc = CjPdfDocument(
                        CjPdfWriter(bu3_o_fn).setSmartMode(True))
                    bv4_o_nop_so_far = 0
                    bu4_cache = {}
                    for bu5_i_pg_no in range(1, bu3_i_nop + 1):
                        bu5_i_pg = bu4_i_doc.getPage(bu5_i_pg_no)
                        bu5_o_pg_sz = bu5_i_pg.getCropBox()
                        bu5_o_pg_cp = bu5_i_pg.copyAsFormXObject(bu4_o_doc)
                        bu4_cache[bu5_i_pg_no] = [bu5_o_pg_sz, bu5_o_pg_cp]
                    for bu5_iteration in range(1, bu3_repeat + 1):
                        self.wn_log_info(
                            f'New iteration {bu5_iteration} with page number {bv4_o_nop_so_far+1}'
                        )
                        for bu6_i_pg_no in range(1, bu3_i_nop + 1):
                            bu6_o_pg_sz = bu4_cache[bu6_i_pg_no][0]
                            bu6_o_pg_cp = bu4_cache[bu6_i_pg_no][1]
                            bu6_o_pg = bu4_o_doc.addNewPage(
                                CjPageSize(bu6_o_pg_sz))
                            CjPdfCanvas(bu6_o_pg).addXObject(bu6_o_pg_cp, 0, 0)
                            bv4_o_nop_so_far += 1
                            self.wu_pgb.setValue(bv4_o_nop_so_far)
                            GC_QAPP.processEvents()
                finally:
                    bu4_o_doc.close()
                    bu4_i_doc.close()
            finally:
                pp3_set_enabled(True)

        try:
            np2_do()
        except:
            gp_log_exception(self.wn_log_error, 'Following error occurs !!!',
                             gf_exception_to_list(), 30)
            self.wn_log_error('Check your PDF file or this program logic !!!')
        else:
            if nv_cancelled: self.wn_log_warn(f'Cancelled by user !!!')
            else:
                self.wn_log_info(
                    'Done processing => elapsed {} ...'.format(datetime.now() -
                                                               nu_st))

    def wm_pdf_nop(self, x_fn):  # (n)umber (o)f (p)ages
        mu_doc = CjPdfDocument(CjPdfReader(x_fn))
        mu_nop = mu_doc.getNumberOfPages()
        mu_doc.close()
        return mu_nop

    def wn_log_clear(self):
        self.wu_te_log.clear()

    def wn_log_info(self, x_msg):
        JC_LOG.info(x_msg)
        self.wu_te_log.append(
            f"<font color=black>[I] { self. wm_2_html (x_msg) }</font>")

    def wn_log_warn(self, x_msg):
        JC_LOG.warn(x_msg)
        self.wu_te_log.append(
            f"<font color=magenta>[W] { self. wm_2_html (x_msg) }</font>")

    def wn_log_error(self, x_msg):
        JC_LOG.error(x_msg)
        self.wu_te_log.append(
            f"<font color=red>[E] { self. wm_2_html (x_msg) }</font>")

    def wm_2_html(self, x_msg):
        nv_msg = re.sub(r'(?:\r\n|\r|\n)', '<br>', x_msg)
        return nv_msg.replace(' ', '&nbsp;')

    def __del__(self):
        self.wn_fini()

    def wn_fini(self):
        JC_LOG.info(self.tm_wai('Finalizing ...'))

    def closeEvent(self, x_ev):
        JC_LOG.info(self.tm_wai('Closing ...'))
        jp_request_exit(GC_EC_SUCCESS)
Example #58
0
class WXForm(QWidget):
    def __init__(self):
        super().__init__()
        self.files = None
        self.initUI()
        self.resize(550, 500)

    def initUI(self):
        self.createGridGroupBox()
        self.createFileListBox()
        self.createButtonBox()
        mainLayout = QVBoxLayout()
        hboxLayout = QHBoxLayout()
        self.setWindowTitle('服务器软件')
        hboxLayout.addWidget(self.gridGroupBox)
        mainLayout.addLayout(hboxLayout)
        mainLayout.addWidget(self.ButtonBox)

        mainLayout.addWidget(self.FileListBox)

        self.setLayout(mainLayout)

    def createButtonBox(self):
        self.ButtonBox = QGroupBox()
        layout = QGridLayout()
        self.select_path = QPushButton('选择文件')
        self.select_path.clicked.connect(self.showDialog)
        self.run_btn = QPushButton('上传')
        self.run_btn.clicked.connect(self.start)
        layout.addWidget(self.select_path, 0, 0, 1, 1)
        layout.addWidget(self.run_btn, 0, 1, 1, 1)
        self.ButtonBox.setLayout(layout)

    def createFileListBox(self):
        self.FileListBox = QGroupBox('上传文件')
        layout = QGridLayout()
        self.file_list = QListView()
        self.cmodel = QStandardItemModel(self.file_list)
        layout.addWidget(self.file_list, 1, 0)
        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)
        layout.addWidget(self.pbar, 2, 0)
        self.FileListBox.setLayout(layout)

    def createGridGroupBox(self):
        self.gridGroupBox = QGroupBox('服務器信息')
        layout = QGridLayout()
        address = QLabel('服务器地址')
        self.address = QLineEdit('127.0.0.1:6379')
        key = QLabel('数据库键名')
        self.key = QLineEdit('title_license')
        pwd = QLabel('服务器密码')
        self.pwd = QLineEdit('tongna888')
        self.pwd.setEchoMode(QLineEdit.Password)
        layout.setSpacing(10)
        layout.addWidget(address, 1, 0, 1, 1)
        layout.addWidget(self.address, 1, 1, 1, 1)
        layout.addWidget(key, 3, 0, 1, 1)
        layout.addWidget(self.key, 3, 1, 1, 1)
        layout.addWidget(pwd, 2, 0, 1, 1)
        layout.addWidget(self.pwd, 2, 1, 1, 1)
        layout.setColumnStretch(1, 10)
        self.gridGroupBox.setLayout(layout)

    def showDialog(self):
        self.cmodel.clear()
        self.files = QFileDialog.getOpenFileName(self, '选择文件', '', '*.csv')[0]
        if self.files:
            item = QStandardItem()
            item.setText(self.files)
            self.cmodel.appendRow(item)
            self.file_list.setModel(self.cmodel)

    def closeEvent(self, event):
        event.accept()
        try:
            os._exit(5)
        except Exception as e:
            print(e)

    def start(self):
        host, port = self.address.text().split(':')
        pool = redis.ConnectionPool(host=host,
                                    port=port,
                                    password=self.pwd.text())
        red = redis.Redis(connection_pool=pool)
        data = pd.read_csv(self.files)
        self.length = len(data)
        step = int(self.length / 100)
        inds = {i for i in range(0, self.length, step)}
        inds.add(self.length - 1)
        self.pbar.setRange(0, self.length - 1)
        for index, row in enumerate(data.values):
            if index in inds:
                self.pbar.setValue(index)
                QApplication.processEvents()
            red.sadd(self.key.text(), row[0].strip())
class RestoreIncBackupWindow(QWidget):
    def __init__(self, incBackupList):
        super().__init__()
        self.setGeometry(200, 50, 300, 300)
        self.setWindowTitle("Restore Incremental Backup")
        self.incBackupList = incBackupList
        global con
        global cur
        con = sqlite3.connect('backup/backupshistory.db')
        cur = con.cursor()
        self.layouts()
        self.widgets()

    def layouts(self):
        self.mainLayout = QVBoxLayout()
        self.topLayout = QVBoxLayout()
        self.topLayout.setContentsMargins(20, 20, 20, 20)
        self.bottomLayout = QHBoxLayout()
        self.form = QFormLayout()

        self.progeesBar = QProgressBar()
        self.progeesBar.setHidden(True)
        self.submitBtn = QPushButton("Submit")
        self.submitBtn.clicked.connect(self.submitAction)
        self.cancelBtn = QPushButton("Cancel")
        self.cancelBtn.clicked.connect(self.cancelAction)
        self.okBtn = QPushButton("Ok")
        self.okBtn.clicked.connect(self.okAction)
        self.okBtn.setHidden(True)
        self.submitBtn.setFixedHeight(30)
        self.cancelBtn.setFixedHeight(30)
        self.okBtn.setFixedHeight(30)
        self.submitBtn.setStyleSheet(
            "color: #ecf0f1; background-color: #27ae60 ; border: 0px")
        self.okBtn.setStyleSheet(
            "color: #ecf0f1; background-color: #27ae60 ; border: 0px")
        self.cancelBtn.setStyleSheet(
            "color: #ecf0f1; background-color: #e74c3c; border: 0px")

        self.bottomLayout.addWidget(self.submitBtn)
        self.bottomLayout.addWidget(self.cancelBtn)
        self.bottomLayout.addWidget(self.okBtn)
        self.mainLayout.addLayout(self.topLayout)
        self.mainLayout.addStretch()
        self.mainLayout.addLayout(self.bottomLayout)
        self.setLayout(self.mainLayout)

    def widgets(self):
        self.container = QHBoxLayout()
        self.icon = QLabel('=>')
        self.combobeginning = QComboBox()
        self.comboend = QComboBox()
        self.container.addWidget(self.combobeginning)
        self.container.addWidget(self.icon)
        self.container.addWidget(self.comboend)
        self.container.addStretch()

        self.alllevels = QCheckBox('All Levels')
        self.alllevels.stateChanged.connect(self.alllevelsAction)

        self.cretecombo()

        self.topLayout.addWidget(self.txt)
        self.topLayout.addWidget(self.combo)
        self.topLayout.addWidget(self.alllevels)

        self.lineEditrestoringDst = QLineEdit()
        self.lineEditrestoringDst.setPlaceholderText(
            'where you are going to restore your incremental backup')
        self.text = QLabel('')
        self.topLayout.addLayout(self.container)
        self.topLayout.addWidget(QLabel('Restoring Destination : '))
        self.topLayout.addWidget(self.lineEditrestoringDst)
        self.topLayout.addWidget(self.text)
        self.topLayout.addWidget(self.progeesBar)

    def alllevelsAction(self):
        if self.alllevels.isChecked():
            self.combobeginning.setHidden(True)
            self.comboend.setHidden(True)
            self.icon.setHidden(True)
        else:
            self.combobeginning.setHidden(False)
            self.comboend.setHidden(False)
            self.icon.setHidden(False)

    def cretecombo(self):
        self.combo = QComboBox()
        self.txt = QLabel('Chose Meta Name :')
        self.combo.currentTextChanged.connect(self.updateLevels)
        for item in self.incBackupList:
            self.combo.addItem(item)

    def updateLevels(self, value):
        global cur
        if self.alllevels.isChecked():
            pass
        else:
            self.combobeginning.clear()
            self.comboend.clear()
            query = "SELECT level FROM IncrementalBackups WHERE metaname=? ORDER BY LEVEL ASC"
            levels = cur.execute(query, (value, )).fetchall()
            for item in levels:
                self.combobeginning.addItem(str(item[0]))
                self.comboend.addItem(str(item[0]))

    def submitAction(self):
        self.setCursor(Qt.WaitCursor)
        global cur
        try:
            self.progeesBar.setHidden(False)
            self.progeesBar.setMaximum(1)
            self.progeesBar.setValue(0)
            self.restoreincbackup()
        except Exception:
            QMessageBox.warning(
                self, 'warning',
                f"error occured during restoring these incremental backups\n")
        else:
            self.setCursor(Qt.ArrowCursor)
            self.submitBtn.setHidden(True)
            self.cancelBtn.setHidden(True)
            self.okBtn.setHidden(False)

    def okAction(self):
        self.close()

    def restoreincbackup(self):
        global cur
        try:
            query = "SELECT metaname,name,dstpath FROM IncrementalBackups "
            incbackups = cur.execute(query).fetchall()
            restoreDst = self.lineEditrestoringDst.text()
            begin = int(self.combobeginning.currentText())
            end = int(self.comboend.currentText())
            if self.alllevels.isChecked():
                for incbackup in incbackups:
                    c = f"tar --extract --verbose --verbose --preserve-permissions --listed-incremental=/dev/null --file={incbackup[2]}/{incbackup[0]}/{incbackup[1]}.tar.gz  --directory={restoreDst}"
                    subprocess.run(c, shell=True)
            else:
                for incbackup in incbackups[begin:end]:
                    c = f"tar --extract --verbose --verbose --preserve-permissions --listed-incremental=/dev/null --file={incbackup[2]}/{incbackup[0]}/{incbackup[1]}.tar.gz  --directory={restoreDst}"
                    subprocess.run(c, shell=True)
        except Exception as e:
            self.text.setText(
                f"error occured during restoring these backups\n{e}")
        else:
            self.text.setText("Backups restored succesfully!")
        finally:
            self.progeesBar.setValue(1)

    def cancelAction(self):
        self.close()
Example #60
0
    async def downloadObject(self, ipfsop, objConfig):
        pBar = QProgressBar()

        def onProgressValue(val):
            if val in range(0, 50):
                pBar.setStyleSheet('''
                    QProgressBar:horizontal {
                        border: 1px solid gray;
                        border-radius: 5px;
                        text-align: center;
                    }

                    QProgressBar::chunk:horizontal {
                        text-align: center;
                        background-color: #60cccf;
                    }
                ''')
            else:
                pBar.setStyleSheet('''
                    QProgressBar:horizontal {
                        border: 1px solid gray;
                        border-radius: 5px;
                        text-align: center;
                    }

                    QProgressBar::chunk:horizontal {
                        text-align: center;
                        background-color: #4b9fa2;
                    }
                ''')

        pBar.setObjectName('downloadProgressBar')
        pBar.valueChanged.connect(onProgressValue)

        self.treeWidget().setItemWidget(self, self.COL_STATUS, pBar)

        baseDir = self.baseDownloadDir()
        chunkSize = objConfig.downloadChunkSize

        log.debug(f'Downloading with chunk size {chunkSize}')

        try:
            async for result in ipfsop.client.core.getgen(
                    self.objdescr['path'], dstdir=str(baseDir),
                    chunk_size=chunkSize, sleept=0.1):

                status, read, clength = result

                if status == 0:
                    progress = (read * 100) / clength
                    pBar.setValue(progress)
                elif status == 1:
                    break

                await ipfsop.sleep(0.1)
        except aioipfs.APIError as e:
            # OK these setItemWidget() calls have got to go, this
            # is not middle age here. Replace by signals asap.
            self.treeWidget().setItemWidget(self, self.COL_STATUS, None)
            self.status(f'IPFS error: {e.message}')
        except Exception:
            self.treeWidget().setItemWidget(self, self.COL_STATUS, None)
            self.status('Error')
        else:
            pBar.setValue(100)

            self.status('Downloaded')
            self.treeWidget().setItemWidget(self, self.COL_STATUS, None)

            hDir = baseDir.joinpath(self.stat['Hash'])

            if self.objdescr['name']:
                nDir = baseDir.joinpath(self.objdescr['name'])
            else:
                nDir = hDir

            if nDir.exists():
                return nDir

            if hDir.exists():
                hDir.replace(nDir)
                return nDir