各局皆様、こんにちは。アマチュア無線局、JS2IIUです。
以前の記事(FT8 コールサイン表示ツール)でFT8交信中に、交信相手のコールサインを見やすく表示する自作のアプリを紹介しました。また、こちらの記事(FT8 コールサイン表示ツール Twitter フォロワーさん表示機能)で、フォロワーさんかどうかの表示もできるようにしました。
交信相手を大きく表示することに加えて、B4か?(過去に交信したことがある局か)、Twitterのフォロワーさんかを一目で確認できるアプリをゼロから作り直しました。前回はVisual Basicで作りましたが、今回はPythonアプリにしました。
アプリの概要
- Tkinterを使ってGUIを表示する
- JTDX、WJTXが交信相手局のコールサインをクリップボードにコビーするのを読み出して表示する
- B4かどうかは、B4局リストのCSVを読み込んでおき、検索して判断する
- Twitterのフォロワーさんかどうかも、B4と同じ方法で判断する
- 設定保存用のiniファイルで、B4とTwitterフォロワーさんリストのCSVファイルを指定する
- 後からユーザーがCSVを更新することができる(プログラムが毎回CSVファイルを読み込む方式)
- ディスプレイの中の表示位置を覚えておき、次回起動時には同じ位置に表示する
コールサインのフォントが黒の場合は、初めて交信する局。B4の局は赤色になります。コールサインの下にTwitter Follower = Yesとなっている場合は、Twitterのフォロアーさん。フォロアーさんでない場合は文字が黒でTwitter Follower = No と表示されます。
Pythonプログラムの部品
クリップボードの読み出し(Pyperclip)
Pythonからクリップボードに入っているデータを読み出すにはPyperclipを使います。VSCodeで表示されたヘルプを抜粋します。
(module) pyperclip
PyperclipA cross-platform clipboard module for Python, with copy & paste functions for plain text. By Al Sweigart al@inventwithpython.com BSD License
Usage:
import pyperclip pyperclip.copy(‘The text to be copied to the clipboard.’) spam = pyperclip.paste()if not pyperclip.is_available():
VSCodeで表示されたポップアップヘルプより抜粋
print(“Copy functionality unavailable!”)
クリップボードにあるデータを取得する方法です。
import pyperclip
s = pyperclip.paste()
なお、Pyperclipが扱えるのはテキストのみ。上のコードの例では、変数sは必ず文字列型となります。
FT8の交信をしている最中にほかのアプリで作業する場合があると思います。クリップボードにJTDX, WSJTからコピーされたコールサイン以外の情報が入った場合も文字列を読み出してしまいます。文字列がある程度長いものはコールサインではないと判断してアプリのウィンドウに表示しないような処理を入れています。
iniファイルの取り扱い(Configparser)
今回はプログラム配布を想定して、配布後に読み込むCSVファイルを任意に指定できるようにするために、ファイル名をiniファイルに書けるようにしました。
iniファイル
[files]
b4csv = ./B4Call.csv
followercsv = ./follower.csv
[window]
loc_x = 651
loc_y = 362
iniファイルを簡単に扱えるようにするためのConfigparserモジュールを使っています。
iniファイルの作成、上書き
import configparser
config = configparser.ConfigParser()
config['files'] = {
'b4csv': './B4Call.csv',
'followercsv': './follower.csv'
}
config['window'] = {
'loc_x': 651,
'loc_y': 362
}
with open('CallLookup.ini', 'w') as configfile:
config.write(configfile)
iniファイルを読み込み、値を変数に格納するにはconfig.get()を使います。
import configparser
config = configparser.ConfigParser()
config.read('CallLookup.ini')
strB4csv_file = config.get('files', 'b4csv')
tkinterウィンドウの位置(geometry)
tkinterのウィンドウサイズはgeometry(‘width x height’)で指定します。
import tkinter
root = tkinter.Tk()
root.geometry('800x600')
root.mainloop()
ディスプレイ全体の中のどこに表示するかを指定する場合は以下の例のようにします。
import tkinter
root = tkinter.Tk()
root.geometry('800x600+200+450')
root.mainloop()
ウィンドウは自由に移動させることができます。現在のウィンドウ位置を取得するには、以下の例のようにします。LocationStringに'800x600+200+450'のような文字列が格納されます。
LocationString = root.geometry()
‘800×600+200+450’という文字列から、ウィンドウ位置座標を取り出す簡単な方法を紹介します。タプルsettingValueに4つの数字(文字列)が4つの要素として格納されます。
import re
settingValue = re.findall('[0-9]+', LocationString)
window_loc_x = settingValue[2]
window_loc_y = settingValue[3]
参考
Pyperclip関連
Python, pyperclipでクリップボードを操作(コピー、ペースト、監視)https://note.nkmk.me/python-pyperclip-usage/
Configparser関連
configparser — 設定ファイルのパーサー
https://docs.python.org/ja/3/library/configparser.html
設定ファイル
https://www.python-izm.com/advanced/config_parser/
tkinter関連
【Python】tkinter: 画面のサイズ・位置・最大化表示の設定(geometryメソッド)
https://office54.net/python/tkinter/screen-size
Python(Tkinter)でウィンドウを表示するための基本
https://original-game.com/basics-of-creating-windows-with-python/
最後まで読んでいただき有難うございました。73

