tkinterのウィジェットの配置を関数にして呼び出そうと引数を渡すと
AttributeError
'NoneType' object has no attribute 'place'と表示されます
label_nameのところがなぜかnoneになります
発生している問題・エラーメッセージ
AttributeError
1'NoneType' object has no attribute 'place' 2 File "/Users/taiki/Desktop/Integral.py", line 77, in label_placcement 3 label_name.place(x=x_coord,y=y_coord) 4 File "/Users/taiki/Desktop/Integral.py", line 116, in <module> 5 label_placcement(label_1,400,50) 6エラーメッセージ
該当のソースコード
import
1import tkinter.ttk as ttk 2from sympy import * 3import pandas as pd 4import numpy as np 5import random 6import matplotlib.pyplot as plt 7from sympy.matrices import common 8 9#シンボルを定義 10x = Symbol("x") 11y = Symbol("y") 12z = Symbol("z") 13a = Symbol("a") 14b = Symbol("b") 15c = Symbol("c") 16 17#基礎問題生成 18for i in range(10): 19 Question_No = random.randint(1,3) 20 Val_No_1 = random.randint(1,9) 21 Val_No_2 = random.randint(1,9) 22 Val_No_3 = random.randint(1,9) 23 if Question_No == 1: 24 if Val_No_1 == 1: 25 Integ = x 26 ans = integrate(Integ) 27 out_Integ = "∮"+"x"+" "+"dx" 28 else: 29 Integ =Val_No_1*x 30 ans = integrate(Integ) 31 out_Integ ="∮"+str(Val_No_1)+"x"+" "+"dx" 32 elif Question_No == 2: 33 if Val_No_1 and Val_No_2 == 1: 34 Integ = x**2+x 35 ans = integrate(Integ) 36 out_Integ = "∮"+"x**2"+"+"+"x"+" "+"dx" 37 else: 38 Integ = Val_No_1*x**2+Val_No_2*x 39 asn = integrate(Integ) 40 out_Integ = "∮"+str(Val_No_1)+"x**2"+"+"+str(Val_No_2)+"x"+" "+"dx" 41 else: 42 if Val_No_1 and Val_No_2 and Val_No_3== 1: 43 Integ = x**3+x**2+x 44 ans = integrate(Integ) 45 out_Integ = "∮"+"x**3"+"+"+"x**2"+"+"+"x"+"+"+" "+"dx" 46 else: 47 Integ = Val_No_1*x**3+Val_No_2*x**2+Val_No_3 48 ans = integrate(Integ) 49 out_Integ = "∮"+str(Val_No_1)+"x**3"+"+"+str(Val_No_2)+"x**2"+"+"+str(Val_No_3)+"+"+"x"+" "+"dx" 50 51#ウィンドウ切り替え 52def change_window(frame_name): 53 frame_name.tkraise() 54 55#問題ページの作成 56def create_question(frame_name,change_frame): 57 label_1 = ttk.Label(frame_name,text="以下の問題を解いてください") 58 label_app = ttk.Label(frame_name,text=out_Integ) 59 Entry_app = ttk.Entry(frame_name,width=30) 60 button_home = ttk.Button(frame_name,text="ホームに戻る",command=lambda:change_window(change_frame)) 61 answer_button = ttk.Button(frame_name,text="回答",command=Answer_button) 62 label_1.pack() 63 label_app.pack() 64 Entry_app.place(x=300,y=300) 65 button_home.place(x=350,y=420) 66 answer_button.place(x=350,y=520) 67 68#ラベル生成 69def label_create(frame_name,text_name): 70 label_frame = ttk.Label(frame_name,text=text_name) 71#ボタン生成 72def button_create(frame_name,text_name,button_name,change_window_name): 73 button_frame = ttk.Button(frame_name,text=text_name,command=lambda:button_name(change_window_name)) 74#ラベル配置 75def label_placcement(label_name,x_coord,y_coord): 76 label_name.place(x=x_coord,y=y_coord) 77#ボタン配置 78def button_lpaccement(button_name,x_coord,y_coord): 79 button_name.place(x=x_coord,y=y_coord) 80 81 82 83if __name__ == "__main__": 84 root = tk.Tk() 85 root.geometry("800x800") 86 87 root.grid_rowconfigure(0,weight=1) 88 root.grid_columnconfigure(0,weight=1) 89 #フレーム作成 90 frame = ttk.Frame(root) 91 frame.grid(row=0,column=0,sticky="nsew",pady=20) 92 frame_app_1 = ttk.Frame(root) 93 frame_app_1.grid(row=0,column=0,sticky="nsew",pady=20) 94 frame_app_2 = ttk.Frame(root) 95 frame_app_2.grid(row=0,column=0,sticky="nsew",pady=20) 96 frame_app_3 = ttk.Frame(root) 97 frame_app_3.grid(row=0,column=0,sticky="nsew",pady=20) 98 frame_app_4 = ttk.Frame(root) 99 frame_app_4.grid(row=0,column=0,sticky="nsew",pady=20) 100 frame_app_5 = ttk.Frame(root) 101 frame_app_5.grid(row=0,column=0,sticky="nsew",pady=20) 102 frame_app_6 = ttk.Frame(root) 103 frame_app_6.grid(row=0,column=0,sticky="nsew",pady=20) 104 105 #ホームウィジェット作成 106 label_1 = label_create(frame,"あなたの成長する積分アプリ") 107 label_2 = label_create(frame,"⚠️x**2はxの2乗x**3はxの3乗を表しています") 108 label_3 = label_create(frame,"1:基本レベル") 109 label_4 = label_create(frame,"2:定期テストレベル") 110 label_5 = label_create(frame,"3:センター試験レベル") 111 label_6 = label_create(frame,"4:難関私立レベル") 112 label_6 = label_create(frame,"5:難関国公立レベル") 113 label_7 = label_create(frame,"6:弱点レベル") 114 115 label_placcement(label_1,400,50) 116 label_placcement(label_2,400,150) 117 label_placcement(label_3,330,250) 118 label_placcement(label_4,330,350) 119 label_placcement(label_5,330,450) 120 label_placcement(label_6,330,550) 121 label_placcement(label_7,330,650) 122 #問題ページボタン作成 123 button_1 = ttk.Button(frame,text="問題へ",command=lambda:change_window(frame_app_1)) 124 button_2 = ttk.Button(frame,text="問題へ",command=lambda:change_window(frame_app_2)) 125 button_3 = ttk.Button(frame,text="問題へ",command=lambda:change_window(frame_app_3)) 126 button_4 = ttk.Button(frame,text="問題へ",command=lambda:change_window(frame_app_4)) 127 button_5 = ttk.Button(frame,text="問題へ",command=lambda:change_window(frame_app_5)) 128 button_6 = ttk.Button(frame,text="問題へ",command=lambda:change_window(frame_app_6)) 129 130 131 132 133 frame.tkraise() 134 root.mainloop() 135
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
質問文に載っているコードが部分的なので検証ができません。
質問文は編集できます。
「import tkinter as tk」のようにモジュールをインポートしているところや、関数label_frameの定義、「root.mainloop()」を実行している部分など、「実際に使っているコードを全部そのままコピーして」コードブロックに貼り付けてください。
なお、実行には影響ありませんが、「配置」を意味する英単語は「placement」で「placcement」や「lpaccement」ではありません。
インデントが失われるとPythonのコードを読むのは困難なので、質問文を編集してください。
1. 現在貼り付けたコードは取り除く
2. 取り除いた位置に、<code>ボタンを押して「コードブロック」を挿入する。
3. 「ここに言語を入力」の文字を削除し、代わりに「Python」と書く
4. 「コード」の文字を削除し、代わりにPythonのコードを書いているアプリ(VSCodeなど)からコピーした、「インデントが付いているコード」を貼り付ける
5. コードの直前の行が「```Python」、コードの直後の行が「```」になっていることを確認して、質問の修正を完了する。
回答1件
あなたの回答
tips
プレビュー