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
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()
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()
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_()
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()
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
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()