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

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

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

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

Q&A

解決済

1回答

474閲覧

引数を渡しているはずなのになぜnoneになるのか

taki.muramatsu

総合スコア7

Tkinter

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

0グッド

0クリップ

投稿2021/09/13 13:18

編集2021/09/15 12:08

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Daregada

2021/09/15 00:57

質問文に載っているコードが部分的なので検証ができません。 質問文は編集できます。 「import tkinter as tk」のようにモジュールをインポートしているところや、関数label_frameの定義、「root.mainloop()」を実行している部分など、「実際に使っているコードを全部そのままコピーして」コードブロックに貼り付けてください。 なお、実行には影響ありませんが、「配置」を意味する英単語は「placement」で「placcement」や「lpaccement」ではありません。
Daregada

2021/09/15 12:02

インデントが失われるとPythonのコードを読むのは困難なので、質問文を編集してください。 1. 現在貼り付けたコードは取り除く 2. 取り除いた位置に、<code>ボタンを押して「コードブロック」を挿入する。 3. 「ここに言語を入力」の文字を削除し、代わりに「Python」と書く 4. 「コード」の文字を削除し、代わりにPythonのコードを書いているアプリ(VSCodeなど)からコピーした、「インデントが付いているコード」を貼り付ける 5. コードの直前の行が「```Python」、コードの直後の行が「```」になっていることを確認して、質問の修正を完了する。
guest

回答1

0

ベストアンサー

以下の関数にreturn文を追加して、生成したウィジェットオブジェクトを呼び出し元に返す必要があります。

return文が省略されるとNoneが返り値になるため、label_createの返り値を受け取る変数label_1などにNoneが設定され、その後のlabel_placcementの呼び出しでNoneを渡すことになり、質問文のエラーが発生します。

diff

1#ラベル生成 2def label_create(frame_name,text_name): 3 label_frame = ttk.Label(frame_name,text=text_name) 4+ return label_frame 5#ボタン生成 6def button_create(frame_name,text_name,button_name,change_window_name): 7 button_frame = ttk.Button(frame_name,text=text_name,command=lambda:button_name(change_window_name)) 8+ return button_frame

投稿2021/09/15 12:28

Daregada

総合スコア11990

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

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

taki.muramatsu

2021/09/15 12:37

#ラベル配置 def label_placcement(label_name,x_coord,y_coord): label_name.place(x=x_coord,y=y_coord) return label_name #ボタン配置 def button_plpaccement(button_name,x_coord,y_coord): button_name.place(x=x_coord,y=y_coord) return button_name このようにしましたが同じエラーが出てきます
Daregada

2021/09/15 13:01

ラベルを「配置」する関数にはreturnは不要です。返り値を使わないから。 ラベルやボタンを「生成」する関数にreturnを付けてください。回答をよく見てください。
taki.muramatsu

2021/09/15 13:34

ちゃんと出来ました ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問