環境
・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