質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • Python

    8565questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6876questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pythonのプログラムの変数の扱いがよくわかりません

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 178

syoshinsha

score 22

・現在、私はpythonのtkinterを使って、いつどこで何をしたかみたいなのをランダムで選んで表示するプログラムを作ろうとしています。

・自分の認識が間違っているかもしれないんですけどこういうプログラムって上から下をグルグルとループしていると思ってるんですけど、そのせいかインスタンスを生成するたびにwhen=""が呼び出されて初期化されている気がするんですよ。だからprintでwhenを出力すると中身がちゃんと入っていて、labelのtextとして出力すると空になってしまいます。

・こういうときってどうすればよろしいのでしょうか?

#GUIに関するやつ
from tkinter import *
#randomとかやるやつ
from tkinter import ttk
import random

class Word:

    #ここが原因な気がする?
    when=""
    where=""
    who=""
    with_who=""
    how=""
    do=""

    when_list = [
        #省略
    ]

    where_list = [
       #省略
    ]

    who_list = [
       #省略
    ]

    how_list = [
       #省略
    ]

    do_list = [
       #省略
    ]

    #リストからランダムに入れるメソッド
    def buttonClick(self):
        self.setWhen(Word.when_list[random.randint(0,len(Word.when_list)-1)]+"に")
        self.setWhere(Word.where_list[random.randint(0, len(Word.where_list) - 1)]+"で")
        self.setWho(Word.who_list[random.randint(0, len(Word.who_list) - 1)]+"が")
        self.setWithWho(Word.who_list[random.randint(0, len(Word.who_list) - 1)]+"と")
        self.setHow(Word.how_list[random.randint(0, len(Word.how_list) - 1)])
        self.setDo(Word.do_list[random.randint(0, len(Word.do_list) - 1)])

        #変数の中身確認用のprint
        print(Word.when)
        print(Word.where)
        print(Word.who)
        print(Word.with_who)
        print(Word.how)
        print(Word.do)
        print("--------------")

    def setWhen(self,word):
        Word.when=word

    def getWhen(self):
        return Word.when

    def setWhere(self,where):
        Word.where=where

    def getWhere(self):
        return Word.where

    def setWho(self,who):
        Word.who=who

    def getWho(self):
        return Word.who

    def setWithWho(self,with_who):
        Word.with_who=with_who

    def getWithWho(self):
        return Word.with_who

    def setHow(self,how):
        Word.how=how

    def getHow(self):
        return Word.how

    def setDo(self,do):
        Word.do=do

    def getDo(self):
        return Word.do


if __name__=="__main__":

    word=Word()

    root = Tk()
    root.title("いつどこで・・・")

    #フレーム
    frame1 = ttk.Frame(
        root,
        height=300,
        width=500,
    )
    frame1.grid()

    #プログラムの題名みたいなのを描写する用ののラベル
    label_title = ttk.Label(
        frame1,
        text="「 いつどこでだれがだれとどのようになにをした 」",
        background=("#ffffff"),
        padding=(50, 5)
    )
    label_title.grid(row=0, column=0, padx=10, pady=10, columnspan=6)

    #「いつ」という文字を表示するようのラベル
    label_when = ttk.Label(
        frame1,
        text="いつ",
        background=("#ffff00"),
        padding=(50, 5)
    )
    label_when.grid(row=1, column=0, padx=10, pady=10)

     #「どこで」という文字を表示するようのラベル
    label_where = ttk.Label(
        frame1,
        text="どこで",
        background=("#1e90ff"),
        padding=(50, 5)
    )
    label_where.grid(row=1, column=1, padx=10, pady=10)

     #「だれが」という文字を表示するようのラベル
    label_who = ttk.Label(
        frame1,
        text="だれが",
        background=("#adff2f"),
        padding=(50, 5)
    )
    label_who.grid(row=1, column=2, padx=10, pady=10)

     #「だれと」という文字を表示するようのラベル
    label_with = ttk.Label(
        frame1,
        text="だれと",
        background=("#f08080"),
        padding=(50, 5)
    )
    label_with.grid(row=1, column=3, padx=10, pady=10)

     #「どのように」という文字を表示するようのラベル
    label_how = ttk.Label(
        frame1,
        text="どのように",
        background=("#ffa500"),
        padding=(50, 5)
    )
    label_how.grid(row=1, column=4, padx=10, pady=10)

     #「なにをした」という文字を表示するようのラベル
    label_do = ttk.Label(
        frame1,
        text="なにをした",
        background=("#da70d6"),
        padding=(50, 5)
    )
    label_do.grid(row=1, column=5, padx=10, pady=10)

    label_list = [word.getWhen(), word.getWhere(), word.getWho(), word.getWithWho(), word.getHow(), word.getDo()]

    label_answer = (ttk.Label(frame1), ttk.Label(frame1), ttk.Label(frame1),
                    ttk.Label(frame1), ttk.Label(frame1), ttk.Label(frame1))

    #結果を表示するよう
    for i in range(len(label_list)):
        label_answer[i]["text"] = label_list[i]
        label_answer[i]["background"] = ("#ffffff")
        label_answer[i]["padding"] = (50, 5)
        label_answer[i]["relief"] = "ridge"
        label_answer[i].grid(row=2, column=i, padx=10, pady=10)

    #関数を使うためのボタン
    button1 = ttk.Button(
        frame1,
        text="OK?",
        padding=(50, 5),
        #ボタンを押すとメソッドbuttonClickが行われる
        command=word.buttonClick

    )
    button1.grid(row=3, column=0, padx=10, pady=10, columnspan=6)

    root.mainloop()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

原因はWordクラスのbuttonClickの処理でLabelへの更新処理(Label.configure(text='文字列'))がないからだと思われますが。

私がこのプログラムを作るとしたら画面(UI)とデータは分けるので以下のような形になるかと。

  1. Wordクラスを変更
    1-1, __init__(self): を追加しwhen_list,where_list の初期化はそちらで行うように
    1-2. getXXX,setXXXは全部削除
    1-3. buttonClickは4WHDを生成してジェネレータを返すだけに。(あと関数名を変更)
    1-4. random.randintではなくrandom.choiceを使用するように変更
  2. ttk.Frameを管理するクラスMyFrameを作成
  3. 内部にWordのインスタンスを保持
  4. MyFramebuttonClick関数を新規に作成し、Wordクラスから(1)の処理の取得とLableの更新を行うように。

こんな感じでしょうか。
サンプルソースコードです。ご参考まで。

from tkinter import *
from tkinter import ttk
from random import choice


class Word(object):
    def __init__(self):
        self.when_list = ['今日', '明日']
        self.where_list = ['東京', '埼玉']
        self.who_list = ['私', 'あなた']
        self.with_who = ['東京', '埼玉']
        self.how_list = ['東京', '埼玉']
        self.do_list = ['東京', '埼玉']

    def get4WHD(self):
        yield choice(self.when_list)
        yield choice(self.where_list)
        yield choice(self.who_list)
        yield choice(self.with_who)
        yield choice(self.how_list)
        yield choice(self.do_list)



class MyFrame(ttk.Frame):
    def __init__(self, root):
        super().__init__(root, height=300, width=500)
        self.grid()
        self.word = Word()

        # プログラムの題名みたいなのを描写する用ののラベル
        self.label_title = ttk.Label(
            root,
            text="「 いつどこでだれがだれとどのようになにをした 」",
            background=("#ffffff"),
            padding=(50, 5)
        )
        self.label_title.grid(row=0, column=0, padx=10, pady=10, columnspan=6)

        # 「いつ」という文字を表示するようのラベル
        self.label_when = ttk.Label(
            root,
            text="いつ",
            background=("#ffff00"),
            padding=(50, 5)
        )
        self.label_when.grid(row=1, column=0, padx=10, pady=10)

        # 「どこで」という文字を表示するようのラベル
        self.label_where = ttk.Label(
            root,
            text="どこで",
            background=("#1e90ff"),
            padding=(50, 5)
        )
        self.label_where.grid(row=1, column=1, padx=10, pady=10)

        # 「だれが」という文字を表示するようのラベル
        self.label_who = ttk.Label(
            root,
            text="だれが",
            background=("#adff2f"),
            padding=(50, 5)
        )
        self.label_who.grid(row=1, column=2, padx=10, pady=10)

        # 「だれと」という文字を表示するようのラベル
        self.label_with = ttk.Label(
            root,
            text="だれと",
            background=("#f08080"),
            padding=(50, 5)
        )
        self.label_with.grid(row=1, column=3, padx=10, pady=10)

        # 「どのように」という文字を表示するようのラベル
        self.label_how = ttk.Label(
            root,
            text="どのように",
            background=("#ffa500"),
            padding=(50, 5)
        )
        self.label_how.grid(row=1, column=4, padx=10, pady=10)

        # 「なにをした」という文字を表示するようのラベル
        self.label_do = ttk.Label(
            root,
            text="なにをした",
            background=("#da70d6"),
            padding=(50, 5)
        )
        self.label_do.grid(row=1, column=5, padx=10, pady=10)
        # 結果を表示するよう
        self.label_answer = (ttk.Label(root), ttk.Label(root), ttk.Label(root),
                        ttk.Label(root), ttk.Label(root), ttk.Label(root))
        for i, l in enumerate(self.label_answer):
            l.configure(background=("#ffffff"),padding=(50, 5),relief="ridge")
            l.grid(row=2, column=i, padx=10, pady=10)
        self.set_answer()

        self.button1 = ttk.Button(
            self, text="OK?",padding=(50, 5),command=self.buttonClick)
        self.button1.grid(row=3, column=0, padx=10, pady=10, columnspan=6)

    def set_answer(self):
        for i, v in enumerate(self.word.get4WHD()):
            self.label_answer[i].configure(text=v)

    def buttonClick(self):
        self.set_answer()


def main() ->None:
    root = Tk()
    root.title("いつどこで・・・")
    f = MyFrame(root)
    root.mainloop()


if __name__ == '__main__':
    main()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 23:17

    回答ありがとうございます。Label.configureってどんな役割があって僕のプログラムだったらどこにいれればいいんですか?すみません無知で。

    キャンセル

  • 2018/04/21 23:23

    ありがとうございます。とても参考になりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    8565questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6876questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。