データベースのようなプログラムを組んだ話
はじめに
またPythonでプログラミングをしました。
その成果物について記述してきたいと思います。
今回作成したプログラムはタイトルにあるように、データベースのようなものです。特定のフォーマットのデータの記入、削除、一覧の表示(参照)が可能なプログラムです。
これは某ゲームの所持している個体データを管理する目的で作成しました。もっと具体的に言うと通称モバマスと言われるソーシャルゲームにて所属しているアイドルを管理するためのものです。
通称モバマスにて、所属しているアイドルがイベントで活躍できるほどの性能を持っているかどうか判断し、活躍できない性能であれば相応の対応したいという個人的な要望を常々持っていました。イベントで活躍できるアイドルには編成枠的な意味で限りがあり、新規にアイドルが所属するたびに状況は変化し、ゲーム内では明示されていないデータを用いて性能を判断するため、普通に管理するのは少々面倒であります。ゲーム内で明示されていないデータはアイドルのパラメータから算出できますし、ゲーム内で実際に編成してデータを収集する方法がありますが、面倒に感じていました。なので、より簡単に管理するために本プログラムを作成しました。
成果物
上記に示している画像が成果物、プログラムの実行画面になります。一番上にログ、そこから下へ順にデータ追加用のボタンと入力フォーム、データ削除用のボタンと入力フォームと続き、一番面積使っているのがデータ表示部となってます。
起動と同時に上記のように特製のテキストファイルを読み込んでデータを表示します。Addボタンを押すとデータ追加用の入力フォームからデータの各アイテムを読み込み、テキストファイルにデータを追加します。この入力フォームはデータのアイテムごとに5つあります(Name,Cost,ATK,DEF,人気度)。また、Delボタンを押すとデータ削除用の入力フォーム(Delete ID)から番号を読み込み、テキストファイル内の該当する番号のデータを削除します。データの追加、削除を行うたびにログとデータ表示が更新されます。
ログはアクションの起こった時刻とアクション内容を表示しています。
表示しているデータはテキストファイル内のデータをそのまま表示している訳ではありません。テキストファイル内のデータのアイテムはゲーム上で取得できる情報で、表示しているデータのアイテムはその情報の一部と情報から算出したアイテムと算出アイテムから行った順位付けの結果になります。また、表示する順番も少々特殊になっています。上位5つとその他で順序付けで参照している数値が異なり、それを少々明確に示すために5番目のデータと6番目のデータの間に空行が挿入されています。これらの表示データの生成と表示はテキストファイルを読み込む度に行っています。
フローチャート
フローチャートを上記に示します。
一番左の一列がメインのフローになります。「GUI作成」から「ログ更新」までが最初の起動時に行われ、GUIの作成とデータの表示が行われます。その後はボタン入力待ちとなります。GUI上にはAddボタンとDelボタンしかありませんが、終了処理の関係上、GUI右上の「×」ボタンをCloseボタンとして図中に用いています。
Addボタンが押されたとき、5つあるデータ追加用の入力フォームから入力データを取得し、その入力データが正常か判断し、正常であれば追加データを生成します。ここまでがAddボタン処理で特有の処理になります。その後Addボタン処理とDelボタン処理で共通の「データ編集」と「テキスト書き出し」へ移り、テキストファイルにそのデータを追加します。最後にテキストファイルが変更されたため、メインフローへ戻り、「テキスト読み込み」から「ログ更新」まで行い、GUI画面を更新します。
Delボタンが押されたときは、Addボタンのときと同様にDelボタン処理での特有処理を行い、Addボタン処理とDelボタン処理で共通の処理を行い、メインフローへ戻ってGUIの更新を行います。データの追加からデータの削除へ変わっただけで、Addボタンのときと処理に大きな違いはありません。
本プログラムはcloseボタンが押されない限り終了することはありません。
ソースコード
上記に示しているのはソースコードの構造です。
一番上のパッケージのインストールについて、今回用いたパッケージは以下のとおりです。GUI作成用のtkinter、GUI中に表を作成するためのtkinter.ttk、ログ内容の時刻取得用のdatatimeの3つです。
import tkinter
import tkinter.ttk
import datetime
次の初期設定①中の表枠作成は次のようにして行いました。tableという名前で表を定義し、表示場所(2行目:place)や列数(3行目:column)、表示行数(5行目:height)を設定しています。6行目以降は各列の名前や幅を設定しています。表へのデータの挿入はここでは行っておらず、後述の表更新関数内にて行っています。
table = tkinter.ttk.Treeview(window)
table.place(x=10,y=140)
table["column"] = (1,2,3,4,5,6,7,8,9)
table["show"] = "headings"
table["height"] = 31
table.heading(1,text="No.")
table.column(1, width=30)
table.heading(2,text="ID")
table.column(2, width=25)
......
関数定義内でのテキスト読み込み、書き込みは以下のように行っています。openでテキストファイルを扱っており、読み込み時には.readlins()でテキストファイル内のデータを改行文字ごとに入手してリストデータとして扱っています。書き込み時にはテキストファイルに上書き用のテキストデータを生成し、.writeで書き込んでいます。なお、以下code中は一部処理の記述を「......」で省略しています。
#データ読み込み
def DB_input():
DBFileIn = open(DBpass,mode='r')
DBItem = DBFileIn.readlines()
DBFileIn.close()
......
#データ書き込み
def DB_output(DBItem,AddData,DelNum):
DBFileOut = open(DBpass,mode='w')
......
DBFileOut.write(OutData)
DBFileOut.close()
表更新関数では、主に以下のことを行っています。
・読み込んだデータから表示用のアイテムを算出する
・算出したアイテムに対するデータの順位付けを行う
・順位付けの結果から表に表示するときの順位付けを行う
・表中に既に挿入されているデータを全て削除する
・新たにデータを表に挿入する
表更新関数での順位付けでは、各算出アイテムごとに順位付けを行っています。各データに降順で順位を付けており、表示順序も同様のアルゴリズムで、各データに順位を付けています。
テーブルの初期化は以下のように行っています。get_children()で表中の要素(データ情報)をリストとして取得します。delete(i)で表中の要素を削除しており、表中のデータを全削除するのでfor文で回しています。
if table.get_children():
for i in table.get_children():
table.delete(i)
表へのデータの挿入は以下のコマンドを用いています。values以降に表示するデータを列ごとに「,」区切りで記述しています。データは「......」で一部省略しています。
table.insert("", "end", values=(str(i+1), str(j), ...... ))
ここまでの記述ではGUI部分のソースコードの記述を省略していますが、GUI部分のソースコードの記述は以下に示すnoteで触れているためです。
https://note.com/krkysh/n/n3c7d53ddf2b3
終わりに
ゲーム内データを管理するために作成したプログラムについて述べました。
以前のプログラミングで培っていたテキストの読み書きやGUIの作成を組み合わせる形となりましたが、GUI内に表を作成する部分と表に挿入するデータを読み込んだテキストから作成する部分は完全新規に組み上げた部分であり、試行錯誤することとなりました。
無事作成できて良かったです。
この記事が気に入ったらサポートをしてみませんか?