PyQt5初心者テストレコード(2つ):インターフェイスからパラメーターを取得して、クローラー情報をインターフェイスにフィードバック

はじめに:このレコードは、作成者の自習プロセスにおける簡単なメモです。ライブラリのインストールから最終的に.exeにパッケージ化するまでのプロセスを説明します。初心者が参照および交換できるように、3つのパートに分かれています。説明に誤りがある場合は、読者にお問い合わせください。アドバイスについては、カタログの2番目の部分を以下に示します。

1. Qt制御機能の実現:インターフェースからパラメーターを取得

1.ボタンpushButtonとテキストボックスlineEdit

ここに画像の説明を挿入
最も重要なことよりも重要です新しい呼び出しが行われます)。次に、上部のコントロールに基づいて、ユーザーがインターフェイスから入力したさまざまなパラメーターを取得する方法について説明します。
左上から右下に、最初のパラメーターは[Cookieの更新]ボタン。その横には、パラメーターを受け取るためのlineEditコントロールがあります。1行のテキストを書き込むことができます(TextEditは複数行です)。QtDesignerインターフェースの左側で見つけて、ドラッグしてWidegtに配置します。
ここに画像の説明を挿入

Cookieは、作成者が使用するクローラーが必要とするパラメーターの1つであり、毎日更新する必要があります(シミュレートされたログインは不要、ブラウザーで直接F12キーを押してコピーします。クローラー関連の知識はここでは繰り返されません)。通常、同じ日に複数回更新する必要はありません。このようにして、当日のCookieを保存する機能を実装する必要があります
。getXlsxFormクラスにメンバーメソッドを追加してみましょう(詳細については、前の記事の3番目のセクション:基本ページ関数クラスを参照してください。Cookie が必要なためreCookie()、最初にtext()メソッドを使用して入力テキストを受信しますパラメータなので、入力を確認する必要があります(入力は有効性に制限はありません)。デポジットを入力してCookieローカル.txtファイルを入力した場合、ファイルがロードされた履歴から入力がない場合は、注意.\\GUI_Call現在のルートファイル.pyのパスディレクトリの下のGUI_Callフォルダー。

def reCookie(self): # 更新Cookie---------------------------------【1】
    inputCookie = self.lineEdit_RenewCookie.text()
    if inputCookie == '':
        QMessageBox.about(self,"提示:请确认是否更新!","未输入Cookie,已载入cookie.txt中的历史记录")
        f = open(".\\GUI_Call\\cookie.txt", "r")
        inputCookie = f.readlines()[0]
        self.lineEdit_RenewCookie.setText(inputCookie)
        f.close() # 注意:文件打开后要关闭,避免占用内存资源
    else:
        with open(".\\GUI_Call\\cookie.txt", "w", encoding='utf-8') as f:
            f.write(inputCookie)
# 使用with可省去close()
        QMessageBox.about(self,"提示","已更新Cookie至cookie.txt")

著者は、他のパラメーターの受信を「クローラーの実行」ボタンに均一に書き込み、それを追加しrunCrawler()ます。同じtext()方法を使用して、ユーザー入力を受信します。クロールの前に取得したデータの一部は処理する必要があるため、別setParameter()のデータも作成しました。ここでは、処理内容は繰り返されません。Cookieが存在するかどうかを再度確認し、確認後にクローラーを呼び出します。コードは次のとおりです。

def runCrawler(self): # 点击运行爬虫按钮,爬取基本页信息-----------------【2】
    Cookie = self.lineEdit_RenewCookie.text() 
    sheetname = self.lineEdit__SheetName.text() # 输出的表名
    typeIndex = self.comboBox_infortype.currentIndex() # 类型选择下拉框
    maxpage = self.lineEdit_maxpage.text() # 最大页码
    paraList = self.setParameter(typeIndex,maxpage) # 处理类型、历史类型、最大页码
    begintime = self.lineEdit_begtime.text() # 开始日期
    endtime = self.lineEdit_endtime.text() # 结束日期
    brist = str(self.lineEdit_brist.text()) # 内容搜索
    accregpername = self.lineEdit_register.text() # 作者
    if Cookie!= '':
        # print("此处为传参调用爬虫程序中的方法MyCrawler.get_xlsx()")
    else:
        QMessageBox.about(self,"提示","请注意:未更新Cookie")

2.ドロップダウンボックスcomboBoxとラジオボタンRadioButton

comboBoxコントロール、つまりドロップダウンボックスについて説明します。Qt Designerのインターフェースにドラッグした後、ダブルクリックして必要なドロップダウンオプションを追加し、currentIndex()メソッドを介して現在のオプション番号(0から開始)取得
ここに画像の説明を挿入
し、その横にあるRadioButtonコントロール、つまりラジオボタン取得します。2つドラッグして、作成者は1か月以内にオプションのボタンにradioButton_0と名前を付け、isChecked()メソッドでクリックされたかどうか確認します。

if self.radioButton_0.isChecked() == True: # 点击1个月内,datatype设为0
    datatype = '0'
else:
    datatype = '1' # 否则datatype设为1,即点击历史

まとめ:この時点で、基本的なインターフェースの構築とパラメーターの転送方法について説明しました。さらに最適化は後で行います。このセクションの要点は次のとおりです。1。lineEdit.text()、2、コンボボックス。currentIndex()、3、ラジオボタン。isChecked()

2.インターフェイスの最適化:カレンダーコントロールとボタンアイコン、コンテンツのヒントなど。

ここに画像の説明を挿入

1.カレンダーウィジェット

インターフェースをもう一度見るか、そこにあるものを忘れてください。)先に述べたように、更新Cookieボタンの機能は、一時的な保存とCookieのロードを容易にすることです。そのため、日付をより便利に取得できますか?
作成者が使用するクローラーで必要な日付パラメーター形式は「yyyy-mm-dd」であるため、時間モジュールをインポートしtime.strftime("%Y-%m-%d")て、その形式に従って日付を取得できます。getXlsxFormクラスの__init__メソッドにコード追加し、メソッドでsetText()日付テキストボックスを設定するだけですデフォルト;

class getXlsxForm(QWidget,getXlsxWidget.Ui_Form):
    def __init__(self):
        super(getXlsxForm, self).__init__()
        self.setupUi(self)
        # 设置默认日期为当日
        self.lineEdit_begtime.setText(time.strftime("%Y-%m-%d"))
        self.lineEdit_endtime.setText(time.strftime("%Y-%m-%d"))

ただし、通常、クローラーを使用してクエリを実行する場合、日付範囲は同じ日ではないため、日付を手動で変更する必要があります。入力の面倒な変更によるトラブルを回避するために、Qtが提供するCalendarWidgetコントロールは、愚かなクリック選択のニーズを満たすことができます。:以下のdateEditコントロールのアイコンもカレンダーのように見えます。自分で試すことができます。CalendarWidget
ここに画像の説明を挿入
ここに画像の説明を挿入
を使用して、日付テキストボックスの横にあるボタンの下など、適切な位置に配置します。次に示すように、ボタンをクリックした後にポップアップカレンダーの効果を表示すると便利です。

ここに画像の説明を挿入
また__init__getXlsxFormクラスのメソッドにコードを追加し、カレンダーパネルを最初に非表示に設定し、日付テキストボックスを読み取り専用に設定します。手動で変更を入力する必要はありません。次に、通常の手順に従います " ボタンをクリックします。接続して実行します(メソッド) "ボタンをクリックしたときに実行されるバインディングメソッド、非表示のカレンダーパネルが表示され、カレンダーをクリックして日付を設定し、カレンダーパネルをクリックしてQDateに戻ります;

self.date_start.setHidden(True) # 隐藏日期面板
self.date_end.setHidden(True)
self.lineEdit_begtime.setReadOnly(True) # 日期框只读
self.lineEdit_endtime.setReadOnly(True)
self.pB_date_start.clicked.connect(self.showDate1) #显示日历面板
self.pB_date_end.clicked.connect(self.showDate2)  
self.date_start.clicked[QDate].connect(self.setDate1) # 设置所选日期
self.date_end.clicked[QDate].connect(self.setDate2) 

カスタムshowDate()メソッドを追加します。まず、isHidden()メソッドを使用して非表示になっているかどうかを判断します。現在は非表示になっています。次にボタンをクリックし、setVisible()メソッドを使用して表示します。現在表示されている場合は、ボタンをクリックして非表示にします。

def showDate1(self):  # 显示日历面板--------------------------------【5】
    if self.date_start.isHidden():
        self.date_start.setVisible(True)
    else:
        self.date_start.setHidden(True)
def showDate2(self):
    if self.date_end.isHidden():
        self.date_end.setVisible(True)
    else:
        self.date_end.setHidden(True)

setDate()メソッドを追加し、メソッドによってselectedDate()カレンダーパネルで選択された日付を取得し、メソッドを使用toString()して形式で文字列を返し、setText()メソッドを使用して日付テキストボックスの表示値を設定し、選択が完了したらカレンダーパネルを非表示にします。同時に、検証する必要があります。開始日は終了日より後の日付にすることはできません。日付文字列の形式は「yyyy-MM-dd」であるreplace('-','')ため、水平バーを削除して純粋な数値を取得し、int型に変換してサイズを比較します(20200101 <20201231など)。 ;
(この変換は少し厄介なようです、ハハ、もっと良い解決策についてアドバイスをお願いしますლ(°◕‵ ƹ´◕ლ))

def setDate1(self): # 设置所选日期----------------------------------【6】
    date = self.date_start.selectedDate().toString("yyyy-MM-dd")
    if int(date.replace('-','')) > int(self.lineEdit_endtime.text().replace('-','')):
        QMessageBox.warning(self,"警告","开始日期不可晚于结束日期!")
    else:
        self.lineEdit_begtime.setText(date)
        self.date_start.setHidden(True)
def setDate2(self): #
    date = self.date_end.selectedDate().toString("yyyy-MM-dd")
    if int(date.replace('-','')) < int(self.lineEdit_begtime.text().replace('-','')):
        QMessageBox.warning(self,"警告","结束日期不可早于开始日期!")
    else:
        self.lineEdit_endtime.setText(date)
        self.date_end.setHidden(True)

このように、日付取得操作はよりハイエンドであるように思われるので、他に何ができるかを見てみましょう。
たとえば、ボタンのアイコンを設定します。ドライテキストを使用するだけでなく、カーソルがホバーしているときにテキストプロンプトに変えて、手術のために空になっている下部を取り出します。この文章は少しクールです...

2.ボタンのアイコンとコンテンツのヒント

ここに画像の説明を挿入
setStyleSheet()メソッドを使用してボタンのスタイル設定します。Qtスタイルシートの関連コンテンツを詳細に検索できます。フロントエンドに触れた生徒は、cssと同様にすばやく対応する必要があります。setToolTip()メソッドを通じてテキストプロンプト実装します。さらに、スタイルシートでボタンの背景画像を設定するだけでなく、setIcon()メソッド使用してアイコン設定することもできます。

#设置按钮样式和提示
self.pB_runCrawler.setStyleSheet("QPushButton{border-image:url(./QtFile/images/run.png)}"
                                "QPushButton:hover {border:2px solid black}"
                                "QPushButton {border:none}")
self.pB_runCrawler.setToolTip("爬取基本页")
self.pB_stop.setStyleSheet("QPushButton{border-image:url(./QtFile/images/stop.png)}"
                            "QPushButton:hover {border:2px solid black}"
                            "QPushButton {border:none}")
# self.pB_stop.setIcon(QIcon(".\\QtFile\\images\\stop.png"))
self.pB_stop.setToolTip("停止程序")

効果はおそらく次の図のように非常に見苦しくなります。
ここに画像の説明を挿入
次のsetClearButtonEnabled()図に示すように、メソッドを使用してテキストボックスに明確な関数を追加し、[X]をクリックすることもできます。
ここに画像の説明を挿入
コード:

# lineEdit内容删除提示
self.lineEdit_RenewCookie.setClearButtonEnabled(True)
self.lineEdit__SheetName.setClearButtonEnabled(True)
self.lineEdit_brist.setClearButtonEnabled(True)
self.lineEdit_register.setClearButtonEnabled(True)

runCrawler()メソッドのこの部分を覚えていますか?次の記事では、クローラーフィードバック情報を複数行のテキストコントロールTextEditに1つずつ更新します。

if Cookie!= '':
        # print("此处为传参调用爬虫程序中的方法MyCrawler.get_xlsx()")
else:
        QMessageBox.about(self,"提示","请注意:未更新Cookie")

まとめCalendarWidget.selectedDate()。toString(“ yyyy-MM-dd”)
いきなり金のような言葉を大切に...こんにちは!

3.インターフェースの更新:クローラーのフィードバック情報をロードする

このセクション(読む必要はありませんが、実際には作成者からの苦情です)は、クローラーの読み込みのフィードバックをインターフェースに実装する方法を説明しています。効果は、一般的なソフトウェアインストールの詳細な手順と同じです。進行情報は、複数行のテキストボックスに1つずつ読み込まれ
ます。
ここに画像の説明を挿入
うーん... emmmmmm;

ここに画像の説明を挿入
ああ、スペースを構成することは本当に悪意のあることではありません。どうすればいいですか?正直なところ、この部分もかなりの労力を費やしました大きな男が瞬き、スカムバッグは学ぶのに長い時間がかかりました)。シグナルとスロットを定義し、マルチスレッドを組み合わせます。しかし、要件をすばやく達成するために、時間を費やすことなく新しいことを学ぶことができます(待つ、待つ、待つ!間違えないようにここに画像の説明を挿入
注意してください!単純な方法から始めます。clear()クローラーを実行する前に、最初の方法で最後の方法をクリアします。記録し、forループでクローラーを実行します。MyCrawler.getBaseData()は作成者が使用するクローラープログラムであり、クロールされたサーバーの応答ステータスコードを返します。クローラー関連の知識は説明されていません。append()メソッド、つまり上の灰色の領域によって、対応する情報を複数行のテキストボックスに追加します。

if Cookie!= '':
    self.textEdit_CheckInfo.clear()
    for i in range(1, paraList[2] + 1):
        i = str(i)
        status_code = MyCrawler.getBaseData(爬虫参数省略……)
        info = " >>> 已爬取第%s页" % i + "(状态码:%s)" %status_code +"\n"
        self.textEdit_CheckInfo.append(info)
        QApplication.processEvents()
        time.sleep(0.1)
    self.textEdit_CheckInfo.append("爬取完成!")
else:
    QMessageBox.about(self,"提示","请注意:未更新Cookie")

次に、問題が発生します。クローラーの実行中にインターフェースがブロックされるため、クロールプロセス全体が終了する前にインターフェースがスタックし、情報を1つずつ更新できないため、クローラーの終了後にすべての情報が一度に印刷されます。そして著者はマルチスレッドを学ぶのが面倒なので、著者は別のアプローチをとり、QApplication.processEvents()この方法を見つけました。これはインターフェイス情報を更新し、最終的に目的の効果を達成するために使用されます。
ただし、行ごとに出力されているようですが、その過程でまだ問題があります。インターフェイス自体はまだクリック可能ではなく、マルチスレッドで解決する必要があります。
ここに画像の説明を挿入

4、追記

全体のタイトルは「PyQt5 Beginner Test Record」ですが、作者は以前Qtと連絡を取りました。Qtは、C ++に基づくGUIプログラムを作成するためのライブラリです。同様の機能を実装する他のライブラリよりも強力で使いやすくなっています。卒業制作でQtを学んだり、シンプルなインターフェースも書いたり、Huo Yafeiさんの「Quick Start of Qt Creator」を読んだり、Qtの機能の説明がとても詳しくて興味があります。学生が推奨します。さらに、C ++学習の場合、必要な学生はステーションBで「清華大学C ++」を検索できます。

Pythonでグラフィカルインターフェースを学ぶとき、Qtは多くの助けとなり、今回PyQt5を学ぶための資料のほとんどはCSDNからのものだったので、著者はそれをブログ投稿に記録したいと考えました。機会があれば、著者はQtをC ++でレビューして整理し、私のような初心者がすぐに理解して使用できるようにします。また、今回作成したマルチスレッディングなどのインターフェースツールについても改善の余地があり、今後も新たな発見を追加していきます。

読んでくれてありがとう、ありがとう!


次のパートでは、pyinstallerを使用して.exeファイルにパッケージ化する方法について説明します。

おすすめ

転載: blog.csdn.net/zohan134/article/details/106157333