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

# 環境
>・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です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/705c9571-c859-8f60-b64c-1575dc91919e.png" alt="スクリーンショット" width="300">

大文字へ変換して検索ボタンをクリックすると、検索結果が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/4a981c24-049a-56dc-eb26-838a42ad0b19.png" alt="スクリーンショット" width="300">

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


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

```python
# 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コード一覧'
        # 注１の'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（ウィジェット）に挑戦（その１）**
https://qiita.com/ti104110/items/0c0800cff58cd10b9676
***
>**tkinter がうまくいかないので、PyQt6でWidget（ウィジェット）に挑戦（その２）RadioButtonで選択してWebを開く**
https://qiita.com/ti104110/items/7785758f98ef978c2d97
***
>**tkinter がうまくいかないので、PyQt6でWidget（ウィジェット）に挑戦（その４）自作programをRadiButtonでリスト化**
https://qiita.com/ti104110/items/dc07bcb2d0fa7a9ff269
***
>**tkinter がうまくいかないので、PyQt6でウィジェットに挑戦（その５）「Googleの急上昇ワード」の表示に"QTextBrowser"でURLにリンク設定を追加**
https://qiita.com/ti104110/items/d9868846ff7ac9556edf