Пример #1
0
def pop_up(cls,
           title,
           text,
           informative_text=None,
           connection=None,
           is_question=False,
           default_btn=QMessageBox.Yes):
    """Return a QMessageBox object.

    Keyword arguments:
    informative_text -- possible informative text to be displayed.
    connection -- a callable to connect the message when emitting the finished signal.
    is_question -- whether the message contains a question.
    default_btn -- the default button for the possible answer to the question."""
    msg = QMessageBox(cls)
    msg.setWindowTitle(title)
    msg.setText(text)
    if informative_text:
        msg.setInformativeText(informative_text)
    if connection:
        msg.finished.connect(connection)
    if is_question:
        msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        msg.setDefaultButton(default_btn)
    msg.adjustSize()
    return msg
Пример #2
0
    def monitor_shortcut(self):

        if self.rv.check_run_state():

            self.load_shortcut()

            self.sc.monitor()

        else:
            question = QMessageBox(self)
            question.setText(
                '检测到软件非正常运行,以下功能将被禁用(如有疑问,请联系开发商):<br/><ul><li>快捷键</li></ul>')
            question.setWindowTitle('限制使用模式')
            question.setIcon(QMessageBox.Warning)
            question.addButton(QMessageBox.Yes)
            # question.setButtonText(QMessageBox.Yes, QString('确定'))
            btn = question.button(QMessageBox.Yes)
            # print(btn.text())
            btn.setText('确定')
            # question.addButton('确定', QMessageBox.ButtonRole.AcceptRole)

            # print('screen x:%d,y:%d; question x:%d,y:%d.' % (screen_center.x(), screen_center.y(), question.x(), question.y()))
            # print(question.frameGeometry())
            question.adjustSize()
            screen_center = QApplication.desktop().screenGeometry()
            #居中x和y的值计算与我想的不一样
            #原因:question在exec之前无法准确的获取其size。(485,170)是exec之后的实际size。
            question.move(((screen_center.width() - 485) / 2),
                          ((screen_center.height() - 170) / 2))
            # question.move((screen_center.width() / 2 - question.width()), (screen_center.height() /2 - question.height()))
            # print('screen x:%d,y:%d; question x:%d,y:%d; question width:%d,height:%d.' % (screen_center.width(), screen_center.height(), question.geometry().width(), question.geometry().height(), question.width(), question.height()))
            # question.move(QApplication.desktop().screenGeometry().center()- self.rect().center())
            ret = question.exec()
Пример #3
0
def proceed_calculation(textboxValue_last_page, textboxValue_first_page):
    pre_result = (int(textboxValue_last_page) - int(textboxValue_first_page))
    if pre_result > 0:
        return pre_result
    else:
        try:
            raise ValueError

        except:
            msgBox = QMessageBox()
            msgBox.setText("Page cannot be negative or equal to 0!    ")
            msgBox.setWindowTitle("Value Error")
            msgBox.adjustSize()
            msgBox.setStandardButtons(QMessageBox.Ok)
            msgBox.exec()
Пример #4
0
 def complete(self) -> None:
     info = QFileInfo(self.finalFilename)
     mbox = QMessageBox(icon=self.thumbsupIcon,
                        windowTitle='VIDCUTTING COMPLETE',
                        minimumWidth=500,
                        textFormat=Qt.RichText)
     mbox.setText(
         '''
 <style>
     table.info { margin:6px; padding:4px 15px; }
     td.label { font-weight:bold; font-size:10.5pt; text-align:right; }
     td.value { font-size:10.5pt; }
 </style>
 <table class="info" cellpadding="4" cellspacing="0">
     <tr>
         <td class="label"><b>File:</b></td>
         <td class="value" nowrap>%s</td>
     </tr>
     <tr>
         <td class="label"><b>Size:</b></td>
         <td class="value">%s</td>
     </tr>
     <tr>
         <td class="label"><b>Length:</b></td>
         <td class="value">%s</td>
     </tr>
 </table><br/>''' %
         (QDir.toNativeSeparators(
             self.finalFilename), self.sizeof_fmt(int(info.size())),
          self.deltaToQTime(self.totalRuntime).toString(self.timeformat)))
     play = mbox.addButton('Play', QMessageBox.AcceptRole)
     play.setIcon(self.completePlayIcon)
     play.clicked.connect(self.openResult)
     fileman = mbox.addButton('Open', QMessageBox.AcceptRole)
     fileman.setIcon(self.completeOpenIcon)
     fileman.clicked.connect(self.openFolder)
     end = mbox.addButton('Exit', QMessageBox.AcceptRole)
     end.setIcon(self.completeExitIcon)
     end.clicked.connect(self.close)
     new = mbox.addButton('Restart', QMessageBox.AcceptRole)
     new.setIcon(self.completeRestartIcon)
     new.clicked.connect(self.parent.restart)
     mbox.setDefaultButton(new)
     mbox.setEscapeButton(new)
     mbox.adjustSize()
     mbox.exec_()
Пример #5
0
    def record(self, rtype):

        if self.recording:
            if rtype == self.record_type:
                return True

            print('检测到正在录制,录制类型将切换...')
            self.stop_record()

        if self.rv.check_device():
            #开始录制
            if rtype == RecordType.Camera:
                print('开始录制摄像头...')
                self.rv.record_camera()
            elif rtype == RecordType.Screen:
                print('开始录制屏幕...')
                self.rv.record_screen(resolution=self.screen_resolution)

            self.start_timer()
            self.update_state()
        else:
            # self.need_hide = False
            # question = QMessageBox.information(self, '提示', '检测到录制设备缺失,无法进行录制,请先完善设备设置。', QMessageBox.Yes)
            # self.need_hide = True
            question = QMessageBox()
            question.setText('检测到录制设备缺失,无法进行录制,请先完善设备设置。')
            question.setWindowTitle('提示')
            question.setIcon(QMessageBox.Question)
            question.addButton(QMessageBox.Yes)
            tmp_btn = question.button(QMessageBox.Yes)
            tmp_btn.setText('确定')

            question.adjustSize()
            screen_center = QApplication.desktop().screenGeometry()
            question.move(((screen_center.width() - question.width()) / 2),
                          ((screen_center.height() - question.height()) / 2))

            # question.addButton(QMessageBox.No)
            # question.setDefaultButton(QMessageBox.No)
            ret = question.exec()
Пример #6
0
class DataConvertGroupBox(QGroupBox):
    def __init__(self, *args):
        super(DataConvertGroupBox, self).__init__(*args)
        self.setTitle('Convert 2-theta to Q-space')
        self.setAlignment(Qt.AlignLeft)
        self.setStyleSheet(
            'GroupBox::title{subcontrol-origin: margin; subcontrol-position: top left;}'
        )
        self.setCheckable(True)
        self.setChecked(False)

        self.data_file = None
        self.two_theta_data = None

        self.load_conv_data_btn = QPushButton('2 theta Data')
        self.data_filename_lbl = QLabel('None')

        self.lambda_lbl = QLabel('Lambda: ')
        self.lambda_input = QLineEdit('')
        self.lambda_input.setValidator(QDoubleValidator())
        self.lambda_input.setMaximumWidth(60)

        self.data_filename_lbl.setAlignment(Qt.AlignCenter)
        self.save_conv_data_btn = QPushButton('Convert')

        self.outer_layout = QVBoxLayout()
        self.outer_layout.setContentsMargins(25, 25, 25, 25)
        self.outer_layout.setSpacing(10)

        self.inner_layout = QHBoxLayout()
        self.inner_layout.setContentsMargins(0, 0, 0, 0)
        self.inner_layout.setSpacing(10)

        self.outer_layout.addWidget(self.load_conv_data_btn)
        self.outer_layout.addWidget(self.data_filename_lbl)

        self.inner_layout.addWidget(self.lambda_lbl)
        self.inner_layout.addWidget(self.lambda_input)

        self.outer_layout.addLayout(self.inner_layout)
        self.outer_layout.addWidget(self.save_conv_data_btn)

        self.setLayout(self.outer_layout)

        self.create_signals()

    def create_signals(self):
        self.load_conv_data_btn.clicked.connect(self.load_two_theta)
        self.save_conv_data_btn.clicked.connect(self.save_q_space)

    def load_two_theta(self):

        __file_name = utility.get_filename(io='open',
                                           caption='Load 2-theta data file')
        if not __file_name:
            return
        self.data_file = __file_name
        try:
            self.two_theta_data = np.loadtxt(self.data_file, unpack=False)
        except ValueError:
            _message = [
                'Error loading file!',
                'Unable to load file.\nPlease check filename is correct and make sure header lines are commented (#)'
            ]
            self.error_msg = QMessageBox()
            self.error_msg.setIcon(QMessageBox.Warning)
            self.error_msg.setStandardButtons(QMessageBox.Ok)
            self.error_msg.setText(_message[0])
            self.error_msg.setInformativeText((_message[1]))
            self.error_msg.setWindowTitle(__appname__ + ' v' + __version__)
            self.error_msg.adjustSize()
            self.error_msg.show()
            self.data_file = None
            self.two_theta_data = None
            return
        self.data_filename_lbl.setText(self.data_file.split('/')[-1])
        __split_path = os.path.splitext(self.data_file)
        self.default_fname = __split_path[0] + '_qspace' + __split_path[1]

    def save_q_space(self):
        if self.data_file is None or self.two_theta_data is None:
            return
        try:
            __lambda = np.float(self.lambda_input.text())
        # Return if no wavelength set
        except ValueError:
            _message = ['No Wavelength Set!', 'Please set wavelength value']
            self.error_msg = QMessageBox()
            self.error_msg.setIcon(QMessageBox.Warning)
            self.error_msg.setStandardButtons(QMessageBox.Ok)
            self.error_msg.setText(_message[0])
            self.error_msg.setInformativeText((_message[1]))
            self.error_msg.setWindowTitle(__appname__ + ' v' + __version__)
            self.error_msg.adjustSize()
            self.error_msg.show()
            return
        try:
            # Get out filename
            self.convert_filename = utility.get_filename(
                io='save',
                caption='Save Q-space Data',
                directory=self.default_fname)
        except NameError:
            return
        if not self.convert_filename:
            return
        # Convert 2theta data
        __q_data = data_utils.convert_two_theta(self.two_theta_data[0],
                                                __lambda)
        __out_data = np.column_stack((__q_data, self.two_theta_data[1]))
        np.savetxt(self.convert_filename, __out_data)
        # Message user success
        self.success_msg = QMessageBox()
        self.success_msg.setIcon(QMessageBox.Information)
        self.success_msg.setStandardButtons(QMessageBox.Ok)
        self.success_msg.setText('Data converted to Q-Space!')
        self.success_msg.setInformativeText(
            ('Lambda: ' + str(__lambda) + '\nConverted data: ' +
             self.convert_filename))
        self.success_msg.setWindowTitle(__appname__ + ' v' + __version__)
        self.success_msg.adjustSize()
        self.success_msg.show()
        # Clear variables
        del __lambda, __q_data, __out_data, self.convert_filename
Пример #7
0
class BkgUI(QWidget):

    # plots_changed is handled in main_widget.MainContainer and allows the
    # next tab to be updated
    plots_changed = pyqtSignal()
    # file_name_changed connects to main_widget.MainContainer.update_filename
    # this method is used to set the working directory based on the data_file
    # that is loaded
    file_name_changed = pyqtSignal()

    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.layout = QHBoxLayout(self)
        self.layout.setSpacing(0)

        # Make Config Widget
        self.bkg_config_widget = BkgConfigWidget()
        self.config_scroll_area = QScrollArea()
        self.config_scroll_area.setFrameShape(QFrame.NoFrame)
        self.config_scroll_area.setWidget(self.bkg_config_widget)
        self.config_scroll_area.setWidgetResizable(True)

        # Make vertical line separator
        self.vline = QFrame()
        self.vline.setFrameShape(QFrame.VLine)
        self.vline.setFrameShadow(QFrame.Sunken)
        self.vline.setObjectName("vline")

        # Make Plot Widget
        self.bkg_plot_widget = plot_widgets.BkgPlotWidget()
        self.plot_scroll_area = QScrollArea()
        self.plot_scroll_area.setWidget(self.bkg_plot_widget)
        self.plot_scroll_area.setWidgetResizable(True)
        self.plot_scroll_area.setFrameShape(QFrame.NoFrame)

        self.hsplitter = QSplitter(Qt.Horizontal)
        self.hsplitter.addWidget(self.config_scroll_area)
        self.hsplitter.addWidget(self.plot_scroll_area)
        self.hsplitter.setStretchFactor(0, 2)
        self.hsplitter.setStretchFactor(1, 5)
        self.layout.addWidget(self.hsplitter)

        # Could add a separate scroll area > test on dif. screen sizes
        # self.layout.addWidget(self.config_scroll_area)
        # self.layout.addWidget(self.vline)
        # self.layout.addWidget(QWidget())
        # self.layout.addWidget(self.plot_scroll_area)

        # Similarly could manually set stretch > test on dif. screens
        # self.layout.setStretch(0,1)
        # self.layout.setStretch(1,0)
        # self.layout.setStretch(2,5)

        self.setLayout(self.layout)

        self.data_file = os.path.abspath(os.getcwd())
        self.file_name_changed.emit()

        __a = np.asarray([])
        self.data = {
            'data_raw_x': __a,
            'data_raw_y': __a,
            'data_x': __a,
            'data_y': __a,
            'bkg_raw_x': __a,
            'bkg_raw_y': __a,
            'bkg_x': __a,
            'bkg_y': __a,
            'bkg_y_sc': __a,
            'bkg_raw_y_sc': __a,
            'cor_x': __a,
            'cor_y': __a
        }
        self.bkg_file = None
        self.data_file = None

        self.create_signals()

    def create_signals(self):
        self.bkg_config_widget.data_files_gb.load_data_btn.clicked.connect(
            self.load_data)
        self.bkg_config_widget.data_files_gb.load_bkg_btn.clicked.connect(
            self.load_bkg)
        self.bkg_config_widget.data_files_gb.plot_raw_check.stateChanged.connect(
            self.plot_data)
        self.bkg_config_widget.bkg_subtract_gb.bkg_sub_btn.clicked.connect(
            self.sub_bkg)
        self.bkg_config_widget.bkg_subtract_gb.scale_sb.valueChanged.connect(
            self.plot_data)
        self.bkg_config_widget.bkg_subtract_gb.toggled.connect(self.sub_bkg)
        self.bkg_config_widget.bkg_subtract_gb.auto_sc_btn.clicked.connect(
            self.auto_scale_bkg)
        self.bkg_config_widget.data_files_gb.dq_input.editingFinished.connect(
            self.dq_changed)

    def rebin_data(self, bkg='check'):
        '''
        Helper function to rebin background/data arrays when necessary.
        Because the S(Q) array is padded before fourier transform operations
        in core.core the size should be checked here. Checking takes place
        before rebinning as this could hang on very large files.
        '''
        try:
            _dx = np.float(
                self.bkg_config_widget.data_files_gb.dq_input.text())
        except ValueError:
            _dx = 0
        if bkg == 1:
            if self.data['bkg_raw_x'][-1] > ((2**self.fft_N / 2) * _dx):
                raise RuntimeWarning('Dataset size exceeds 2**N!')
            self.data['bkg_x'], self.data['bkg_y'] = data_utils.rebin_data(
                self.data['bkg_raw_x'], self.data['bkg_raw_y'], dx=_dx)
            self.plot_data()

        elif bkg == 0:
            if self.data['data_raw_x'][-1] > ((2**self.fft_N / 2) * _dx):
                raise RuntimeWarning('Dataset size exceeds 2**N!')
            self.data['data_x'], self.data['data_y'] = data_utils.rebin_data(
                self.data['data_raw_x'], self.data['data_raw_y'], dx=_dx)
            # Delete any processed data when loading new file
            self.data['cor_x'] = np.asarray([])
            self.data['cor_y'] = np.asarray([])
            if not self.bkg_config_widget.bkg_subtract_gb.isChecked():
                self.sub_bkg()
            self.plots_changed.emit()
            self.plot_data()

        elif bkg == 'check':
            if self.data['bkg_raw_x'].size and self.bkg_file != None:
                self.rebin_data(bkg=1)
            if self.data['data_raw_x'].size and self.data_file != None:
                self.rebin_data(bkg=0)

    def load_data(self):
        __file_name = utility.get_filename(io='open')
        if __file_name:
            self.data_file = __file_name
        else:
            return
        try:
            self.data['data_raw_x'], self.data['data_raw_y'] = np.loadtxt(
                self.data_file, unpack=True)
            # Convert to angstroms if data_units == 1 (nm)
            if self.data_units:
                self.data['data_raw_x'] /= 10.0
        except ValueError:
            self.data_file = None
            self.load_file_error()
            return
        try:
            self.rebin_data(bkg=0)
        except RuntimeWarning:
            self.oversize_file_error()
            self.data_file = None
            return
        self.bkg_config_widget.data_files_gb.data_filename_lbl.setText(
            self.data_file.split('/')[-1])
        print(f'Data file: {self.data_file}')
        self.file_name_changed.emit()

    def load_bkg(self):
        __file_name = utility.get_filename(io='open',
                                           caption='Load Background File')
        if __file_name:
            self.bkg_file = __file_name
        else:
            return
        try:
            self.data['bkg_raw_x'], self.data['bkg_raw_y'] = np.loadtxt(
                self.bkg_file, unpack=True)
            if self.data_units:
                self.data['bkg_raw_x'] /= 10.0
        except ValueError:
            self.bkg_file = None
            self.load_file_error()
            return
        try:
            self.rebin_data(bkg=1)
        except RuntimeWarning:
            self.oversize_file_error()
            self.bkg_file = None
            return
        self.bkg_config_widget.data_files_gb.bkg_filename_lbl.setText(
            self.bkg_file.split('/')[-1])
        print(f'Background File: {self.bkg_file}')

    def plot_data(self):
        if self.data['bkg_y'].size:
            # First scale bkg data
            _bkg_scaling = self.bkg_config_widget.bkg_subtract_gb.scale_sb.value(
            )
            self.data['bkg_raw_y_sc'] = self.data['bkg_raw_y'] * _bkg_scaling
            self.data['bkg_y_sc'] = self.data['bkg_y'] * _bkg_scaling
        if self.data['cor_x'].size:
            # Only re-subtract if already subtract button clicked
            if self.bkg_config_widget.bkg_subtract_gb.isChecked(
            ) and self.bkg_file is not None:
                # Subtract background from raw data if option chosen
                try:
                    self.data[
                        'cor_y'] = self.data['data_y'] - self.data['bkg_y_sc']
                except ValueError:
                    self.bkg_match_error()
                    return
            else:
                self.data['cor_y'] = self.data['data_y']
        if self.bkg_config_widget.data_files_gb.plot_raw_check.isChecked():
            _plot_raw = 1
        else:
            _plot_raw = 0
        self.bkg_plot_widget.update_plots(self.data, _plot_raw)
        # emit signal that data has changed to be picked up by tab2
        self.plots_changed.emit()

    def sub_bkg(self):
        # Cor x = data x
        self.data['cor_x'] = self.data['data_x']
        self.plot_data()

    def auto_scale_bkg(self):
        if self.bkg_file is None:
            self.missing_bkg_file_error()
            return
        if len(self.data['data_y']) != len(self.data['bkg_y']):
            self.bkg_match_error()
            return
        bkg_scaling = minimize(data_utils.bkg_scaling_residual,
                               1,
                               args=(self.data['data_y'], self.data['bkg_y']),
                               method='nelder-mead',
                               options={
                                   'xtol': 1e-8,
                                   'disp': False
                               })
        bkg_scaling = bkg_scaling.x
        self.bkg_config_widget.bkg_subtract_gb.scale_sb.setValue(bkg_scaling)

    def dq_changed(self):
        try:
            self.rebin_data()
        except RuntimeWarning:
            self.dq_error()
            self.bkg_config_widget.data_files_gb.dq_input.setText('0.02')
            self.dq_changed()

    def load_file_error(self):
        message = [
            'Error loading file!',
            'Unable to load file.\nPlease check filename,\nensure header lines are commented (#),\nand data is in Q-space'
        ]
        self.warning_message(message)

    def oversize_file_error(self):
        message = [
            'Error loading file!',
            'Re-binned array size\nis too large! Check the data-units preferences setting, increase the Q-step or increase length of Fourier transform array (N)'
        ]
        self.warning_message(message)

    def missing_bkg_file_error(self):
        message = ['No background file!', 'Please load a background file']
        self.warning_message(message)

    def bkg_match_error(self):
        message = [
            'Error subtracting background!',
            'Data and background\n do not match!'
        ]
        self.warning_message(message)

    def dq_error(self):
        message = [
            'Error setting Q-step!',
            'Re-binned array size\nis too large! Increase the Q-step or length of Fourier transform array (N)'
        ]
        self.warning_message(message)

    def warning_message(self, message):
        self.error_msg = QMessageBox()
        self.error_msg.setIcon(QMessageBox.Warning)
        self.error_msg.setStandardButtons(QMessageBox.Ok)
        self.error_msg.setText(message[0])
        self.error_msg.setInformativeText((message[1]))
        self.error_msg.setWindowTitle(__appname__ + ' v' + __version__)
        self.error_msg.adjustSize()
        self.error_msg.show()