230917 知識ゼロで始めるアプリ開発 #5

今回は

ウィンドウのサイズを一定に保ったまま、表示文は長さに併せてフォントサイズが変化する

という感じに改良を施していきます。
早速、ChatGPTに聞いてみました。

ってこら! あんまり聞いてばっかりでは何も成長せんやろうがい。
ということで、回答をチラ見してはしまいましたが、一旦記憶をリセットして自力でソースコードを解読していきます。

import tkinter as tk
import random

class WordApp:
    def __init__(self, root):
        self.root = root
        self.root.title("英単語ランダム表示アプリ")

        self.word_label = tk.Label(root, text="", font=("Helvetica", 24))
        self.word_label.pack(padx=20, pady=20)

        self.load_words()
        self.show_random_word()

        self.next_button = tk.Button(root, text="次の単語", command=self.show_random_word)
        self.next_button.pack()

    def load_words(self):
        try:
            with open("words.txt", "r") as file:
                self.words = [line.strip() for line in file.readlines()]
        except FileNotFoundError:
            self.words = ["No words found"]

    def show_random_word(self):
        random_word = random.choice(self.words)
        self.word_label.config(text=random_word)

if __name__ == "__main__":
    root = tk.Tk()
    app = WordApp(root)
    root.mainloop()

 

素人が見てわかることとしては、ここでフォントサイズが24で固定になってますね、

        self.word_label = tk.Label(root, text="", font=("Helvetica", 24))

ここが変動できるような設定にしたいですね。

でもウィンドウサイズを指定しているようなコードは無さそうですね…? 強いて言えば、

        self.word_label.pack(padx=20, pady=20)

padx, padyがなんとなくウィンドウサイズに関係していそうな感じはしています…?
いやでもわかんないです。

 

じゃあ一旦、フォントサイズを変動できるような設定を調べてみますか

office54.net

いきなり自動調整の設定を入れるのは難しそうなので、10pt-30ptの可変という感じで、試しにこうしてみましょう

        self.word_label = tk.Label(root, text="", font=("Helvetica", "10-30"))



エラーで動きませんでした。いやー、わかってはいたけどそんなに簡単ではなかった。
ということで再度ggり直し。

www.school.ctc-g.co.jp

一括で設定するには次のように書いてあげればいいそうです。

>>> import tkinter.font

>>> font = tkinter.font.Font

tkinter.fontをインポートしてあげた後、tkinter.font.Fontを使って、一括で指定したいフォントの情報を書くということになります。(詳しい書き方のイメージは後であげる図をご確認下さい。)


とのこと。おっけ、フォントを指定してあげよう。
ということで以下のように書き換えました。

import tkinter as tk
import random
import tkinter.font #変更

class WordApp:
    def __init__(self, root):
        self.root = root
        self.root.title("英単語ランダム表示アプリ")

        self.word_label = tk.Label(root, text="",  font = tkinter.font.Font) #変更
        self.word_label.pack(padx=20, pady=20)

        self.load_words()
        self.show_random_word()

        self.next_button = tk.Button(root, text="次の単語", command=self.show_random_word)
        self.next_button.pack()

    def load_words(self):
        try:
            with open("words.txt", "r") as file:
                self.words = [line.strip() for line in file.readlines()]
        except FileNotFoundError:
            self.words = ["No words found"]

    def show_random_word(self):
        random_word = random.choice(self.words)
        self.word_label.config(text=random_word)

if __name__ == "__main__":
    root = tk.Tk()
    app = WordApp(root)
    root.mainloop()

もうおわかりですね。
私、tkinter.font.Fontをどこの位置で定義すればよいかが全くわかっていないことに気づきました。

 


ちょっと心折れてしまったので、chatGPT が教えてくれた解答をカンニングします。
心折れるの早すぎでは()

ウィンドウサイズを固定し、単語の長さに応じてフォントサイズを変更するには、テキストのフォントサイズを調整する方法があります。以下のコードは、ウィンドウサイズを固定し、テキストのフォントサイズを単語の長さに応じて調整する方法を示しています。

```python
import tkinter as tk
import random

class WordApp:
    def __init__(self, root):
        self.root = root
        self.root.title("英単語ランダム表示アプリ")

        self.word_label = tk.Label(root, text="", font=("Helvetica", 24))
        self.word_label.pack(padx=20, pady=20, expand=True, fill="both")

        self.load_words()
        self.show_random_word()

        self.next_button = tk.Button(root, text="次の単語", command=self.show_random_word)
        self.next_button.pack()

    def load_words(self):
        try:
            with open("words.txt", "r") as file:
                self.words = [line.strip() for line in file.readlines()]
        except FileNotFoundError:
            self.words = ["No words found"]

    def show_random_word(self):
        random_word = random.choice(self.words)
        font_size = max(10, min(48, 400 // len(random_word)))  # 調整可能なフォントサイズの範囲を設定
        self.word_label.config(text=random_word, font=("Helvetica", font_size))

if __name__ == "__main__":
    root = tk.Tk()
    app = WordApp(root)
    root.geometry("400x200")  # ウィンドウのサイズを固定
    root.mainloop()
```

このコードでは、`self.word_label`の`font`オプションを設定する部分で、単語の長さに応じてフォントサイズが調整されます。フォントサイズはウィンドウの幅(400ピクセル)と単語の長さに比例して変更され、最小値は10、最大値は48に制限されています。ウィンドウサイズ自体は`root.geometry`で固定されています。

 

とのこと。いやぁ我ながら情けない。
ということで、とりあえず、このこのソースコードを保存して動かしてみます。

 

ウィンドウサイズに対してフォントが小さくなってしまいましたね…
これはこれでまだまだ修正の余地がありそうです。
とりあえず今日はここまで。