Ejemplo n.º 1
0
class DownloadOrbit(QWidget):
    def __init__(self):
        super().__init__()
        self.get_urls_thread = GetUrlThread()
        self.add_to_idm_thread = AddToIDMThread()
        self.exec_idm_thread = ExecIDMThread()

        self.setWindowTitle("Download Sentinel-1A/B Precise Orbit")
        self.setFont(QFont('Consolas'))
        self.setWindowIcon(QIcon(':/orbit.ico'))
        self.resize(800, 400)
        self.setup_ui()

    def setup_ui(self):
        self.label_mode = QLabel('获取精轨日期模式:')
        self.radio_btn_file = QRadioButton('file mode')
        self.radio_btn_dir = QRadioButton('dir mode')
        self.radio_btn_file.setChecked(True)
        self.label_type = QLabel('文本文件路径:')
        self.le_image_path = QLineEdit()
        self.label_orbit = QLabel('精轨保存路径:')
        self.le_orbit_path = QLineEdit()
        self.label_idm = QLabel('IDMan.exe路径:')
        self.le_idm_path = QLineEdit()
        self.btn_image_path = QPushButton('选择路径')
        self.btn_image_path.setFixedSize(self.btn_image_path.sizeHint())
        self.btn_orbit_path = QPushButton('选择路径')
        self.btn_orbit_path.setFixedSize(self.btn_orbit_path.sizeHint())
        self.btn_idm_path = QPushButton('选择路径')
        self.btn_idm_path.setFixedSize(self.btn_idm_path.sizeHint())
        self.btn_get_urls = QPushButton('抓取精轨链接')
        self.btn_add_to_idm = QPushButton('启动IDM\n 并添加任务 ')
        self.btn_add_to_idm.setSizePolicy(QSizePolicy.Fixed,
                                          QSizePolicy.Expanding)
        self.btn_get_urls.setObjectName('btn_get_urls')
        self.btn_add_to_idm.setObjectName('btn_add_to_idm')
        self.btn_idm_path.setObjectName('btn_idm_path')
        self.btn_image_path.setObjectName('btn_image_path')
        self.btn_orbit_path.setObjectName('btn_orbit_path')
        self.label_progress = QLabel('抓取链接进度:')
        self.pb_progress = QProgressBar()
        self.pb_progress.setValue(self.pb_progress.minimum() - 1)
        self.pb_progress.setFormat("%v/%m")
        self.ted_info = TextEdit()
        self.ted_info.setFontUnderline(False)
        self.ted_info.setTextColor(QColor('black'))
        self.ted_info.setReadOnly(True)
        self.ted_info.setText(
            "@author  : leiyuan \n@version : 3.5\n"
            "@date    : 2020-02-23\n\n"
            "file mode: 从'文本文件'获取Sentinel-1A/B影像名,用于获取影像日期,从而获取精轨日期"
            "\ndir  mode: 从'压缩文件'获取Sentinel-1A/B影像名,用于获取影像日期,从而获取精轨日期"
            "\n\n温馨提示:为了能够更快地完成任务,请尽量翻越长城")
        # 设置布局
        layout = QGridLayout(self)
        self.setLayout(layout)
        layout.setColumnStretch(2, 1)
        layout.setColumnStretch(3, 1)
        layout.setColumnStretch(4, 1)
        # 第一行
        layout.addWidget(self.label_mode, 0, 1, Qt.AlignRight)
        layout.addWidget(self.radio_btn_file, 0, 2)
        layout.addWidget(self.radio_btn_dir, 0, 3)
        # 第二行
        layout.addWidget(self.label_type, 1, 1, Qt.AlignRight)
        layout.addWidget(self.le_image_path, 1, 2, 1, 3)
        layout.addWidget(self.btn_image_path, 1, 5)
        layout.addWidget(self.btn_get_urls, 1, 6, 1, 2)
        # 第三行
        layout.addWidget(self.label_orbit, 2, 1, Qt.AlignRight)
        layout.addWidget(self.le_orbit_path, 2, 2, 1, 3)
        layout.addWidget(self.btn_orbit_path, 2, 5)
        layout.addWidget(self.btn_add_to_idm, 2, 6, 2, 2)
        # 第四行
        layout.addWidget(self.label_idm, 3, 1, Qt.AlignRight)
        layout.addWidget(self.le_idm_path, 3, 2, 1, 3)
        layout.addWidget(self.btn_idm_path, 3, 5)
        # 第五行
        layout.addWidget(self.label_progress, 4, 1, Qt.AlignRight)
        layout.addWidget(self.pb_progress, 4, 2, 1, 6)
        # 第六行
        layout.addWidget(self.ted_info, 5, 1, 3, 7)

        # 信号与槽
        self.btn_get_urls.clicked.connect(self.get_urls)
        self.get_urls_thread.sin_out_task_num.connect(self.task_num)
        self.get_urls_thread.sin_out_process.connect(
            lambda value: self.pb_progress.setValue(value))
        self.get_urls_thread.sin_out_urls.connect(self.assign_urls)
        self.exec_idm_thread.sin_out_warning.connect(self.warning)
        self.add_to_idm_thread.sin_out_success.connect(self.success_add_to_idm)
        self.add_to_idm_thread.sin_out_error_num.connect(self.error_add_to_idm)
        self.pb_progress.valueChanged.connect(
            lambda value: self.success_get_urls(value))
        self.btn_orbit_path.clicked.connect(self.get_orbit_path)
        self.btn_idm_path.clicked.connect(self.get_idm_path)
        self.btn_image_path.clicked.connect(self.get_images_name_by_file)
        self.radio_btn_file.toggled.connect(
            lambda: self.switch_btn_slot(self.radio_btn_file))
        self.radio_btn_dir.toggled.connect(
            lambda: self.switch_btn_slot(self.radio_btn_dir))
        self.btn_add_to_idm.clicked.connect(self.add_to_idm)

    def warning(self, info):
        """弹出警告信息"""
        mb = QMessageBox(QMessageBox.Warning, "Warning", info, QMessageBox.Ok,
                         self)
        mb.show()

    def assign_urls(self, urls):
        self.add_to_idm_thread.urls = urls

    def task_num(self, num):
        if num:
            self.pb_progress.setEnabled(True)
            self.pb_progress.setMaximum(num)
            self.pb_progress.setValue(0)
            self.ted_info.clear()
            self.ted_info.setFontUnderline(False)
            self.ted_info.setTextColor(QColor('black'))
            # 添加一个开始锚点
            self.ted_info.append("<a name='begin'></a>")
            time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            self.ted_info.insertPlainText("{} 需要抓取 {} 个精轨链接\n".format(
                time, num))
        else:
            self.warning("未找到哨兵影像名,请重新设置{}".format(
                self.label_type.text()[:-1]))
            self.pb_progress.setEnabled(False)

    def success_add_to_idm(self, info):
        self.ted_info.setFontUnderline(False)
        self.ted_info.setTextColor(QColor('black'))
        self.ted_info.append(info)

    def error_add_to_idm(self, info):
        self.ted_info.setFontUnderline(False)
        self.ted_info.setTextColor(QColor('black'))
        self.ted_info.append(info)

    def success_get_urls(self, value):
        def get_date(u):
            temp = re.findall(r"\d{8}", u)[-1]
            temp = datetime.datetime(int(temp[:4]), int(temp[4:6]),
                                     int(temp[6:]))
            delta = datetime.timedelta(days=-1)
            date = temp + delta
            return date.strftime('%Y%m%d')

        if value == self.pb_progress.maximum():
            time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            self.ted_info.insertPlainText('\n{} 成功抓取所有精轨链接\n\n{}\n\n'.format(
                time, '*' * 50))
            for url in self.get_urls_thread.urls:
                html = "精轨对应的影像日期(点击右侧日期即可下载):<a href={}>{}</a>".format(
                    url, get_date(url))
                self.ted_info.insertHtml(html)
                self.ted_info.append('\n')
            self.ted_info.append("<a name='end'>{}</a>\n\n".format("*" * 50))
            self.ted_info.scrollToAnchor('begin')

    def add_to_idm(self):
        idm_path = self.le_idm_path.text()
        orbit_path = self.le_orbit_path.text()
        if not idm_path and not orbit_path:
            self.warning("请设置精轨保存路径和IDMan.exe路径")
        elif not idm_path and orbit_path:
            self.warning("请设置IDMan.exe路径")
        elif not orbit_path and idm_path:
            self.warning("请设置精轨保存路径")
        elif not os.path.exists(orbit_path) and not os.path.exists(idm_path):
            self.warning("精轨保存路径和IDMan.exe路径不存在,请重新设置")
        elif not os.path.exists(orbit_path):
            self.warning("精轨保存路径不存在,请重新设置")
        elif not os.path.exists(idm_path):
            self.warning("IDMan.exe路径不存在,请重新设置")
        else:
            self.exec_idm_thread.idm_path = idm_path
            self.add_to_idm_thread.le_orbit_path = orbit_path
            self.add_to_idm_thread.idm_path = idm_path
            if self.add_to_idm_thread.urls:
                self.exec_idm_thread.start()
                self.add_to_idm_thread.start()
                self.ted_info.scrollToAnchor('end')
            else:
                self.warning("请先抓取精轨链接")

    def get_images_name_by_dir(self):
        dir_name = QFileDialog.getExistingDirectory(self, '选择压缩文件路径', './')
        if dir_name:
            self.le_image_path.setText(dir_name)
        self.get_urls_thread.image_path = self.le_image_path.text()

    def get_images_name_by_file(self):
        file_name = QFileDialog.getOpenFileName(
            self, '选择文本文件路径', './示例文件', 'All files(*.*);;txt file(*.txt)',
            'txt file(*.txt)')
        if file_name[0]:
            self.le_image_path.setText(str(file_name[0]))
        self.get_urls_thread.image_path = self.le_image_path.text()

    def get_orbit_path(self):
        dir_name = QFileDialog.getExistingDirectory(self, '选择精轨保存路径', '../')
        self.le_orbit_path.setText(dir_name)

    def get_urls(self):
        path = self.le_image_path.text()
        if not path:
            self.warning("请设置{}".format(self.label_type.text()[:-1]))
        elif not os.path.exists(path):
            self.warning("{}不存在,请重新设置".format(self.label_type.text()[:-1]))
        else:
            self.get_urls_thread.urls = []
            self.get_urls_thread.start()

    def get_idm_path(self):
        file_name = QFileDialog.getOpenFileName(self, '选择IDMan.exe路径',
                                                'C:/thorly/Softwares/IDM',
                                                'IDMan.exe (IDMan.exe)')
        self.le_idm_path.setText(str(file_name[0]))

    def switch_btn_slot(self, radio_btn):
        if radio_btn.text() == 'file mode' and radio_btn.isChecked():
            try:
                self.btn_image_path.clicked.disconnect(
                    self.get_images_name_by_dir)
                self.btn_image_path.clicked.disconnect(
                    self.get_images_name_by_file)
            except:
                pass
            self.btn_image_path.clicked.connect(self.get_images_name_by_file)
            self.label_type.setText('文本文件路径:')
        if radio_btn.text() == 'dir mode' and radio_btn.isChecked():
            try:
                self.btn_image_path.clicked.disconnect(
                    self.get_images_name_by_file)
                self.btn_image_path.clicked.disconnect(
                    self.get_images_name_by_dir)
            except:
                pass
            self.btn_image_path.clicked.connect(self.get_images_name_by_dir)
            self.label_type.setText('压缩文件路径:')
Ejemplo n.º 2
0
class QWProgressBar(QWidget):
    """ ProgressBar with comment.
    """
    def __init__(self, **kwargs):
        parent = kwargs.get('parent', None)
        win_title = kwargs.get('win_title', 'Progress bar')
        vmin = kwargs.get('vmin', 0)
        vmax = kwargs.get('vmax', 100)
        value = kwargs.get('value', 50)
        label = kwargs.get('label', '')

        QWidget.__init__(self, parent)
        if win_title is not None: self.setWindowTitle(win_title)

        self.timer = None

        self.hbox = QHBoxLayout()

        #if label is not None :
        if True:
            self.plab = QLabel(label)
            self.hbox.addWidget(self.plab)
            #self.hbox.addStretch(1)
        else:
            self.plab = None

        self.pbar = QProgressBar(self)
        self.hbox.addWidget(self.pbar)

        self.setLayout(self.hbox)

        self.set_range(vmin, vmax)
        self.set_value(value)

        self.set_style()
        #self.set_icons()
        self.set_tool_tips()

#-----------------------------

    def set_tool_tips(self):
        self.setToolTip('Progress bar')
        self.pbar.setToolTip('Progress bar indicator')

    def set_style(self):
        #self.setFixedWidth(200)
        self.setMinimumWidth(150)

        self.pbar.setTextVisible(True)
        #self.plab.setAlignment(Qt.AlignCenter)
        if self.plab is not None:
            self.plab.setStyleSheet('text-align: center;')
            self.plab.setFixedWidth(60)

        styleDefault = ""
        #styleGray = "background-color: rgb(230, 240, 230); color: rgb(0, 0, 0);" # Gray
        #styleGreenish = "background-color: rgb(100, 240, 200); color: rgb(255, 0, 0);" # Greenish
        #styleGreenish = "background-color: rgb(100, 240, 240);" # Greenish

        #self.setWindowFlags(Qt.FramelessWindowHint)
        #self.layout().setContentsMargins(5,5,5,5)
        self.layout().setContentsMargins(0, 0, 0, 0)

        self.setStyleSheet(styleDefault)
        self.pbar.setStyleSheet(styleDefault)
        #self.pbar.setStyleSheet('background-color: magenta;')
        #self.pbar.setStyleSheet('QProgressBar::chunk {background-color: yellow;};')

        p = QPalette()
        p.setColor(QPalette.Highlight, Qt.green)
        p.setColor(QPalette.Base, Qt.white)  # QColor(230, 230, 255, 255))
        self.pbar.setPalette(p)

    def set_range(self, vmin, vmax):
        self.pbar.setRange(vmin, vmax)

    def set_value(self, value):
        self.pbar.setValue(value)

    def set_label(self, s):
        self.plab.setText(s)

    def set_icons(self):
        try:
            from psdaq.control_gui.QWIcons import icon
            #from psana.graphqt.QWIcons import icon
            icon.set_icons()
            #self.but_cancel.setIcon(icon.icon_button_cancel)
            #self.but_apply .setIcon(icon.icon_button_ok)
        except:
            pass

    #def resizeEvent(self, e):
    #logger.debug('resizeEvent')

    #def moveEvent(self, e):
    #logger.debug('moveEvent')

    #def event(self, event):
    #logger.debug('Event happens...: %s' % str(event))

    #def closeEvent(self, event):
    #    logger.debug('closeEvent')

    def on_timeout(self, timeout_msec=100):
        """ for test only
        """
        if self.timer is None:
            self.timer = QTimer()
            self.timer.timeout.connect(self.on_timeout)
            self.counter = -1
        self.counter += 1
        value = (self.pbar.maximum() -
                 self.pbar.minimum()) * self.counter / 100.
        if value > self.pbar.maximum():
            self.timer.stop()
            self.timer.timeout.disconnect(self.on_timeout)

        print('Set progress bar value:', value)
        self.pbar.setValue(value)
        self.timer.start(timeout_msec)