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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Python

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

Q&A

解決済

1回答

333閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2018/04/21 13:21

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

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

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

python

1#GUIに関するやつ 2from tkinter import * 3#randomとかやるやつ 4from tkinter import ttk 5import random 6 7class Word: 8 9 #ここが原因な気がする? 10 when="" 11 where="" 12 who="" 13 with_who="" 14 how="" 15 do="" 16 17 when_list = [ 18 #省略 19 ] 20 21 where_list = [ 22 #省略 23 ] 24 25 who_list = [ 26 #省略 27 ] 28 29 how_list = [ 30 #省略 31 ] 32 33 do_list = [ 34 #省略 35 ] 36 37 #リストからランダムに入れるメソッド 38 def buttonClick(self): 39 self.setWhen(Word.when_list[random.randint(0,len(Word.when_list)-1)]+"に") 40 self.setWhere(Word.where_list[random.randint(0, len(Word.where_list) - 1)]+"で") 41 self.setWho(Word.who_list[random.randint(0, len(Word.who_list) - 1)]+"が") 42 self.setWithWho(Word.who_list[random.randint(0, len(Word.who_list) - 1)]+"と") 43 self.setHow(Word.how_list[random.randint(0, len(Word.how_list) - 1)]) 44 self.setDo(Word.do_list[random.randint(0, len(Word.do_list) - 1)]) 45 46 #変数の中身確認用のprint 47 print(Word.when) 48 print(Word.where) 49 print(Word.who) 50 print(Word.with_who) 51 print(Word.how) 52 print(Word.do) 53 print("--------------") 54 55 def setWhen(self,word): 56 Word.when=word 57 58 def getWhen(self): 59 return Word.when 60 61 def setWhere(self,where): 62 Word.where=where 63 64 def getWhere(self): 65 return Word.where 66 67 def setWho(self,who): 68 Word.who=who 69 70 def getWho(self): 71 return Word.who 72 73 def setWithWho(self,with_who): 74 Word.with_who=with_who 75 76 def getWithWho(self): 77 return Word.with_who 78 79 def setHow(self,how): 80 Word.how=how 81 82 def getHow(self): 83 return Word.how 84 85 def setDo(self,do): 86 Word.do=do 87 88 def getDo(self): 89 return Word.do 90 91 92if __name__=="__main__": 93 94 word=Word() 95 96 root = Tk() 97 root.title("いつどこで・・・") 98 99 #フレーム 100 frame1 = ttk.Frame( 101 root, 102 height=300, 103 width=500, 104 ) 105 frame1.grid() 106 107 #プログラムの題名みたいなのを描写する用ののラベル 108 label_title = ttk.Label( 109 frame1, 110 text="「 いつどこでだれがだれとどのようになにをした 」", 111 background=("#ffffff"), 112 padding=(50, 5) 113 ) 114 label_title.grid(row=0, column=0, padx=10, pady=10, columnspan=6) 115 116 #「いつ」という文字を表示するようのラベル 117 label_when = ttk.Label( 118 frame1, 119 text="いつ", 120 background=("#ffff00"), 121 padding=(50, 5) 122 ) 123 label_when.grid(row=1, column=0, padx=10, pady=10) 124 125 #「どこで」という文字を表示するようのラベル 126 label_where = ttk.Label( 127 frame1, 128 text="どこで", 129 background=("#1e90ff"), 130 padding=(50, 5) 131 ) 132 label_where.grid(row=1, column=1, padx=10, pady=10) 133 134 #「だれが」という文字を表示するようのラベル 135 label_who = ttk.Label( 136 frame1, 137 text="だれが", 138 background=("#adff2f"), 139 padding=(50, 5) 140 ) 141 label_who.grid(row=1, column=2, padx=10, pady=10) 142 143 #「だれと」という文字を表示するようのラベル 144 label_with = ttk.Label( 145 frame1, 146 text="だれと", 147 background=("#f08080"), 148 padding=(50, 5) 149 ) 150 label_with.grid(row=1, column=3, padx=10, pady=10) 151 152 #「どのように」という文字を表示するようのラベル 153 label_how = ttk.Label( 154 frame1, 155 text="どのように", 156 background=("#ffa500"), 157 padding=(50, 5) 158 ) 159 label_how.grid(row=1, column=4, padx=10, pady=10) 160 161 #「なにをした」という文字を表示するようのラベル 162 label_do = ttk.Label( 163 frame1, 164 text="なにをした", 165 background=("#da70d6"), 166 padding=(50, 5) 167 ) 168 label_do.grid(row=1, column=5, padx=10, pady=10) 169 170 label_list = [word.getWhen(), word.getWhere(), word.getWho(), word.getWithWho(), word.getHow(), word.getDo()] 171 172 label_answer = (ttk.Label(frame1), ttk.Label(frame1), ttk.Label(frame1), 173 ttk.Label(frame1), ttk.Label(frame1), ttk.Label(frame1)) 174 175 #結果を表示するよう 176 for i in range(len(label_list)): 177 label_answer[i]["text"] = label_list[i] 178 label_answer[i]["background"] = ("#ffffff") 179 label_answer[i]["padding"] = (50, 5) 180 label_answer[i]["relief"] = "ridge" 181 label_answer[i].grid(row=2, column=i, padx=10, pady=10) 182 183 #関数を使うためのボタン 184 button1 = ttk.Button( 185 frame1, 186 text="OK?", 187 padding=(50, 5), 188 #ボタンを押すとメソッドbuttonClickが行われる 189 command=word.buttonClick 190 191 ) 192 button1.grid(row=3, column=0, padx=10, pady=10, columnspan=6) 193 194 root.mainloop()

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

原因は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を使用するように変更
0. ttk.Frameを管理するクラスMyFrameを作成
0. 内部にWordのインスタンスを保持
0. MyFramebuttonClick関数を新規に作成し、Wordクラスから(1)の処理の取得とLableの更新を行うように。

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

Python

1from tkinter import * 2from tkinter import ttk 3from random import choice 4 5 6class Word(object): 7 def __init__(self): 8 self.when_list = ['今日', '明日'] 9 self.where_list = ['東京', '埼玉'] 10 self.who_list = ['私', 'あなた'] 11 self.with_who = ['東京', '埼玉'] 12 self.how_list = ['東京', '埼玉'] 13 self.do_list = ['東京', '埼玉'] 14 15 def get4WHD(self): 16 yield choice(self.when_list) 17 yield choice(self.where_list) 18 yield choice(self.who_list) 19 yield choice(self.with_who) 20 yield choice(self.how_list) 21 yield choice(self.do_list) 22 23 24 25class MyFrame(ttk.Frame): 26 def __init__(self, root): 27 super().__init__(root, height=300, width=500) 28 self.grid() 29 self.word = Word() 30 31 # プログラムの題名みたいなのを描写する用ののラベル 32 self.label_title = ttk.Label( 33 root, 34 text="「 いつどこでだれがだれとどのようになにをした 」", 35 background=("#ffffff"), 36 padding=(50, 5) 37 ) 38 self.label_title.grid(row=0, column=0, padx=10, pady=10, columnspan=6) 39 40 # 「いつ」という文字を表示するようのラベル 41 self.label_when = ttk.Label( 42 root, 43 text="いつ", 44 background=("#ffff00"), 45 padding=(50, 5) 46 ) 47 self.label_when.grid(row=1, column=0, padx=10, pady=10) 48 49 # 「どこで」という文字を表示するようのラベル 50 self.label_where = ttk.Label( 51 root, 52 text="どこで", 53 background=("#1e90ff"), 54 padding=(50, 5) 55 ) 56 self.label_where.grid(row=1, column=1, padx=10, pady=10) 57 58 # 「だれが」という文字を表示するようのラベル 59 self.label_who = ttk.Label( 60 root, 61 text="だれが", 62 background=("#adff2f"), 63 padding=(50, 5) 64 ) 65 self.label_who.grid(row=1, column=2, padx=10, pady=10) 66 67 # 「だれと」という文字を表示するようのラベル 68 self.label_with = ttk.Label( 69 root, 70 text="だれと", 71 background=("#f08080"), 72 padding=(50, 5) 73 ) 74 self.label_with.grid(row=1, column=3, padx=10, pady=10) 75 76 # 「どのように」という文字を表示するようのラベル 77 self.label_how = ttk.Label( 78 root, 79 text="どのように", 80 background=("#ffa500"), 81 padding=(50, 5) 82 ) 83 self.label_how.grid(row=1, column=4, padx=10, pady=10) 84 85 # 「なにをした」という文字を表示するようのラベル 86 self.label_do = ttk.Label( 87 root, 88 text="なにをした", 89 background=("#da70d6"), 90 padding=(50, 5) 91 ) 92 self.label_do.grid(row=1, column=5, padx=10, pady=10) 93 # 結果を表示するよう 94 self.label_answer = (ttk.Label(root), ttk.Label(root), ttk.Label(root), 95 ttk.Label(root), ttk.Label(root), ttk.Label(root)) 96 for i, l in enumerate(self.label_answer): 97 l.configure(background=("#ffffff"),padding=(50, 5),relief="ridge") 98 l.grid(row=2, column=i, padx=10, pady=10) 99 self.set_answer() 100 101 self.button1 = ttk.Button( 102 self, text="OK?",padding=(50, 5),command=self.buttonClick) 103 self.button1.grid(row=3, column=0, padx=10, pady=10, columnspan=6) 104 105 def set_answer(self): 106 for i, v in enumerate(self.word.get4WHD()): 107 self.label_answer[i].configure(text=v) 108 109 def buttonClick(self): 110 self.set_answer() 111 112 113def main() ->None: 114 root = Tk() 115 root.title("いつどこで・・・") 116 f = MyFrame(root) 117 root.mainloop() 118 119 120if __name__ == '__main__': 121 main()

投稿2018/04/21 13:54

編集2018/04/21 19:01
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/21 14:17

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

退会済みユーザー

2018/04/21 14:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問