見出し画像

11種のLLMでのPythonコード生成(ダイスアプリ作成)の簡易テストをしました。

様々なコード生成専用のものも含めて、自分の使用可能な範囲のLLMを使用し、簡単なダイスアプリを作らせることで、実際の簡単なコード生成がどの程度できるか調査してみました。
題材が簡単すぎたせいか、どれも作成自体は成功しました(codellama-70b-instructのみ、一部機能が保存場所の指示を聞いてくれなかったのですが、使う人ももはやいないLLMなので、粘らずにテストを終了しました)が、ゆらぎの範囲かもしれませんが、細かい違いはありました。
追記:2024/04/18、Mixtral8x22b-Inst-FWテスト追加。
追記:2024/05/14、GPT-4oを追加。


テスト方法

指示プロンプトは
「Pythonでgui付きのダイスアプリを作成してください。ダイスの面数と個数を入力可能で、ロールボタンで、ダイスを振り、結果を表示。ダイスの合計値と、平均値も表示してください。また、その結果をタイムスタンプとともにlogに保存されるようにしてください。」
で、これで保存フォルダがユーザーフォルダに作られてしまった場合は、以下の追加指示を出しました。
「◯◯が保存されるフォルダは、実行ファイルと同じフォルダになるようにしてください。」
◯◯は最初の指示で出力されたlogやtxt名にしました。
ユーザーフォルダに作る挙動は、指示からすれば別に問題がある挙動ではないため、減点はしていません。
コマンドプロンプトにエラーログがでてしまった場合は、それを伝えて修正を促しました。
また、1度目のトライで、明らかに調子が良くない時はスレッドを新しくしたり、リジェネレイトを1回までしました。

テスト結果

テスト結果

 この点数は個人的な好みで付けたものに過ぎないので、参考程度にしてください。

 CodeQwen1_5-7b-chatは7Bサイズとしてだけでなく、コード生成能力としても今回のテストの範囲では最高のものでした。日本語の応答も完璧で、ローカルで使用する場合は最有力候補です。ただし、量子化すると余計に)をつけまくって、機能しなかったりでダメだったので、量子化無しで動かす必要があり、VRAM24GBのGPUが実用には必要なのは厳しいところです。

 DeepSeek-Coder-33B-Tはアプリは日本語が使用されませんでしたが、応答は日本語なので、十分実用的ですし、コードは極めてシンプルで最軽量でした。

 GPT4-Turboは240409の最新版で性能が上がったのか、コードの出力はとてもよかったです。
https://note.com/willplion/n/ndda155ca73e2
こちらのbartimerの作成でも、Claude3-Opusでは解決できなかった問題を解決してくれたりと、速度が遅いことを除けばおすすめできます。

 Claude3-Opusは今ひとつ調子が良くなかったですが、有力な選択肢であることは間違い有りません。
#でのコードの説明がないため、40点と低くなっていますが、実用上の問題は有りません。

 Mistral-largeは日本人が選択する必要性は今回のテストでは感じませんでした。

 GeminiPro1.5はやりとりも親切なことと、現在は使用が無料なので、無料の間は有力な選択肢です。

 残りのLLMは特に使用する理由が個人的には見当たりません。
codellama-70b-instructはもはや性能的にもサイズ的にも使用者はいないと思われるため、結果も乗せていません。
mixtrail-8x22bはコードの生成には2回で成功しましたが、後半の説明文が壊れたりと、現状はWizardLM-28x22Bを待ったほうが良いでしょう。
追記:2024/04/18、Mixtral8x22b-Inst-FWは日本語で応答してくれるのでMistral-largeよりいいかも。
追記:2024/05/14、GPT-4oですが、応答は日本語ですが、アプリやログが英語になったことで、評価を下げましたが、コード生成自体には問題はありませんでした。応答速度が極めて早く、待ち時間が大幅に短縮されるため、利用できるのであれば、第一候補に上がる性能です。

GPT-4oの寸評

GPT-4o

生成結果は以下のリンク先の通りです。

https://www.perplexity.ai/search/Pythonguilog-3IMw98i4Re2QLf8J8R27iQ

コードを分けて出してきたので、まとめてもらうことになりましたが、実質一回で生成に成功しています。
各項目は今回はGPT4turboと異なり、英語となってしまいました。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_log.txtに保存され以下のような形式になる。
2024-05-14 11:13:15 - 10d10: 4, 9, 2, 3, 10, 7, 1, 7, 10, 3 (Total: 56, Average: 5.60)
エラー表示はないが、コードは短く、出力は分けてされたように実用的。
コードに説明もある点は良い。
評価としては40点だが、出力やGUIが英語なら評点は高くなった。
コード生成速度が極めて早いため、待ち時間も短縮できるため、生産性向上に寄与しそうです。現時点で一番オススメです。

Claude3-Opusの寸評

Claude3-Opus

一度目の生成は調子が悪く以下のリンクのように
https://www.perplexity.ai/search/Pythonguilog-Mg_YK15eTSSfZ8sA.Lf3vw
4回も生成にかかってしまったため、やり直した。
2回目は保存箇所の修正を含めて2回の生成で完成した。
https://www.perplexity.ai/search/Pythonguilog-kGSXuS9USeier.wjR71.dQ

各項目は日本語で表記され、その点は高く評価。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_log.txtに保存され以下のような形式になる。
2024-04-17 19:54:33 - ダイスの面数: 10, ダイスの個数: 10, 結果: [7, 1, 4, 1, 7, 7, 3, 4, 2, 5], 合計: 41, 平均: 4.10
エラー表示があり、このアプリで入力欄が整数でない場合にエラーを表示する必要があるかと言うと疑問だが、親切ではある。
その分、コードは長めになってしまっている。
評価としては40点

GPT4-Turbo240409の寸評

GPT4-Turbo240409

以下のリンクのように一回目で完璧に成功。
https://www.perplexity.ai/search/Pythonguilog-qbQHQcmPTguMZ.TN46v6mw

ロールボタンが英語でRollとなってしまった以外は日本語。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_log.txtに保存され以下のような形式になる。
2024-04-17 20:06:10 - 面数: 10, 個数: 10, 結果: [3, 6, 5, 2, 9, 6, 3, 4, 9, 2], 合計: 49, 平均: 4.90
エラー表示はないため、その分コードはシンプルで綺麗。
各項目に# 日本語で解説もあり、親切。
評価としては48点

Mistral-largeの寸評

Mistral-large

以下のリンクのようにニ回でコードを生成。
https://www.perplexity.ai/search/Pythonguilog-B7.qm8PbTnqV6G.R6B7wgQ
コード自体は一回で出来たと言ってもいいのだが、バラバラのコードで出してきたため、まとめて出すように指示が必要だった。
回答もGUIや他の要素も全て英語。おそらく、コード生成を担当しているエキスパートが日本語をほとんど学習してないのではないだろうか?日本人としてはあまり使いやすいとは言えない。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_rolls.logに保存され以下のような形式になる。
2024-04-17 20:18:18.859078: Rolls: [4, 2, 8, 7, 6, 10, 7, 4, 1, 6], Total: 55, Average: 5.5
ログももちろん英語なのだが、マイクロ秒?まであり、秒数がかぶる可能性がない点は評価。
コード自体はシンプル。
各項目に# 英語で解説もあり、親切。
評価は38点

GeminiPro1.5の寸評

GeminiPro1.5

コードは保存箇所の修正を含めて2回の生成で終了したが、2回目は修正事項のみだったため、手作業で修正を行った。もちろん、3回目に「修正点を含めて、コード全文を出力してください。」でやってくれたが…
やり取りは一番下に掲載しておきます。
各項目は日本語で表記され、その点は高く評価。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_log.txtに保存され以下のような形式になる。
2024-04-17 20:33:27 - 結果: [5, 8, 10, 9, 6, 10, 4, 4, 4, 7], 合計: 67, 平均: 6.70
エラー表示はあるが、デフォルト数が設定されているため、入力欄を空欄にしてロールしない限り無意味な機能であり、はっきりいって無駄。
そのため、コードは無駄に長い。
各項目に# 日本語で解説もあり、親切。
評価は42点

CommandR+の寸評

CommandR+

1回目の生成でエラーが出たため、一度リジェネレイトしたが同じエラーが発生したため、エラーを伝え、更にコード的に保存場所がユーザーフォルダだったため、まとめて保存場所の指示も出したが、それは修正されず、はっきりいって今回テストしたものの中では最低の性能だった。以下のリンクはCohereにアカウントがないと見られませんのでご注意ください。
https://coral.cohere.com/share/ac189f01-3c67-4ed2-81be-00a6210d0989
エラーのpyがCodeQwen1_5-7b-chat-q8_0gguf.pyなのは、面倒くさいので最初テストしてダメだったCodeQwen1_5-7b-chat-q8_0ggufのコードに上書きでやってたためなので気にしないでください。
各項目は全て英語にされていてダメ。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_rolls.logに保存され以下のような形式になる。
2024-04-17 20:52:57: 9, 10, 9, 4, 10, 4, 7, 7, 6, 6 (Total: 72, Average: 7.20)
エラー表示があり、このアプリで入力欄が整数でない場合にエラーを表示する必要があるかと言うと疑問だが、親切ではある。
コードはシンプル。
評価は28点

RekaCore(Poe)の寸評

RekaCore(Poe)

RekaCore本家が重くてエラーが出て使用できなかったため、PoeのRekaCoreを使用して作成したので、本家とは違う可能性はある。
以下のリンクのようにコードは保存箇所の修正を含めて2回の生成で終了したが、2回目は修正事項のみだったため、手作業で修正を行った。3回目は無料ではポイントが超えてしまった為試してないが、全文出すようにお願いすれば作ってくれただろう。

各項目は全て英語にされていてダメ。
GUIはダイスの個数が増えても広がることはなく良好だが、ダイスの結果自体ははみ出てしまって見えなくなる点は問題。
ログはdice_roll.logに保存され以下のような形式になる。
2024-04-17 21:07:52,340 - Wed Apr 17 21:07:52 2024 - Rolled 10 10-sided dice: [7, 1, 1, 7, 1, 8, 9, 6, 6, 7], Total: 53, Average: 5.3
dice_roll.logに保存するのはこのLLMだけだった。ミリ秒まであるのは評価するが、無駄に時間が重複してるのはいただけない。
エラー表示はない。
コードはimport loggingを使用した唯一のLLM。ややコードは長め。
評価は31点

CodeQwen1_5-7b-chatの寸評

CodeQwen1_5-7b-chat

今回コード生成のテストをしようと思ったのはこれがリリースされたからです。
リリースノートはこちらを見てください。
コード生成のテストはこちらからできます。
はっきりいって、これが7Bサイズなのは驚きとしか言いようがなく、やり取りも全部日本語。
一番下にやり取りがどういうものだったかのログも貼っておきますので、ご確認ください。
コードは保存箇所の修正を含めて2回の生成で完成した。
各項目は日本語で表記され、その点は高く評価。
GUIは一番優れていて、ダイスの個数で広がることもない。結果が結果表示欄に収まらない時はスクロールできる。ただし、ウィンドウサイズをマウスのドラッグアンドドロップで広げても結果表示欄のサイズは固定なのが残念。
ログはdice_log.txtに保存され以下のような形式になる。
2024/04/17 21:22:32 - 10個の10面ダイス - 結果: [9, 3, 1, 2, 1, 8, 7, 8, 3, 6], 合計: 48, 平均: 4.8
エラー表示はない。
その分、コード長は普通。
各項目に# 日本語で解説もあり、親切。
評価としては56点
余談だが、最初、公式デモがエラーで出来なかった時にローカルで動かした8bit量子化版は全然ダメだったので、量子化の影響を実感出来たのは良かった。

DeepSeek-Coder-33B-Tの寸評

DeepSeek-Coder-33B-T

以下のリンクの通り、コードは保存箇所の修正を含めて2回の生成で完成した。
https://poe.com/s/bOljq9S9bV26IKeCfvLX
各項目は全て英語にされていてダメ。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_rolls.logに保存され以下のような形式になる。
2024-04-17 21:46:06.211723: Rolled 10d10 -> [4, 4, 1, 9, 7, 7, 3, 8, 5, 5] (Total: 53, Average: 5.30)
ログももちろん英語なのだが、マイクロ秒?まであり、秒数がかぶる可能性がない点は評価。
エラー表示はない。
コードは極めてシンプルで綺麗。
評価としては34点と低くなるが、コードの短さは魅力的で簡単なアプリなら有力候補。

dbrx-instructの寸評

dbrx-instruct

コードは保存箇所の修正を含めて2回の生成で完成した。Perplexity Labsで作成したため、リンクはないのでログを一番下に貼ります。
やり取りは、最初は日本語、2回目は英語で出力された。
各項目は全て英語にされていてダメ。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_rolls.logに保存され以下のような形式になる。
2024-04-17 21:53:14 - Rolling 10 dice with 10 sides: [5, 10, 5, 2, 5, 8, 1, 8, 10, 6], Total: 60, Average: 6.00
エラー表示はない。
コードはシンプル。
評価としては28点と低くなるが、実用上の問題はない。

なおページの画像はStableCascadeを使用して、We conducted a simple test of Python code generation (dice app creation) with 9 different LLMs., masterpiece, best qualityという、適当すぎるプロンプトで出力した画像。

Mixtral8x22b-Inst-FWの寸評

Mixtral8x22b-Inst-FW

Poeが2024/04/18早速、Mixtral8x22b-Inst-FWを使用可能にしてくれていたのでテストした所、以下のリンクの通り、コードは1回の生成で完成した。
https://poe.com/s/57GLgd9wL6CxlRGek3ZV
やり取りは、日本語で出力された。
各項目は全て英語にされていてダメ。
GUIは出来が今一つで、ダイスの個数が多い場合はウィンドウが勝手に伸びてしまう。
ログはdice_rolls.csvに保存され以下のような形式になる。
2024-04-18T08:25:00.259656,"[9, 7, 6, 2, 6, 5, 5, 5, 7, 5]",57,5.7
ログももちろん英語なのだが、マイクロ秒?まであり、秒数がかぶる可能性がない点は評価。
エラー表示はない。
コードはシンプル。csvでの出力が特徴。
各項目に# 日本語で解説もあり、親切。
評価としては40点で、Mistral-largeより良かった。

GeminiPro1.5のやり取り

User

Pythonでgui付きのダイスアプリを作成してください。ダイスの面数と個数を入力可能で、ロールボタンで、ダイスを振り、結果を表示。ダイスの合計値と、平均値も表示してください。また、その結果をタイムスタンプとともにlogに保存されるようにしてください。

Model

Pythonでダイスアプリを作成

このアプリを作るには、PythonのGUIライブラリであるTkinterと、ランダム数値生成のためのrandomモジュールを使います。

      import tkinter as tk
from tkinter import ttk
import random
from datetime import datetime

class DiceApp:
    def __init__(self, master):
        self.master = master
        master.title("ダイスローラー")

        # 入力フレーム
        input_frame = ttk.Frame(master)
        input_frame.pack(pady=10)

        # ダイス面数ラベルと入力
        ttk.Label(input_frame, text="面数:").grid(row=0, column=0, padx=5)
        self.sides_entry = ttk.Entry(input_frame)
        self.sides_entry.insert(0, "6")  # デフォルト値
        self.sides_entry.grid(row=0, column=1, padx=5)

        # ダイス個数ラベルと入力
        ttk.Label(input_frame, text="個数:").grid(row=1, column=0, padx=5)
        self.num_dice_entry = ttk.Entry(input_frame)
        self.num_dice_entry.insert(0, "1")  # デフォルト値
        self.num_dice_entry.grid(row=1, column=1, padx=5)

        # ロールボタン
        roll_button = ttk.Button(master, text="ロール", command=self.roll_dice)
        roll_button.pack(pady=10)

        # 結果フレーム
        self.result_frame = ttk.Frame(master)
        self.result_frame.pack()

        # 結果ラベル
        self.result_label = ttk.Label(self.result_frame, text="")
        self.result_label.pack()

    def roll_dice(self):
        try:
            num_sides = int(self.sides_entry.get())
            num_dice = int(self.num_dice_entry.get())

            rolls = [random.randint(1, num_sides) for _ in range(num_dice)]
            total = sum(rolls)
            average = total / num_dice

            result_text = f"結果: {rolls}\n合計: {total}\n平均: {average:.2f}"
            self.result_label.config(text=result_text)

            self.log_result(rolls, total, average)

        except ValueError:
            self.result_label.config(text="無効な入力です")

    def log_result(self, rolls, total, average):
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_text = f"{timestamp} - 結果: {rolls}, 合計: {total}, 平均: {average:.2f}\n"
        with open("dice_log.txt", "a") as f:
            f.write(log_text)

root = tk.Tk()
app = DiceApp(root)
root.mainloop()
    

Use code with caution.Python

説明:

  1. Tkinterのインポート: tkinterとttkをインポートします。

  2. その他モジュールのインポート: randomモジュールをダイスロールに使用し、datetimeモジュールをタイムスタンプに使用します。

  3. DiceAppクラス: GUIの要素とロジックを管理します。

  4. コンストラクタ:

    • 入力フィールド(面数と個数)とボタンを作成します。

    • 結果を表示するためのラベルを作成します。

  5. roll_dice関数:

    • 入力値を読み込み、エラー処理を行います。

    • 指定された数だけダイスを振り、結果を計算します。

    • 結果ラベルを更新し、結果をログに記録します。

  6. log_result関数:

    • タイムスタンプと共に結果をdice_log.txtファイルに書き込みます。

  7. メインループ: Tkinterのメインループを開始してGUIを表示します。

使い方:

  • アプリを実行すると、ウィンドウが表示されます。

  • 面数とダイスの数を入力します。

  • "ロール"ボタンをクリックすると、結果が表示されます。

  • 結果は dice_log.txt に記録されます。

User

dice_log.txtが保存されるフォルダは、実行ファイルと同じフォルダになるようにしてください。

Model

ログファイルの保存場所を調整

現在のディレクトリ(実行ファイルと同じフォルダ)に dice_log.txt を保存するには、Pythonの os モジュールを使います。

      import os
# ... (他のコードは同じ) ...

    def log_result(self, rolls, total, average):
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_text = f"{timestamp} - 結果: {rolls}, 合計: {total}, 平均: {average:.2f}\n"
        
        # 現在のディレクトリを取得
        current_dir = os.path.dirname(os.path.abspath(__file__))
        
        # ログファイルのパスを作成
        log_file_path = os.path.join(current_dir, "dice_log.txt")
        
        with open(log_file_path, "a") as f:
            f.write(log_text)
    

Use code with caution.Python

変更点:

  1. osモジュールのインポート: os モジュールをインポートします。

  2. log_result関数内:

    • os.path.dirname(os.path.abspath(__file__)) を使って、現在の Python ファイルのディレクトリパスを取得します。

    • os.path.join を使って、ディレクトリパスとファイル名を結合し、完全なログファイルパスを作成します。

    • with open(...) でログファイルを開く際に、作成した log_file_path を使用します。

これで、dice_log.txt は常に実行ファイルと同じフォルダに保存されるようになります。

User

修正点を含めて、コード全文を出力してください。

Model

完成したコード (修正点を含む)

      import tkinter as tk
from tkinter import ttk
import random
from datetime import datetime
import os

class DiceApp:
    def __init__(self, master):
        self.master = master
        master.title("ダイスローラー")

        # 入力フレーム
        input_frame = ttk.Frame(master)
        input_frame.pack(pady=10)

        # ダイス面数ラベルと入力
        ttk.Label(input_frame, text="面数:").grid(row=0, column=0, padx=5)
        self.sides_entry = ttk.Entry(input_frame)
        self.sides_entry.insert(0, "6")  # デフォルト値
        self.sides_entry.grid(row=0, column=1, padx=5)

        # ダイス個数ラベルと入力
        ttk.Label(input_frame, text="個数:").grid(row=1, column=0, padx=5)
        self.num_dice_entry = ttk.Entry(input_frame)
        self.num_dice_entry.insert(0, "1")  # デフォルト値
        self.num_dice_entry.grid(row=1, column=1, padx=5)

        # ロールボタン
        roll_button = ttk.Button(master, text="ロール", command=self.roll_dice)
        roll_button.pack(pady=10)

        # 結果フレーム
        self.result_frame = ttk.Frame(master)
        self.result_frame.pack()

        # 結果ラベル
        self.result_label = ttk.Label(self.result_frame, text="")
        self.result_label.pack()

    def roll_dice(self):
        try:
            num_sides = int(self.sides_entry.get())
            num_dice = int(self.num_dice_entry.get())

            rolls = [random.randint(1, num_sides) for _ in range(num_dice)]
            total = sum(rolls)
            average = total / num_dice

            result_text = f"結果: {rolls}\n合計: {total}\n平均: {average:.2f}"
            self.result_label.config(text=result_text)

            self.log_result(rolls, total, average)

        except ValueError:
            self.result_label.config(text="無効な入力です")

    def log_result(self, rolls, total, average):
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_text = f"{timestamp} - 結果: {rolls}, 合計: {total}, 平均: {average:.2f}\n"

        # 現在のディレクトリを取得
        current_dir = os.path.dirname(os.path.abspath(__file__))

        # ログファイルのパスを作成
        log_file_path = os.path.join(current_dir, "dice_log.txt")

        with open(log_file_path, "a") as f:
            f.write(log_text)

root = tk.Tk()
app = DiceApp(root)
root.mainloop()
    

CodeQwen1_5-7b-chatのやり取り

Pythonでgui付きのダイスアプリを作成してください。ダイスの面数と個数を入力可能で、ロールボタンで、ダイスを振り、結果を表示。ダイスの合計値と、平均値も表示してください。また、その結果をタイムスタンプとともにlogに保存されるようにしてください。

以下に、PythonでGUIつきのダイスアプリを作成するためのサンプルコードを示します。このアプリはTkinterを利用してGUIを生成し、random.randint()関数を用いてダイスの結果を生成しています。

import tkinter as tk
from tkinter import messagebox
import random
import time

def roll_dice():
    # ダイスの面数と個数を取得
    num_sides = int(sides_entry.get())
    num_dice = int(dice_entry.get())

    # ダイスの結果を生成
    results = [random.randint(1, num_sides) for _ in range(num_dice)]

    # 結果を表示
    result_text.delete(1.0, tk.END)
    result_text.insert(tk.END, f"{num_dice}個の{num_sides}面ダイスを振りました: {results}\n")
    result_text.insert(tk.END, f"合計: {sum(results)}, 平均: {sum(results)/num_dice}\n")

    # 日時を取得
    now = time.strftime('%Y/%m/%d %H:%M:%S')

    # logに結果と日時を保存
    with open('dice_log.txt', 'a') as f:
        f.write(f"{now} - {num_dice}個の{num_sides}面ダイス - 結果: {results}, 合計: {sum(results)}, 平均: {sum(results)/num_dice}\n")

# GUIの生成
root = tk.Tk()
root.title('Dice Roller')

# ラベルと入力欄の生成
sides_label = tk.Label(root, text='ダイスの面数:')
sides_label.grid(row=0, column=0, padx=5, pady=5)
sides_entry = tk.Entry(root)
sides_entry.grid(row=0, column=1, padx=5, pady=5)

dice_label = tk.Label(root, text='ダイスの個数:')
dice_label.grid(row=1, column=0, padx=5, pady=5)
dice_entry = tk.Entry(root)
dice_entry.grid(row=1, column=1, padx=5, pady=5)

# 結果表示欄の生成
result_label = tk.Label(root, text='結果:')
result_label.grid(row=2, column=0, padx=5, pady=5)
result_text = tk.Text(root, height=5, width=30)
result_text.grid(row=3, column=0, columnspan=2, padx=5, pady=5)

# ロールボタンの生成
roll_button = tk.Button(root, text='ロール', command=roll_dice)
roll_button.grid(row=4, column=0, columnspan=2, padx=5, pady=5)

# 動作開始
root.mainloop()

このコードを実行すると、以下のGUIが表示されます。

ダイスの面数と個数を入力するための入力欄が表示されています。
「ロール」ボタンをクリックすると、入力された面数と個数に基づいてダイスの結果がランダムで表示され、合計と平均も計算されます。
結果が表示されるテキストエリアです。
結果と日時がlogファイル(この例では'dice_log.txt')に保存されます。

注意: このコードは、デフォルトでは現在のフォルダに'dice_log.txt'という名前のlogファイルを作成します。logファイルが既に存在する場合は、内容が上書きされます。logファイルへのアクセス権限が不足している場合、エラーが発生することがあります。

dice_log.txtは実行ファイルと同じフォルダに保存されるようにしてください。

以下に、PythonでGUIつきのダイスアプリを作成するためのサンプルコードを示します。このアプリはTkinterを利用してGUIを生成し、random.randint()関数を用いてダイスの結果を生成しています。

import tkinter as tk
from tkinter import messagebox
import random
import time
import os

def roll_dice():
    # ダイスの面数と個数を取得
    num_sides = int(sides_entry.get())
    num_dice = int(dice_entry.get())

    # ダイスの結果を生成
    results = [random.randint(1, num_sides) for _ in range(num_dice)]

    # 結果を表示
    result_text.delete(1.0, tk.END)
    result_text.insert(tk.END, f"{num_dice}個の{num_sides}面ダイスを振りました: {results}\n")
    result_text.insert(tk.END, f"合計: {sum(results)}, 平均: {sum(results)/num_dice}\n")

    # 日時を取得
    now = time.strftime('%Y/%m/%d %H:%M:%S')

    # logファイルへのパスを取得
    log_file = os.path.join(os.path.dirname(__file__), 'dice_log.txt')

    # logに結果と日時を保存
    with open(log_file, 'a') as f:
        f.write(f"{now} - {num_dice}個の{num_sides}面ダイス - 結果: {results}, 合計: {sum(results)}, 平均: {sum(results)/num_dice}\n")

# GUIの生成
root = tk.Tk()
root.title('Dice Roller')

# ラベルと入力欄の生成
sides_label = tk.Label(root, text='ダイスの面数:')
sides_label.grid(row=0, column=0, padx=5, pady=5)
sides_entry = tk.Entry(root)
sides_entry.grid(row=0, column=1, padx=5, pady=5)

dice_label = tk.Label(root, text='ダイスの個数:')
dice_label.grid(row=1, column=0, padx=5, pady=5)
dice_entry = tk.Entry(root)
dice_entry.grid(row=1, column=1, padx=5, pady=5)

# 結果表示欄の生成
result_label = tk.Label(root, text='結果:')
result_label.grid(row=2, column=0, padx=5, pady=5)
result_text = tk.Text(root, height=5, width=30)
result_text.grid(row=3, column=0, columnspan=2, padx=5, pady=5)

# ロールボタンの生成
roll_button = tk.Button(root, text='ロール', command=roll_dice)
roll_button.grid(row=4, column=0, columnspan=2, padx=5, pady=5)

# 動作開始
root.mainloop()

このコードを実行すると、以下のGUIが表示されます。

ダイスの面数と個数を入力するための入力欄が表示されています。
「ロール」ボタンをクリックすると、入力された面数と個数に基づいてダイスの結果がランダムで表示され、合計と平均も計算されます。
結果が表示されるテキストエリアです。
結果と日時が同じフォルダ内の'dice_log.txt'という名前のlogファイルに保存されます。

注意: このコードは、現在のフォルダパスを取得して、logファイルへのパスを生成しています。logファイルが既に存在する場合は、内容が上書きされます。logファイルへのアクセス権限が不足している場合、エラーが発生することがあります。

dbrx-instructのやり取り

Pythonでgui付きのダイスアプリを作成してください。ダイスの面数と個数を入力可能で、ロールボタンで、ダイスを振り、結果を表示。ダイスの合計値と、平均値も表示してください。また、その結果をタイムスタンプとともにlogに保存されるようにしてください。

こちらはPythonでGUI付きのダイスアプリを作成した例です。Tkinterライブラリを使用しています。

import tkinter as tk
import random
from datetime import datetime

def roll_dice():
    num_dice = int(entry_num_dice.get())
    num_sides = int(entry_num_sides.get())
    total = 0
    results = []
    for i in range(num_dice):
        result = random.randint(1, num_sides)
        total += result
        results.append(result)
    label_result.config(text=f"Results: {results}\nTotal: {total}\nAverage: {total/num_dice:.2f}")
    log_result(f"Rolling {num_dice} dice with {num_sides} sides: {results}, Total: {total}, Average: {total/num_dice:.2f}")

def log_result(result):
    with open("dice_log.txt", "a") as f:
        f.write(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - {result}\n")

root = tk.Tk()
root.title("Dice App")

frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

label_num_dice = tk.Label(frame, text="Number of Dice:")
label_num_dice.grid(row=0, column=0, padx=(0, 10))
entry_num_dice = tk.Entry(frame, width=10)
entry_num_dice.grid(row=0, column=1)

label_num_sides = tk.Label(frame, text="Number of Sides:")
label_num_sides.grid(row=1, column=0, padx=(0, 10))
entry_num_sides = tk.Entry(frame, width=10)
entry_num_sides.grid(row=1, column=1)

button_roll = tk.Button(frame, text="Roll", command=roll_dice)
button_roll.grid(row=2, column=0, columnspan=2, pady=(10, 0))

label_result = tk.Label(root, text="")
label_result.pack(pady=(10, 0))

root.mainloop()

このコードでは、Tkinterライブラリを使用してGUIを作成しています。ユーザーは「Number of Dice」フィールドと「Number of Sides」フィールドにダイスの面数と個数を入力できます。ロールボタンをクリックすると、ダイスを振り、結果、合計値、平均値を表示します。また、結果はタイムスタンプとともに「dice_log.txt」ファイルに保存されます。

dice_log.txtが保存されるフォルダは、実行ファイルと同じフォルダになるようにしてください。

Sure, the `dice_log.txt` file will be saved in the same folder as the executable file. Here's the updated code:

import tkinter as tk
import random
import os
from datetime import datetime

def roll_dice():
    num_dice = int(entry_num_dice.get())
    num_sides = int(entry_num_sides.get())
    total = 0
    results = []
    for i in range(num_dice):
        result = random.randint(1, num_sides)
        total += result
        results.append(result)
    label_result.config(text=f"Results: {results}\nTotal: {total}\nAverage: {total/num_dice:.2f}")
    log_result(f"Rolling {num_dice} dice with {num_sides} sides: {results}, Total: {total}, Average: {total/num_dice:.2f}")

def log_result(result):
    script_dir = os.path.dirname(os.path.realpath(__file__))
    log_file = os.path.join(script_dir, "dice_log.txt")
    with open(log_file, "a") as f:
        f.write(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - {result}\n")

root = tk.Tk()
root.title("Dice App")

frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

label_num_dice = tk.Label(frame, text="Number of Dice:")
label_num_dice.grid(row=0, column=0, padx=(0, 10))
entry_num_dice = tk.Entry(frame, width=10)
entry_num_dice.grid(row=0, column=1)

label_num_sides = tk.Label(frame, text="Number of Sides:")
label_num_sides.grid(row=1, column=0, padx=(0, 10))
entry_num_sides = tk.Entry(frame, width=10)
entry_num_sides.grid(row=1, column=1)

button_roll = tk.Button(frame, text="Roll", command=roll_dice)
button_roll.grid(row=2, column=0, columnspan=2, pady=(10, 0))

label_result = tk.Label(root, text="")
label_result.pack(pady=(10, 0))

root.mainloop()

In this updated code, the `os` library is used to get the directory of the executable file, and the `dice_log.txt` file is saved in that directory.


この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?