コード例 #1
0
ファイル: chrono.py プロジェクト: Almazys/chrono
    def createDurationDialog(self):
        popup = QDialog(self)
        popup.setFixedSize(150, 150)
        popup.setWindowTitle("Nouvelle durée")
        layout = QVBoxLayout()

        hourLayout = QHBoxLayout()
        hourLabel = QLabel("Heures:")
        hourSpin = QSpinBox()
        hourLayout.addWidget(hourLabel)
        hourLayout.addWidget(hourSpin)

        minuteLayout = QHBoxLayout()
        minuteLabel = QLabel("Minutes:")
        minuteSpin = QSpinBox()
        minuteLayout.addWidget(minuteLabel)
        minuteLayout.addWidget(minuteSpin)

        secondLayout = QHBoxLayout()
        secondLabel = QLabel("Secondes:")
        secondSpin = QSpinBox()
        secondLayout.addWidget(secondLabel)
        secondLayout.addWidget(secondSpin)

        layout.addLayout(hourLayout)
        layout.addLayout(minuteLayout)
        layout.addLayout(secondLayout)

        button = QPushButton("Ok")
        button.clicked.connect(lambda: self.createDuration(
            popup, hourSpin.value(), minuteSpin.value(), secondSpin.value()))
        layout.addWidget(button)

        popup.setLayout(layout)
        popup.exec_()
コード例 #2
0
ファイル: chrono.py プロジェクト: Almazys/chrono
    def createNotificationPopup(self):
        popup = QDialog(self)
        popup.setFixedSize(popup.sizeHint().height(), popup.sizeHint().width())
        popup.setWindowTitle("Évènements")
        innerLayout = QVBoxLayout()

        GroupBox = QGroupBox("Activer les notifications")
        GroupBox.setCheckable(True)
        GroupBox.setChecked(self.notification)

        checkBox_popup = QCheckBox("Afficher une popup")
        checkBox_notification = QCheckBox("Afficher une notification")
        checkBox_sound = QCheckBox("Jouer un son")

        if self.notification_popup:
            checkBox_popup.setCheckState(Qt.Checked)
        if self.notification_tray:
            checkBox_notification.setCheckState(Qt.Checked)
        if self.notification_sound:
            checkBox_sound.setCheckState(Qt.Checked)

        innerLayout.addWidget(checkBox_popup)
        innerLayout.addWidget(checkBox_notification)
        innerLayout.addWidget(checkBox_sound)
        innerLayout.addStretch(1)
        GroupBox.setLayout(innerLayout)

        button = QPushButton("Ok")
        button.clicked.connect(lambda: self.changeNotificationSettings(
            popup, GroupBox, checkBox_popup, checkBox_notification,
            checkBox_sound))

        outerLayout = QVBoxLayout()
        outerLayout.addWidget(GroupBox)
        outerLayout.addWidget(button)
        popup.setLayout(outerLayout)

        popup.exec_()
コード例 #3
0
ファイル: chrono.py プロジェクト: Almazys/chrono
    def createDateDialog(self):
        popup = QDialog(self)
        popup.setFixedSize(270, 60)
        popup.setWindowTitle("Nouvelle date")
        layout = QHBoxLayout()

        prefix = QLabel("Heure cible: ")
        layout.addWidget(prefix)

        qline = QTimeEdit()
        qline.setDisplayFormat("hh:mm:ss")
        qline.setTime(QTime.currentTime())
        layout.addWidget(qline)

        button = QPushButton("Ok")
        button.clicked.connect(lambda: self.createDate(popup,
                                                       qline.time().hour(),
                                                       qline.time().minute(),
                                                       qline.time().second()))

        layout.addWidget(button)

        popup.setLayout(layout)
        popup.exec_()
コード例 #4
0
def snip(bounding_box=None,
         file_name_pattern=DEFAULT_OUTPUT_FILE_NAME_PATTERN,
         override=False,
         show_time=1000,
         assign_description=0):
    """ Snip screen image and save it to file.

    :param bounding_box: [tuple] The image rectangle in screen, formatted in (left, upper, width, height).
    :param file_name_pattern: [string] The file name pattern (absolute path or relative path to this python script file). For example: "ScreenSnippingImages/ScreenSnippingImage_%Y-%m-%d_%H-%M-%S.png".
    :param override: [bool] Whether to override the output file if it exists before.
    :param show_time: [int] Milliseconds time to show the screen image (if 0, the image won't be shown).
    :param assign_description: [int] Whether to assign description to the screen image (1 for manually input, 2 for OCR, others for no description).
    """

    logging.info("Started snipping screen.")

    screen_image = get_screen_image(bounding_box=bounding_box)
    file_name = save_image(image=screen_image,
                           file_name_pattern=file_name_pattern,
                           override=override)

    if file_name:
        logging.info(
            "Screen image has been saved in file: {}".format(file_name))

        if show_time > 0:
            image_dialog = QDialog()
            image_dialog.setWindowTitle(APP_DESCRIPTION + " " + APP_VERSION)
            image_dialog.setWindowFlags(Qt.WindowStaysOnTopHint)
            image_dialog.setFixedSize(640, 360)
            image_dialog.setContentsMargins(0, 0, 0, 0)
            image_label = QLabel()
            image_dialog_layout = QGridLayout(image_dialog)
            image_dialog_layout.setContentsMargins(0, 0, 0, 0)
            image_dialog_layout.addWidget(image_label)
            image_label.setPixmap(screen_image)
            image_label.setScaledContents(True)
            QTimer().singleShot(10, image_dialog.activateWindow)
            QTimer().singleShot(show_time, image_dialog.close)
            image_dialog.exec()

            if assign_description == 1:
                description_input_dialog = QInputDialog()
                description_input_dialog.setWindowTitle(APP_DESCRIPTION + " " +
                                                        APP_VERSION)
                description_input_dialog.setWindowFlags(
                    Qt.WindowStaysOnTopHint)
                description_input_dialog.setFixedSize(400, 200)
                description_input_dialog.setInputMode(
                    description_input_dialog.TextInput)
                description_input_dialog.setLabelText(
                    "Please input description:")
                QTimer().singleShot(10,
                                    description_input_dialog.activateWindow)
                description_input_dialog.exec()
                description = description_input_dialog.textValue()
                if description:
                    description_file_name = file_name + ".txt"
                    with open(description_file_name, "w") as file:
                        file.write(description)
                    logging.info(
                        "Assigned a description for screen image file: {}".
                        format(file_name))
                    logging.debug("Description: {}".format(description))
            elif assign_description == 2:
                import pytesseract
                text_from_image = pytesseract.image_to_string(
                    Image.open(file_name))
                description_file_name = file_name + "-OCR.txt"
                with open(description_file_name, "w") as file:
                    file.write(text_from_image)
                os.startfile(description_file_name)
            else:
                pass
    else:
        logging.error("Error occurred.")
コード例 #5
0
class DDMWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.ConfigSettings()
        self.init_themes_main()

        self.MainMenuItems()

        self.MenuCreate()

        self.WindowSettings()
        self.show()

    def download_Cache(self):
        self.list_widget.clear()
        for i in getData():
            items = QListWidgetItem(i[0], self.list_widget)

    def download_CacheDelete(self):
        try:
            name = self.list_widget.currentItem().text()
            #print(f"Removing {name}")
            for i in getData():
                if name in i:
                    fname = i
                    break
            delData(name, fname[1], fname[2])
            myfile = Path(f"{fname[1]}/{fname[2]}")
            print(myfile)
            if myfile.exists():
                if self.sel_lang == "tr":
                    dosya_silme = QMessageBox.warning(
                        self, "Dosyayı Sil",
                        "Dosyayı diskten silmeli miyiz?\n\nDiskten silmek için evete basın!",
                        QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
                elif self.sel_lang == "en":
                    dosya_silme = QMessageBox.warning(
                        self, "Delete File",
                        "Should we delete file from disk?\n\nTo delete file from disk press yes!",
                        QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
                if dosya_silme == QMessageBox.Yes:
                    try:
                        myfile.unlink()
                        if self.sel_lang == "tr":
                            dosya_silme = QMessageBox.information(
                                self, "Dosya Silindi",
                                "Dosya Başarıyla Silindi!", QMessageBox.Ok,
                                QMessageBox.Ok)
                        elif self.sel_lang == "en":
                            dosya_silme = QMessageBox.information(
                                self, "File Deleted",
                                "File Succesfuly Deleted!", QMessageBox.Ok,
                                QMessageBox.Ok)
                    except Exception as e:
                        print(e)
                elif dosya_silme == QMessageBox.No:
                    pass
            self.download_Cache()
        except Exception as e:
            print(e)

    def slideLeftMenu(self):
        width = self.left_side_menu.width()

        if width == 50:
            newWidth = 150
        else:
            newWidth = 50

        self.animation = QPropertyAnimation(self.left_side_menu,
                                            b"minimumWidth")
        self.animation.setDuration(250)
        self.animation.setStartValue(width)
        self.animation.setEndValue(newWidth)
        self.animation.setEasingCurve(QtCore.QEasingCurve.InOutQuart)
        self.animation.start()

    def Add_Download(self):
        self.add_download_dialog = QDialog()

        self.add_download_dialog.setWindowTitle("Add_Download")
        # self.setWindowIcon(QIcon("logo.png"))
        self.init_themes_add_dialog()
        self.add_download_dialog.setFixedSize(325, 275)
        self.add_download_dialog.setMinimumSize(325, 240)

        self.isim = QLabel("İndir", self.add_download_dialog)
        self.isim.setFont(QFont("Hack Nerd Font", 15))
        self.isim.setGeometry(124, 13, 125, 34)

        # İlerleme/Progress
        # self.progressBar =

        # URL KUTUSU
        self.urlbox = QLineEdit("", self.add_download_dialog)
        # self.urlbox.setFixedSize(100,4)
        self.urlbox.setGeometry(35, 60, 250, 34)
        self.urlbox.setPlaceholderText("URL Gir")
        self.urlbox.setFont(QFont("Hack Nerd Font", 11))

        # INDIRME KONUMU
        self.downdirectory = QLineEdit(str(Path.home()),
                                       self.add_download_dialog)
        self.downdirectory.setGeometry(35, 100, 210, 34)
        self.downdirectory.setPlaceholderText("İndirilecek Konum")
        self.downdirectory.setFont(QFont("Hack Nerd Font", 11))

        # Dosya İsmi
        self.enterfilename = QLineEdit("", self.add_download_dialog)
        # self.filename.setFixedSize(100,4)
        self.enterfilename.setGeometry(35, 140, 210, 34)
        self.enterfilename.setPlaceholderText("Dosya İsmi(Opsiyonel)")
        self.enterfilename.setFont(QFont("Hack Nerd Font", 11))

        def connectfilename():
            fnameloop = asyncio.get_event_loop()
            fnameloop.run_until_complete(self.detect_fname())

        self.connectfilename = QPushButton(".", self.add_download_dialog)
        self.connectfilename.setGeometry(249, 140, 36, 34)
        self.connectfilename.setFont(QFont("Hack Nerd Font", 11))
        self.connectfilename.clicked.connect(connectfilename)

        # KONUM SEÇ BUTONU
        def download_dir():
            if self.sel_lang == "tr":
                try:
                    self.dirselectdialog = QFileDialog.getExistingDirectory(
                        self.add_download_dialog, 'İndirilecek Konumu Seç')
                except Exception as e:
                    print(e)
            elif self.sel_lang == "en":
                try:
                    self.dirselectdialog = QFileDialog.getExistingDirectory(
                        self.add_download_dialog, 'Select Dir')
                except Exception as e:
                    print(e)
            if self.dirselectdialog == "":
                self.downdirectory.setText(str(Path.home()))
            else:
                self.downdirectory.setText(str(self.dirselectdialog))

        self.selectdirbutton = QPushButton("...", self.add_download_dialog)
        self.selectdirbutton.setGeometry(249, 100, 36, 34)
        self.selectdirbutton.setFont(QFont("Hack Nerd Font", 11))
        self.selectdirbutton.clicked.connect(download_dir)

        # ProgressBar/İlerleme
        self.progressbar = QProgressBar(self.add_download_dialog)
        self.progressbar.setGeometry(35, 180, 250, 34)
        self.progressbar.setValue(0)

        # self.progressbar.hide()

        # INDIR BUTONU

        def start_downloading_process():
            url = str(self.urlbox.text())
            if url == "":
                if self.sel_lang == "tr":
                    self.urlboxempty = QMessageBox.warning(
                        self.add_download_dialog, "URL Kutusu Boş",
                        "Lütfen bir url giriniz!", QMessageBox.Ok,
                        QMessageBox.Ok)
                elif self.sel_lang == "en":
                    self.urlboxempty = QMessageBox.warning(
                        self.add_download_dialog, "URL Box Empty",
                        "Please enter a URL!", QMessageBox.Ok, QMessageBox.Ok)
            else:
                # self.add_download_dialog.close()
                # self.downloading_file()
                # self.add_download_dialog.close()
                self.download()

        self.downloadbutton = QPushButton("İndir", self.add_download_dialog)
        self.downloadbutton.setGeometry(85, 220, 70, 40)
        self.downloadbutton.setFont(QFont("Hack Nerd Font", 11))
        self.downloadbutton.clicked.connect(start_downloading_process)
        # self.downloadbutton.setStyleSheet("background-color: #268bd2;")

        # ÇIKIŞ BUTONU
        self.iptalbutton = QPushButton("İptal", self.add_download_dialog)
        self.iptalbutton.setGeometry(160, 220, 70, 40)
        self.iptalbutton.setFont(QFont("Hack Nerd Font", 11))
        self.iptalbutton.clicked.connect(self.add_download_dialog.close)
        # self.iptalbutton.setStyleSheet("background-color: #ed0b0b;")
        self.reTranslateAddDownload()
        self.add_download_dialog.show()

    # def downloading_file(self):
    #    self.downloading_dialog = QDialog()
    #    self.init_themes_add_dialog()
    #    self.downloading_dialog.setFixedSize(240, 240)
    #    #self.downloading_dialog.setMinimumSize(325, 240)

    # self.downloading_dialog.exec()
    def reTranslateAddDownload(self):
        if self.sel_lang == "en":
            self.isim.setText("Download")
            self.isim.setGeometry(110, 13, 125, 34)

            self.downloadbutton.setText("Download")
            self.downloadbutton.setGeometry(65, 220, 90, 40)

            self.iptalbutton.setText("Cancel")

            self.enterfilename.setPlaceholderText("File Name(Optional)")
            self.downdirectory.setPlaceholderText("Enter Directory")
            self.urlbox.setPlaceholderText("Enter the URL")

    def eventFilter(self, source, event):
        try:
            if (event.type() == QtCore.QEvent.ContextMenu
                    and source is self.list_widget):
                try:
                    self.menu = QMenu()
                    self.menu.addAction('In Future')
                    if self.menu.exec_(event.globalPos()):
                        item = source.itemAt(event.pos())
                        print(item.text())
                    return True
                except Exception as e:
                    print(e)
            return super().eventFilter(source, event)
        except Exception as e:
            print(e)

    from mainUI import MainMenuItems
    from mainUI import reTranslateMain

    from download_script import detect_fname
    from download_script import detect_fsize
    from download_script import check_connection
    from download_script import download

    # MenuBar things
    from MenuBar import exitAction
    from MenuBar import MenuCreate

    from MenuBar import about
    from MenuBar import reTranslateAbout

    from MenuBar import SettingsMenu
    from MenuBar import SetSettings
    from MenuBar import restartforsettings
    from MenuBar import reTranslateSettings

    # Theming Things
    from theming import init_themes_main
    from theming import init_themes_add_dialog
    from theming import init_themes_settings_dialog
    from theming import init_themes_about_dialog

    def WindowSettings(self):
        self.setWindowTitle("Dream Download Manager")
        # self.setWindowIcon(QIcon("logo.png"))

        #self.setFixedSize(485, 375)
        #self.setMinimumSize(325, 240)

    def ConfigSettings(self):
        self.settings = QSettings("DDM", "DreamDownloadManager")
        print(self.settings.fileName())
        if self.settings.contains('theme_selection'):
            self.selected_theme = self.settings.value('theme_selection')
        else:
            self.settings.setValue('theme_selection', 'Dark')

        if self.settings.contains('selected_lang'):
            self.sel_lang = self.settings.value('selected_lang')
        else:
            self.settings.setValue('selected_lang', 'en')
コード例 #6
0
class DatePicker(QWidget):

    selectionChanged = Signal()

    def __init__(self, parent=None):
        super(DatePicker, self).__init__(parent)
        self.button = QPushButton(self)
        icon = QIcon("logo.svg")
        self.button.setIcon(icon)
        self.setFixedSize(32, 32)
        self.button.setFixedSize(32, 32)
        self.button.setIconSize(QSize(22, 22))

        self.__margin__ = 5

        self.dialog = QDialog()
        self.dialog.setWindowFlags(Qt.Window | Qt.FramelessWindowHint
                                   | Qt.Popup)
        self.dialog.setFixedSize(480, 240)
        self.dialog.setLayout(QHBoxLayout())
        self.calender = QCalendarWidget(self)
        self.dialog.layout().addWidget(self.calender)
        self.dialog.layout().setContentsMargins(0, 0, 0, 0)
        self.dialog.layout().setSpacing(0)

        self.button.clicked.connect(self, SLOT("showCalender()"))

        self.calender.selectionChanged.connect(self.__emitSelectionChanged__)

    @Slot()
    def showCalender(self):
        print('in show')

        p = self.mapToGlobal(QPoint(0, self.height() + self.__margin__))

        self.dialog.setGeometry(p.x(), p.y(), 0, 0)
        self.dialog.show()

    def setIcon(self, icon):
        if type(icon) is QIcon:
            self.button.setIcon(icon)
        elif type(icon) is str:
            self.button.setIcon(QIcon(icon))
        else:
            raise Exception(
                'Wrong argument type, icon should be either PySide2.QtGui.QIcon or str "string"'
            )

    def icon(self):
        return self.button.icon()

    def setIconSize(self, iconsize):
        if type(iconsize) is QSize:
            self.button.setIconSize(iconsize)
        elif type(iconsize) is int:
            self.button.setIcon(QSize(iconsize, iconsize))
        elif type(type) is iter:
            import collections
            if isinstance(iconsize, collections.Iterable):
                if len(iconsize) == 1:
                    self.setIconSize(iconsize[0])
                elif len(iconsize) == 2:
                    self.setIconSize(QSize(iconsize[0], iconsize[1]))
                else:
                    raise Exception()
        else:
            raise Exception(
                "Wrong argument type, iconSize should be either PySide2.QtCore.QSize or int value or width and height "
                "or iterable contains one QSize, one int or two int values for width and height respectively"
            )

    def iconSize(self):
        return self.button.iconSize()

    def setFirstDayOfWeek(self, dayOfWeek):
        if type(dayOfWeek) is Qt.DayOfWeek:
            self.calender.setFirstDayOfWeek(dayOfWeek)
        elif type(dayOfWeek) is int:
            if dayOfWeek < 1 or dayOfWeek > 7:
                raise Exception(
                    "Wrong argument, dayOfWeek should be from 1 to 7 (Monday --> Sunday)"
                )
            self.calender.setFirstDayOfWeek(Qt.DayOfWeek(dayOfWeek))
        else:
            raise Exception(
                "Wrong type, dayOfWeek should be either PySide2.QtCore.Qt.DayOf or int (1 --> 7) (Monday --> Sunday)"
            )

    def firstDayOfWeek(self):
        self.calender.firstDayOfWeek()

    def selectedDate(self):

        self.calender.selectedDate()

    def setSelectedDate(self, args, kwargs):
        self.calender.setSelectedDate(args, kwargs)

    def minimumDate(self):
        self.calender.minimumDate()

    def setMinimumDate(self):
        self.calender.setMinimumDate()

    def selectedDate(self):

        return self.calender.selectedDate()

    def __emitSelectionChanged__(self):
        self.selectionChanged.emit()
コード例 #7
0
class ADBHelper(object):
    # 构造函数
    def __init__(self):
        # 加载UI文件
        self.ui = QUiLoader().load('adbwindow.ui')
        # 设置窗口背景
        palette = QPalette()
        pix = QPixmap('bg.jpg')
        #pix = pix.scaled(self.ui.width(), self.ui.height())
        palette.setBrush(self.ui.backgroundRole(), QBrush(pix))
        self.ui.setAutoFillBackground(True)
        self.ui.setPalette(palette)

        self.ui.setWindowIcon(QIcon('adb.png'))
        # self.ui.setWindowFlags(qcore.Qt.WindowStaysOnTopHint)

        # 绑定保存参数菜单项点击事件
        self.ui.save_action.triggered.connect(self.save_params)
        # 绑定加载参数菜单项点击事件
        self.ui.load_action.triggered.connect(self.load_params)
        # 绑定退出菜单项点击事件
        self.ui.exit_action.triggered.connect(self.exit)
        # 绑定断开连接菜单项点击事件
        self.ui.disconnect_action.triggered.connect(self.disconnect)
        # 绑定清空输出信息菜单项点击事件
        self.ui.clear_action.triggered.connect(self.clear)
        # 绑定坐标工具菜单项点击事件
        self.ui.tool_action.triggered.connect(self.tool)
        # 绑定关于菜单项点击事件
        self.ui.about_action.triggered.connect(self.about)

        # 绑定启动ADB按钮点击事件
        self.ui.openadb_pushButton.clicked.connect(self.open_adb)
        # 绑定连接按钮点击事件
        self.ui.connect_pushButton.clicked.connect(self.connect)
        # 绑定显示设备列表按钮点击事件
        self.ui.show_devices_pushButton.clicked.connect(self.show_devices)
        # 绑定开始点击按钮点击事件
        self.ui.tap_pushButton.clicked.connect(self.tap)
        # 绑定开始滑屏按钮点击事件
        self.ui.swipe_pushButton.clicked.connect(self.swipe)
        # 绑定停止按钮点击事件
        self.ui.stop_pushButton.clicked.connect(self.stop)
        # 绑定坐标工具按钮点击事件
        self.ui.tool_pushButton.clicked.connect(self.tool)

        # 限制数值范围
        self.ui.swipe_x1_min_spinBox.valueChanged.connect(self.x1_min)
        self.ui.swipe_x1_max_spinBox.valueChanged.connect(self.x1_max)
        self.ui.swipe_y1_min_spinBox.valueChanged.connect(self.y1_min)
        self.ui.swipe_y1_max_spinBox.valueChanged.connect(self.y1_max)
        self.ui.swipe_x2_min_spinBox.valueChanged.connect(self.x2_min)
        self.ui.swipe_x2_max_spinBox.valueChanged.connect(self.x2_max)
        self.ui.swipe_y2_min_spinBox.valueChanged.connect(self.y2_min)
        self.ui.swipe_y2_max_spinBox.valueChanged.connect(self.y2_max)

        # ADB工具
        self.adbtool = None
        # 连接标志
        self.connected = False
        # 坐标工具窗口
        self.tool_dialog = None
        # 截图文件
        self.screen_cap_file = None

    # 当前时间
    def nowtime(self):
        return str(
            _time.strftime('%Y-%m-%d %H:%M:%S', _time.localtime(_time.time())))

    # 输出信息
    def output_message(self, message):
        mess = "<font color='orange'>[</font><font color='blue'>"+self.nowtime() + \
            "</font><font color='orange'>]</font><font color='green'>"+message+"</font>"
        self.ui.output_textEdit.append(mess)
        # 移动光标到最底
        self.ui.output_textEdit.moveCursor(QTextCursor.End)

    # 输出结果和错误信息
    def output_result_error(self, result, error):
        # 输出信息
        self.output_message(result)
        # 判断错误信息是否为空
        if len(error.strip()) != 0:
            self.output_message(error)

    # 保存参数
    def save_params(self):
        # 弹出文件选择器
        filepath, filetype = QFileDialog.getSaveFileName(
            self.ui, "保存参数", os.getcwd(), "Json File (*.json)")

        # 判断
        if filepath != "":
            # IP地址
            ip = self.ui.ip_lineEdit.text()
            # 端口号
            port = self.ui.port_spinBox.value()
            # 模拟点击
            tap_x = self.ui.tap_x_spinBox.value()
            tap_y = self.ui.tap_y_spinBox.value()
            tap_times = self.ui.tap_times_spinBox.value()
            tap_interval = round(self.ui.tap_interval_doubleSpinBox.value(), 1)
            tap_random_interval = self.ui.tap_random_interval_checkBox.isChecked(
            )
            # 模拟滑屏
            swipe_x1_min = self.ui.swipe_x1_min_spinBox.value()
            swipe_x1_max = self.ui.swipe_x1_max_spinBox.value()
            swipe_y1_min = self.ui.swipe_y1_min_spinBox.value()
            swipe_y1_max = self.ui.swipe_y1_max_spinBox.value()
            swipe_x2_min = self.ui.swipe_x2_min_spinBox.value()
            swipe_x2_max = self.ui.swipe_x2_max_spinBox.value()
            swipe_y2_min = self.ui.swipe_y2_min_spinBox.value()
            swipe_y2_max = self.ui.swipe_y2_max_spinBox.value()
            swipe_times = self.ui.swipe_times_spinBox.value()
            # 浮点数取整
            swipe_interval = round(
                self.ui.swipe_interval_doubleSpinBox.value(), 1)
            swipe_random_interval = self.ui.swipe_random_interval_checkBox.isChecked(
            )
            swipe_60 = self.ui.swipe_60_checkBox.isChecked()
            # 组成字典
            params = {
                'ip': ip,
                'port': port,
                'tap_x': tap_x,
                'tap_y': tap_y,
                'tap_times': tap_times,
                'tap_interval': tap_interval,
                'tap_random_interval': tap_random_interval,
                'swipe_x1_min': swipe_x1_min,
                'swipe_x1_max': swipe_x1_max,
                'swipe_y1_min': swipe_y1_min,
                'swipe_y1_max': swipe_y1_max,
                'swipe_x2_min': swipe_x2_min,
                'swipe_x2_max': swipe_x2_max,
                'swipe_y2_min': swipe_y2_min,
                'swipe_y2_max': swipe_y2_max,
                'swipe_times': swipe_times,
                'swipe_interval': swipe_interval,
                'swipe_random_interval': swipe_random_interval,
                'swipe_60': swipe_60
            }
            # 写入文件
            if not filepath.endswith('.json'):
                filepath = filepath + '.json'
            with open(filepath, 'w', encoding='utf-8') as f:
                json.dump(params, f)
            # 输出信息
            self.output_message('保存参数完成!文件路径:' + os.path.abspath(filepath))

    # 加载参数
    def load_params(self):
        # 弹出文件选择器
        filepath, filetype = QFileDialog.getOpenFileName(
            self.ui, "请选择文件", os.getcwd(), "Json File (*.json)")
        # 判断
        if filepath != "":
            # 读取文件
            with open(filepath, 'r', encoding='utf-8') as f:
                params = json.load(f)
                # IP和端口
                self.ui.ip_lineEdit.setText(params['ip'])
                self.ui.port_spinBox.setValue(params['port'])
                # 模拟点击
                self.ui.tap_x_spinBox.setValue(params['tap_x'])
                self.ui.tap_y_spinBox.setValue(params['tap_y'])
                self.ui.tap_times_spinBox.setValue(params['tap_times'])
                self.ui.tap_interval_doubleSpinBox.setValue(
                    params['tap_interval'])
                self.ui.tap_random_interval_checkBox.setChecked(
                    params['tap_random_interval'])
                # 模拟滑屏
                self.ui.swipe_x1_max_spinBox.setValue(params['swipe_x1_max'])
                self.ui.swipe_x1_min_spinBox.setValue(params['swipe_x1_min'])
                self.ui.swipe_y1_max_spinBox.setValue(params['swipe_y1_max'])
                self.ui.swipe_y1_min_spinBox.setValue(params['swipe_y1_min'])
                self.ui.swipe_x2_max_spinBox.setValue(params['swipe_x2_max'])
                self.ui.swipe_x2_min_spinBox.setValue(params['swipe_x2_min'])
                self.ui.swipe_y2_max_spinBox.setValue(params['swipe_y2_max'])
                self.ui.swipe_y2_min_spinBox.setValue(params['swipe_y2_min'])
                self.ui.swipe_times_spinBox.setValue(params['swipe_times'])
                self.ui.swipe_interval_doubleSpinBox.setValue(
                    params['swipe_interval'])
                self.ui.swipe_random_interval_checkBox.setChecked(
                    params['swipe_random_interval'])
                self.ui.swipe_60_checkBox.setChecked(params['swipe_60'])
            # 输出信息
            self.output_message('加载参数完成!文件路径:' + os.path.abspath(filepath))

    # 退出
    def exit(self):
        # 保存日志
        # 断开连接
        self.disconnect()
        # 退出
        self.ui.close()

    # 断开连接
    def disconnect(self):
        # 停止
        self.stop()
        # 断开连接
        result, error = ADBTool().disconnect()
        # 输出信息
        self.output_result_error(result, error)
        self.connected = False
        self.output_message('已经断开连接')
        # 按钮可点
        self.ui.tap_pushButton.setEnabled(True)
        self.ui.swipe_pushButton.setEnabled(True)

    # 清空输出信息
    def clear(self):
        self.ui.output_textEdit.setText('')

    # 关于
    def about(self):
        # 显示弹窗
        QMessageBox.about(
            self.ui, '关于',
            'ADB助手\n© Copyright 2020\n作者:ordinary-student\n版本:v1.0.0')

    # 打开ADB
    def open_adb(self):
        # 获取IP地址
        ip = self.ui.ip_lineEdit.text()
        # IP校验
        if len(ip.strip()) == 0:
            self.ui.ip_lineEdit.setText('')
            # 显示弹窗
            QMessageBox.information(self.ui, '提示', '请填写IP地址!')
            return
        # 获取端口号
        port = self.ui.port_spinBox.value()
        # 创建ADB工具
        adbtool = ADBTool(ip, port)
        # 启动ADB
        result, error = adbtool.open()
        # 输出信息
        self.output_result_error(result, error)
        # 判断是否已经启动
        if ('restarting' in result) and ('error' not in error):
            self.adbtool = adbtool
            self.output_message('ADB已经启动')

    # 连接设备
    def connect(self):
        # 判断
        if self.adbtool == None:
            # 显示弹窗
            QMessageBox.information(self.ui, '提示', 'ADB尚未启动!')
            return
        # 连接
        try:
            result, error = self.adbtool.connect()
            # 输出信息
            self.output_result_error(result, error)
            # 判断是否已经启动
            if ('connected' in result) and ('error' not in error):
                self.connected = True
                self.output_message('已经连接设备')
                self.adbtool.tap(700, 1860)
        except:
            self.output_message('设备连接失败')
            # 显示弹窗
            QMessageBox.information(
                self.ui, '提示',
                '设备连接失败!\n请检查设备和电脑是否处于同一局域网,\n检查设备的USB调试模式是否已经打开。\n若还是不行,请重启软件再尝试。'
            )
            return

    # 显示设备列表
    def show_devices(self):
        # 显示设备列表
        result, error = ADBTool().show_devices()
        # 输出信息
        self.output_result_error(result, error)

    # 开始点击
    def tap(self):
        # 判断ADB是否启动
        if self.adbtool == None:
            # 显示弹窗
            QMessageBox.information(self.ui, '提示', 'ADB尚未启动!')
            return
        # 判断是否连接
        if self.connected:
            tap_thread = Thread(target=self.tap2)
            tap_thread.start()
        else:
            # 显示弹窗
            QMessageBox.information(self.ui, '提示', '尚未连接设备!')
            return

    # 开始点击
    def tap2(self):
        # 按钮不可点
        self.ui.tap_pushButton.setEnabled(False)
        # 获取参数
        tap_x = self.ui.tap_x_spinBox.value()
        tap_y = self.ui.tap_y_spinBox.value()
        tap_times = self.ui.tap_times_spinBox.value()
        tap_interval = round(self.ui.tap_interval_doubleSpinBox.value(), 1)
        tap_random_interval = self.ui.tap_random_interval_checkBox.isChecked()
        if tap_random_interval:
            message = '点击坐标({},{})处,{}次,时间间隔随机'.format(tap_x, tap_y, tap_times)
        else:
            message = '点击坐标({},{})处,{}次,时间间隔{}秒'.format(
                tap_x, tap_y, tap_times, tap_interval)
        self.output_message(message)
        # 模拟点击
        if self.adbtool.continuous_tap(tap_x, tap_y, tap_times, tap_interval,
                                       tap_random_interval):
            self.output_message('模拟点击已完成')
        else:
            self.output_message('模拟点击已停止')
        # 按钮可点
        self.ui.tap_pushButton.setEnabled(True)

    # 开始滑屏
    def swipe(self):
        # 判断ADB是否启动
        if self.adbtool == None:
            # 显示弹窗
            QMessageBox.information(self.ui, '提示', 'ADB尚未启动!')
            return
        # 判断是否连接
        if self.connected:
            swipe_thread = Thread(target=self.swipe2)
            swipe_thread.start()
        else:
            # 显示弹窗
            QMessageBox.information(self.ui, '提示', '尚未连接设备!')
            return

    # 开始滑屏
    def swipe2(self):
        # 按钮不可点
        self.ui.swipe_pushButton.setEnabled(False)
        # 获取参数
        swipe_x1_min = self.ui.swipe_x1_min_spinBox.value()
        swipe_x1_max = self.ui.swipe_x1_max_spinBox.value()
        swipe_y1_min = self.ui.swipe_y1_min_spinBox.value()
        swipe_y1_max = self.ui.swipe_y1_max_spinBox.value()
        swipe_x2_min = self.ui.swipe_x2_min_spinBox.value()
        swipe_x2_max = self.ui.swipe_x2_max_spinBox.value()
        swipe_y2_min = self.ui.swipe_y2_min_spinBox.value()
        swipe_y2_max = self.ui.swipe_y2_max_spinBox.value()
        swipe_times = self.ui.swipe_times_spinBox.value()
        swipe_interval = round(self.ui.swipe_interval_doubleSpinBox.value(), 1)
        swipe_random_interval = self.ui.swipe_random_interval_checkBox.isChecked(
        )
        swipe_60 = self.ui.swipe_60_checkBox.isChecked()
        # 定时60秒
        if swipe_60:
            message = '从坐标({}~{},{}~{})滑到({}~{},{}~{})处,连续滑屏60秒,时间间隔{}秒'.format(
                swipe_x1_min, swipe_x1_max, swipe_y1_min, swipe_y1_max,
                swipe_x2_min, swipe_x2_max, swipe_y2_min, swipe_y2_max,
                swipe_interval)
            self.output_message(message)
            # 模拟连续滑屏60秒
            if self.adbtool.timing_swipe(
                (swipe_x1_min, swipe_x1_max), (swipe_y1_min, swipe_y1_max),
                (swipe_x2_min, swipe_x2_max), (swipe_y2_min, swipe_y2_max),
                    swipe_interval, swipe_random_interval):
                self.output_message('模拟滑屏已完成')
            else:
                self.output_message('模拟滑屏已停止')
        else:
            if swipe_random_interval:
                message = '从坐标({}~{},{}~{})滑到({}~{},{}~{})处,{}次,时间间隔随机'.format(
                    swipe_x1_min, swipe_x1_max, swipe_y1_min, swipe_y1_max,
                    swipe_x2_min, swipe_x2_max, swipe_y2_min, swipe_y2_max,
                    swipe_times)
            else:
                message = '从坐标({}~{},{}~{})滑到({}~{},{}~{})处,{}次,时间间隔{}秒'.format(
                    swipe_x1_min, swipe_x1_max, swipe_y1_min, swipe_y1_max,
                    swipe_x2_min, swipe_x2_max, swipe_y2_min, swipe_y2_max,
                    swipe_times, swipe_interval)
            self.output_message(message)
            # 模拟滑屏
            if self.adbtool.random_swipe(
                (swipe_x1_min, swipe_x1_max), (swipe_y1_min, swipe_y1_max),
                (swipe_x2_min, swipe_x2_max), (swipe_y2_min, swipe_y2_max),
                    swipe_times, swipe_interval, swipe_random_interval):
                self.output_message('模拟滑屏已完成')
            else:
                self.output_message('模拟滑屏已停止')
        # 按钮可点
        self.ui.swipe_pushButton.setEnabled(True)

    # 停止
    def stop(self):
        if self.adbtool != None:
            self.adbtool.stop()
            # 按钮可点
            self.ui.tap_pushButton.setEnabled(True)
            self.ui.swipe_pushButton.setEnabled(True)

    # 截图
    def screen_cap(self):
        if self.adbtool != None:
            # 截图
            photo_path = self.adbtool.screen_cap()
            # 获取图片到本地
            result, error = self.adbtool.pull_file(photo_path)
            self.output_result_error(result, error)
            # 判断
            if ('png' in result) and ('error' not in error):
                path = photo_path[(photo_path.rindex('/') + 1):]
                self.output_message('截图成功!图片路径:' + os.path.abspath(path))
                return os.path.abspath(path)
            else:
                self.output_message('截图失败!')
                return None
        else:
            return None

    # 坐标工具
    def tool(self):
        # 判断ADB是否启动
        if self.adbtool == None:
            # 显示弹窗
            QMessageBox.information(self.ui, '提示', 'ADB尚未启动!')
            return
        # 判断是否连接
        if self.connected:
            self.axis_tool()
        else:
            # 显示弹窗
            QMessageBox.information(self.ui, '提示', '尚未连接设备!')
            return

    # 坐标工具
    def axis_tool(self):
        w = 300
        h = 600
        # 判断
        if self.tool_dialog == None:
            # 创建坐标工具窗
            self.tool_dialog = QDialog(self.ui)
            self.tool_dialog.setWindowTitle('坐标工具')
            self.tool_dialog.resize(w, h)
        # 截图
        photo_path = self.screen_cap()
        if photo_path != None:
            if self.screen_cap_file != None:
                os.remove(self.screen_cap_file)
            self.screen_cap_file = photo_path
            pix = QPixmap(photo_path)
            w = pix.width()
            h = pix.height()
            # 设置面板大小
            self.tool_dialog.setFixedSize(w / 4, h / 4)
            # 调色板
            palette = QPalette()
            # 缩小图片
            pix = pix.scaled(w / 4, h / 4)
            palette.setBrush(self.tool_dialog.backgroundRole(), QBrush(pix))
            self.tool_dialog.setAutoFillBackground(True)
            self.tool_dialog.setPalette(palette)
            self.tool_dialog.setMouseTracking(True)
            # 绑定鼠标移动事件
            self.tool_dialog.mouseMoveEvent = self.mouse_move
        # 显示窗口
        self.tool_dialog.show()
        # 十字光标
        self.tool_dialog.setCursor(Qt.CrossCursor)

    # 鼠标移动
    def mouse_move(self, event):
        x = event.pos().x()
        y = event.pos().y()
        #print(x, y)
        self.tool_dialog.setWindowTitle('X:{},Y:{}'.format(x * 4, y * 4))

    # 限制数值范围
    def x1_min(self):
        if self.ui.swipe_x1_min_spinBox.value(
        ) >= self.ui.swipe_x1_max_spinBox.value():
            self.ui.swipe_x1_min_spinBox.setValue(
                self.ui.swipe_x1_max_spinBox.value())

    #
    def x1_max(self):
        if self.ui.swipe_x1_max_spinBox.value(
        ) <= self.ui.swipe_x1_min_spinBox.value():
            self.ui.swipe_x1_max_spinBox.setValue(
                self.ui.swipe_x1_min_spinBox.value())

    #
    def y1_min(self):
        if self.ui.swipe_y1_min_spinBox.value(
        ) >= self.ui.swipe_y1_max_spinBox.value():
            self.ui.swipe_y1_min_spinBox.setValue(
                self.ui.swipe_y1_max_spinBox.value())

    #
    def y1_max(self):
        if self.ui.swipe_y1_max_spinBox.value(
        ) <= self.ui.swipe_y1_min_spinBox.value():
            self.ui.swipe_y1_max_spinBox.setValue(
                self.ui.swipe_y1_min_spinBox.value())

    #
    def x2_min(self):
        if self.ui.swipe_x2_min_spinBox.value(
        ) >= self.ui.swipe_x2_max_spinBox.value():
            self.ui.swipe_x2_min_spinBox.setValue(
                self.ui.swipe_x2_max_spinBox.value())

    #
    def x2_max(self):
        if self.ui.swipe_x2_max_spinBox.value(
        ) <= self.ui.swipe_x2_min_spinBox.value():
            self.ui.swipe_x2_max_spinBox.setValue(
                self.ui.swipe_x2_min_spinBox.value())

    #
    def y2_min(self):
        if self.ui.swipe_y2_min_spinBox.value(
        ) >= self.ui.swipe_y2_max_spinBox.value():
            self.ui.swipe_y2_min_spinBox.setValue(
                self.ui.swipe_y2_max_spinBox.value())

    #
    def y2_max(self):
        if self.ui.swipe_y2_max_spinBox.value(
        ) <= self.ui.swipe_y2_min_spinBox.value():
            self.ui.swipe_y2_max_spinBox.setValue(
                self.ui.swipe_y2_min_spinBox.value())
コード例 #8
0
class Start(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('扫雷')
        self.setWindowIcon(QIcon(':/minesweeper.ico'))
        self.setFixedSize(1000, 700)
        self.setMouseTracking(True)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.btn = QPushButton(self)
        self.btn.setMouseTracking(True)
        self.btn.setIcon(QIcon(':/开始游戏.png'))
        self.btn.setIconSize(QSize(280, 200))
        self.btn.setStyleSheet('QPushButton{border:None}')
        self.btn.move(350, 370)
        self.btn.clicked.connect(self.show_mode)
        self.msw = MineSweeperWindow(MineSweeper(0, 0, 0))
        self.show()

    def show_mode(self):
        self.choose = QDialog()
        self.choose.setWindowIcon(QIcon(':/minesweeper.ico'))
        self.choose.setFixedSize(300, 300)
        self.close()
        btn1 = QPushButton('简单', self.choose)
        btn1.move(90, 50)
        btn1.clicked.connect(self.set_easy)
        btn2 = QPushButton('中等', self.choose)
        btn2.move(90, 100)
        btn2.clicked.connect(self.set_medium)
        btn3 = QPushButton('困难', self.choose)
        btn3.move(90, 150)
        btn3.clicked.connect(self.set_hard)
        btn4 = QPushButton('自定义', self.choose)
        btn4.move(90, 200)
        btn4.clicked.connect(self.set_free)
        self.choose.setWindowTitle('模式选择')
        self.choose.setWindowModality(Qt.ApplicationModal)
        self.choose.show()

    def paintEvent(self, e):
        painter = QPainter(self)
        background = QPixmap(':/封面2.jpg')
        painter.drawPixmap(self.rect(), background)

    def mouseMoveEvent(self, e):
        if 400 <= e.x() <= 580 and 420 <= e.y() <= 520:
            self.btn.setGeometry(340, 366, 300, 214)
            self.btn.setIconSize(QSize(300, 214))
        else:
            self.btn.setGeometry(350, 370, 280, 200)
            self.btn.setIconSize(QSize(280, 200))

    def set_easy(self):
        self.choose.close()
        self.msw = MineSweeperWindow(EasyMode())
        self.msw.show()

    def set_medium(self):
        self.choose.close()
        self.msw = MineSweeperWindow(MediumMode())
        self.msw.show()

    def set_hard(self):
        self.choose.close()
        self.msw = MineSweeperWindow(HardMode())
        self.msw.show()

    def set_free(self):
        self.sf = SetFree()
        self.choose.close()
        self.sf.show()