1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

tkinter がうまくいかないので、PyQt6でWidget(ウィジェット)に挑戦(その3)QGridLayout()オブジェクトを使って、labelとQLineEditを横並びに表示

Last updated at Posted at 2023-06-06

環境

・MacOS Ventura 13.2
・python3.10.4
・pyqt6(インストールが必要です。% python3 -m pip install pyqt6)
・requests(インストールが必要です。% python3 -m pip install requests) <--webプラウザの代わりにwebサイトにアクセスしてHTTPデータの送受信を行うライブラリ

出来上がったWedget

Data取得ボタンをクリックすると、wikipedia.orgからIOCコード一覧を取得してtext(key.txtとvalue.txt)として同じディレクトリに保存します。
ですので、都度々々取得しなくても、そうそう変化はないので今回と、後はオリンピックが始まったら取得すればいいと思います。

国記号入力用QLineEditに国記号(例えば:jpnとかusaとかindとか)を入力します。小文字でOKです。
スクリーンショット

大文字へ変換して検索ボタンをクリックすると、検索結果が表示されます。
スクリーンショット

これだけのことですが、pyqt6についての勉強になると思います。

取り敢えずCodeをコピペして試して下さい。

オリンピックの時以外使うことのないprogramですが、widgetの勉強がメインテーマですので我慢して下さい。
QGridLayout()オブfジェクトを使って、labelとQLineEditを横並びに表示させる」とか
requests()メソッドでwikipedia.orgからIOCコード一覧を取得」とか
upper()メソッドで文字列を大文字に変換」とか、色々試してみました。

# requests()メソッドを使用して、wikipedia.orgからIOCコード一覧を取得し、国記号入力をwidgetで表示
# QGridLayout()オブfジェクトを使って、ioc国記号入力:labelと国記号入力用QLineEditを横並びに表示
# 国記号Dataは大文字であるため、文字列を大文字に変換する、upper()メソッドを使用して変換
# -----------------------------------------------------
import pandas as pd
import requests

# -----------------------------------------------------
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QGridLayout, QLineEdit
from PyQt6.QtGui import QFont   # フォントのサイズを設定

# -----------------------------------------------------
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    # ---------------------------------------------
    def initUI(self):
        # windowのTitleを設定
        self.setWindowTitle("ioc国記号検索")
        # ------------------------------
        # layoutを設定
        layout = QVBoxLayout()
        self.setLayout(layout)
        # ------------------------------
        # fontSizeを設定(色の指定をするため)
        font = QFont("Helvetica", 14, QFont.Weight.Bold)

        # ------------------------------
        # widgetの作成
        # dataのインポートの選択
        self.select_lbl = QLabel("wikipediaからデータ取得しますか?")
        layout.addWidget(self.select_lbl)
        
        self.select_btn = QPushButton("Data取得")
        self.select_btn.clicked.connect(self.req)
        layout.addWidget(self.select_btn)
        
        self.select_lbl2 = QLabel()
        layout.addWidget(self.select_lbl2)
        
        # -------------------------------------------
        # labelの作成と配置(grid_layoutを使って横並びに)
        grid_layout = QGridLayout()# グリッドlayoutを作成
        # ------------------------------
        label = QLabel("ioc国記号入力:")
        grid_layout.addWidget(label,0,0)
        # ------------------------------
        # 国記号入力用QLineEditの作成と設置
        # self.input_line をインスタンス変数として定義
        self.input_line = QLineEdit()
        grid_layout.addWidget(self.input_line, 0, 1)
        # ------------------------------
        # グリッドレイアウトを垂直レイアウトに追加
        layout.addLayout(grid_layout)
        self.setLayout(layout)
        # -------------------------------------------
        # 大文字変換用buttonとconnectの作成と配置
        self.convert_button = QPushButton("大文字へ変換して検索")
        self.convert_button.clicked.connect(self.convert_string)
        layout.addWidget(self.convert_button)
        # ------------------------------
        # 国記号検索結果
        self.result_label = QLabel()
        self.result_label.setFont(font)  # フォントを設定
        # スタイルシートを使用して色を設定
        self.result_label.setStyleSheet("color: blue")
        layout.addWidget(self.result_label)

        # ------------------------------
        # 終了button
        self.end_button = QPushButton("finish",self,checkable=True)
        self.end_button.clicked.connect(QApplication.quit)
        layout.addWidget(self.end_button)

# -----------------------------------------------------
    def req(self):# reqメソッド(コールバック関数)
        # wikipediaの「IOCコード一覧」のページからコード一覧を取得
        url = 'https://ja.wikipedia.org/wiki/IOCコード一覧'
        # 注1の'UnicodeEncodeError'が出るためrequestsで読み込んだ上でpandasに渡す
        r = requests.get(url)
        # 引数 match:文字列を指定するとその文字列が含まれる表のみ取得できる
        dfs = pd.read_html(r.content, match='コード', header=0)

        # key.txtファイル(ioc国記号)とvalue.txtファイル(国名)を同じdirectoryに保存
        # to_csv()にsep=" "を追加するとtxtファイルとして保存できる
        print()
        print('--------wikipedia Dataを保存---------')
        # 国コードを保存
        dfs[0].loc[:,['コード']].to_csv('key.txt', sep=" ", index=False)
        # 国名を保存
        dfs[0].loc[:,['IOC承認国・地域・団体']].to_csv('value.txt', sep=" ", index=False)
        # ------------------------------
        # widget上に表示する
        self.select_lbl2.setText(f"---------wikipedia Dataを保存----------\nkey.txtとvalue.txtで保存しました。\n----------------------------------------")
        # ------------------------------
        # コンソール上に表示する
        print('key.txtとvalue.txtで保存しました')

        print('-'*40)

# -----------------------------------------------------
    def convert_string(self):# convert_stringメソッド(コールバック関数)
        # 大文字へ変換
        lowercase_str = self.input_line.text()
        uppercase_str = lowercase_str.upper()

        # 大文字に変換されたテキスト
        symbol = uppercase_str
        # ------------------------------
        # key.txtとvalue.txtをファイルから呼び出しlistに格納
        with open('key.txt', 'r') as f:
            key = f.read().split('\n')
            ln01 = len(key)             # 要素数を調べる
            #print(f'key={ln01}')
            
        with open('value.txt', 'r') as f:
            value = f.read().split('\n')
            ln02 = len(value)             # 要素数を調べる
            #print(f'value={ln02}')
         
        # key.txtを並べたリストとvalue.txtを並べたリストを、ZIP関数でまとめて辞書に変換
        ioc = dict(zip(key,value))
        
        
        # ------------------------------

        try:
            self.result_label.setText(f"検索結果:\n国記号[{symbol}] = \n  {ioc[symbol]}")
        except KeyError:
            self.result_label.setText(f"検索結果:ioc記号が存在しません。!")
        finally:
            pass

# -----------------------------------------------------
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())



あとがき

これらは、参考図書がないため、ほとんどchatGPTに「pyqt6でlabelの作り方を具体的に教えて?」などと聞きながら作りました。
ググったり、本を読むより早くわかりやすく進みました。
たまには、言われた通り記述してもErrorが出ることがあり、その都度Error内容を伝えると、「申し訳ありません。xxxxが説明不足でした。・・・・」とすぐ訂正Codeが来るので、結構楽しく出来ました。

関係リンク

"ChatGPT for Mac" をインストールして使ってみた。
https://qiita.com/ti104110/items/40563e13d9f389bd62bd


tkinter がうまくいかないので、PyQt6でWidget(ウィジェット)に挑戦(その1)
https://qiita.com/ti104110/items/0c0800cff58cd10b9676


tkinter がうまくいかないので、PyQt6でWidget(ウィジェット)に挑戦(その2)RadioButtonで選択してWebを開く
https://qiita.com/ti104110/items/7785758f98ef978c2d97


tkinter がうまくいかないので、PyQt6でWidget(ウィジェット)に挑戦(その4)自作programをRadiButtonでリスト化
https://qiita.com/ti104110/items/dc07bcb2d0fa7a9ff269


tkinter がうまくいかないので、PyQt6でウィジェットに挑戦(その5)「Googleの急上昇ワード」の表示に"QTextBrowser"でURLにリンク設定を追加
https://qiita.com/ti104110/items/d9868846ff7ac9556edf

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?