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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

2回答

1837閲覧

def の中で作ったラベルをほかのdefで消したい

X36107420

総合スコア11

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2021/06/12 14:05

defで作ったラベルをほかのdef内で消そうとすると「AttributeError: 'str' object has no attribute 'place_forget'」とでます。
プログラミングの説明…開始と同時に絵の画像が出て、「次の問題」と「確認」のボタンが出ます。
そして「確認」のボタンを押すと絵の{作者}と{名前}が出て(答えがあっていると正解と出る)その時に「次の問題」というボタンを消して(****place_forget()で消してます)、「次へ」というボタンを出します。この時に、「次へ」というボタンを押すと「AttributeError: 'str' object has no attribute 'place_forget'」とでます。このボタンを押したときに{作者}と{名前}と「次へ」というボタンを消したいです。(他のdef内で作ってます)
どうすれば解決しますか?
windwsです。

python

1import tkinter 2from tkinter import * 3from tkinter import ttk 4import time 5from PIL import Image, ImageTk 6from time import sleep 7import random 8import tkinter as tk 9import tkinter.font as f 10import tkinter.ttk as ttk 11import sys 12 13 14# windowを描画 15window = tkinter.Tk() 16# windowサイズを変更 17window.geometry("1300x750") 18 19# windowタイトルを設定 20window.title("美術") 21 22# 画像を表示するためのキャンバスの作成(黒で表示) 23canvas = tkinter.Canvas(bg = "white", width=1300, height=750) 24canvas.place(x=0, y=0) # 左上の座標を指定 25 26 27#!画像飛び出し 28# = Image.open(r'C:\Users\ktaku\Documents\programing\bizyutu.f\') 29karasu = Image.open(r'C:\Users\ktaku\Documents\programing\bizyutu.f\ゴッホ_カラスの群れ飛ぶ麦畑.png') 30himawari = Image.open(r'C:\Users\ktaku\Documents\programing\bizyutu.f\ゴッホ_ひまわり.png') 31kiiro = Image.open(r'C:\Users\ktaku\Documents\programing\bizyutu.f\ゴッホ_黄色い家.png') 32bareisyo = Image.open(r'C:\Users\ktaku\Documents\programing\bizyutu.f\ゴッホ_馬鈴薯を食べる人々.png') 33 34#?画像変数化 35# = ImageTk.PhotoImage() 36karasu = ImageTk.PhotoImage(karasu) 37himawari = ImageTk.PhotoImage(himawari) 38kiiro = ImageTk.PhotoImage(kiiro) 39bareisyo = ImageTk.PhotoImage(bareisyo) 40 41 42#TODO 変数置くとこ 43mondai = list(range(4)) #問題番号置く、ランダムで使う[0~ 44mondai_len = 0 #mondaiの長さ 45mondai_rn = 0 #mondaiの前から何番目使うか 46en_1 = 0 47gaka_1 = 0 48kotae ="" 49 50 51#!def文 52def tugihe(): 53 global kotae,tugi 54 kotae.place_forget() 55 tugi.place_forget() 56 bo = tk.Button(window, text='次の問題', font=("MSゴシック", "15", "bold"), foreground='blue', background='white',command = mondai_d) 57 bo.place(x=40,y=600) 58 59 60 61def mondai_d(): 62 global mondai,mondai_len,mondai_rn,kotae_1,kotae 63 print("kotae",kotae_1) 64 mondai.pop(mondai_rn) 65 print(kotae) 66 67 68 69 if mondai == []: 70 mondai = list(range(4)) 71 72 mondai_len = len(mondai)-1 73 74 mondai_rn = random.randint(0,mondai_len) 75 76 print(mondai_rn) 77 print(mondai[mondai_rn]) 78 syutudai() 79 kotae_1 = 0 80 81#ランダムで画像出す] 82def syutudai(): 83 global mondai,mondai_len,mondai_rn,kotae 84 canvas.delete("all") 85 #kotae.destroy() 86 87 88 if 0 == mondai[mondai_rn]: 89 canvas.create_image(90, 50, image=karasu,anchor=tkinter.NW) #画像出力 90 elif 1 == mondai[mondai_rn]: 91 canvas.create_image(90, 50, image=himawari,anchor=tkinter.NW) #画像出力 92 elif 2 == mondai[mondai_rn]: 93 canvas.create_image(90, 50, image=kiiro,anchor=tkinter.NW) #画像出力 94 elif 3 == mondai[mondai_rn]: 95 canvas.create_image(90, 50, image=bareisyo,anchor=tkinter.NW) #画像出力 96 97 98#答え合わせ 99def kaitou(): 100 global en,en_1,gaka,gaka_1,kotae_1,tugi,bo 101 bo.place_forget() 102 en_1 = en.get() 103 gaka_1 = gaka.get() 104 tugi = tk.Button(window, text='次へ', font=("MSゴシック", "15", "bold"), foreground='blue', background='white',command = tugihe) 105 tugi.place(x=950,y=560) 106 107 108 if 0 == mondai[mondai_rn]: 109 if "カラスの群れ飛ぶ麦畑" == en_1 and "ゴッホ" == gaka_1: 110 kotae = tk.Label(text=u"正解", font=("MSゴシック", "17", "bold"),foreground='red', background='white') 111 kotae.place(x=500, y=560) 112 print("正解") 113 else: 114 kotae = tk.Label(text=u"カラスの群れ飛ぶ麦畑・ゴッホ", font=("MSゴシック", "17", "bold"),foreground='red', background='white') 115 kotae.place(x=500, y=560) 116 print("カラスの群れ飛ぶ麦畑・ゴッホ") 117 118 119 120 elif 1 == mondai[mondai_rn]: 121 if "ひまわり" == en_1 and "ゴッホ" == gaka_1: 122 kotae = tk.Label(text=u"正解", font=("MSゴシック", "17", "bold"),foreground='red', background='white') 123 kotae.place(x=500, y=560) 124 print("正解") 125 else: 126 kotae = tk.Label(text=u"ひまわり・ゴッホ", font=("MSゴシック", "17", "bold"),foreground='red', background='white') 127 kotae.place(x=500, y=560) 128 print("ひまわり・ゴッホ") 129 130 131 elif 2 == mondai[mondai_rn]: 132 if "黄色い家" == en_1 and "ゴッホ" == gaka_1: 133 kotae = tk.Label(text=u"正解", font=("MSゴシック", "17", "bold"),foreground='red', background='white') 134 kotae.place(x=500, y=560) 135 print("正解") 136 else: 137 kotae = tk.Label(text=u"黄色い家・ゴッホ", font=("MSゴシック", "17", "bold"),foreground='red', background='white') 138 kotae.place(x=500, y=560) 139 print("黄色い家・ゴッホ") 140 141 elif 3 == mondai[mondai_rn]: 142 if "馬鈴薯を食べる人々" == en_1 and "ゴッホ" == gaka_1: 143 kotae = tk.Label(text=u"正解", font=("MSゴシック", "17", "bold"),foreground='red', background='white') 144 kotae.place(x=500, y=560) 145 print("正解") 146 else: 147 kotae = tk.Label(text=u"馬鈴薯を食べる人々・ゴッホ", font=("MSゴシック", "17", "bold"),foreground='red', background='white') 148 kotae.place(x=500, y=560) 149 print("馬鈴薯を食べる人々・ゴッホ") 150 151"""ラベルの置き換え方法調べる""" 152 153#TODOコード 154mondai_len = len(mondai)-1 155mondai_rn = random.randint(0,mondai_len) 156syutudai() 157 158 159print(kotae) 160 161#!表示 162#ラベル 163la = tk.Label(text=u"1問目", foreground='black', background='white') 164la.place(x=20, y=10) 165#次の問題(ボタン) 166bo = tk.Button(window, text='次の問題', font=("MSゴシック", "15", "bold"), foreground='blue', background='white',command = mondai_d) 167bo.place(x=40,y=600) 168 169saku_n = tk.Label(text=u"作品名", font=("MSゴシック", "15", "bold"),foreground='black', background='white') 170saku_n.place(x=350, y=600) 171 172en=tk.Entry(text="rann") 173en.place(x=450,y=600)#テキストボックス配置 174en.focus_set()#テキストボックスにフォーカスを当てる 175 176kotaeru = tk.Button(window, text='確認', font=("MSゴシック", "15", "bold"), foreground='red', background='white',command = kaitou) 177kotaeru.place(x=1000,y=600) 178 179gaka_n = tk.Label(text=u"画家の名前", font=("MSゴシック", "15", "bold"),foreground='black', background='white') 180gaka_n.place(x=700, y=600) 181 182 183gaka=tk.Entry(text="画家") 184gaka.place(x=850,y=600)#テキストボックス配置 185 186 187window.mainloop()

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

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

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

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

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

guest

回答2

0

def の中で作ったラベルをほかのdefで消したい

kaitou 関数内の kotae がローカル変数になってます。
global 宣言することで解消できます

diff

1def kaitou(): 2- global en,en_1,gaka,gaka_1,kotae_1,tugi,bo 3+ global en,en_1,gaka,gaka_1,kotae_1,tugi,bo,kotae 4

他の問題

pack_forget() は、レイアウト配置を解除するのみで
ウィジェット自体は残ってる状態です。

  • 質問毎に新規にウィジェットを生成するなら forget() で非表示ではなく destroy() で破棄する
  • forget() で非表示する場合は、テキスト内容を変更してウィジェットは再利用する。

投稿2021/06/13 06:01

teamikl

総合スコア8760

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

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

0

kotaeがグローバルスコープで文字列で初期化しているからです(kotae ="")。tk.Labelクラスにしてください。
tugiも同じく適切なクラスで初期化してください。

投稿2021/06/12 14:21

fukatani

総合スコア626

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問