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

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

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

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

Q&A

解決済

4回答

5484閲覧

python tkinterのplaceメソッドでラベルが表示されない

soepu

総合スコア41

Python 3.x

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

0グッド

0クリップ

投稿2019/05/08 19:52

pythonのtkinterを使ってGUIを作ろうとしています。
下記記載のlabelオブジェクトをplaceメソッドで配置使用とすると、
labelが表示されません。

コードのどこに問題があるか、教えて頂けますでしょうか?
宜しくお願い致します。

python

1 2import tkinter as tk 3 4class App(tk.Frame): 5 def __init__(self,master = None): 6 super().__init__(master) 7 master.title("BMI判定") 8 master.geometry("350x300") 9 self.pack() 10 self.create_widgets() 11 12 def create_widgets(self): 13 self.lb_height = tk.Label(self) 14 self.lb_height["text"] = "身長(cm)" 15 self.lb_height.place(x = 130,y = 130, width = 50,height = 110) 16 17 18root = tk.Tk() 19app = App(master = root) 20app.mainloop()

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

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

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

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

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

guest

回答4

0

Frameのサイズが設定されていないのが原因ではないでしょうか。
(Labelの表示がされないのは、Frameの横幅・縦幅ともに0になっているのが原因かと思います)

Python

1class App(tk.Frame): 2 def __init__(self,master = None): 3 super().__init__(master, width=350, height=300) 4 # ...(略)

のように Frameのサイズを設定する、または

Python

1class App(tk.Frame): 2 def __init__(self,master = None): 3 super().__init__(master) 4 master.title("BMI判定") 5 master.geometry("350x300") 6 self.pack(expand=1, fill=tk.BOTH) 7 # ...(略)

のようにFrameを親Windowの全領域を埋めて配置するように設定すると良いかと思います。(個人的には後者を使用するかと思います。)

投稿2019/05/08 23:31

編集2019/05/08 23:33
magichan

総合スコア15898

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

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

KSwordOfHaste

2019/05/09 00:12

expandとfillを両方使うと親に合わせられるのですね! 自分の回答は不充分でした。
guest

0

ベストアンサー

結論:
rootウィンドウの大きさを指定してもダメでApp(Frame)の大きさを明示すればうまくいきます。

python

1class App(tk.Frame): 2 def __init__(self,master = None): 3 super().__init__(master, width=350, height=300) # <--こうする必要がある 4 master.title("BMI判定") 5 # master.geometry("350x300") # <--こちらはむしろ不要 6 self.pack() 7 self.create_widgets()

原因:
Frameの子供をplaceで指定する場合Frameはその子供の大きさに応じた大きさに自動的になってはくれません。またFrameの親(本件の場合はrootウィンドウ)に合わせて自動的に大きくなってもくれません。

最初からFrameの大きさを明示しておかないと期待どおりにならないようです。

自分もすぐにはこの振る舞いがわからなかったのですがそれを調べた方法については別の質問の回答に書いたのでその辺りも参考にしていただければと思います。

https://teratail.com/questions/187059#reply-277904

投稿2019/05/08 23:42

KSwordOfHaste

総合スコア18392

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

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

KSwordOfHaste

2019/05/09 00:17 編集

上の回答ではmagichanさん回答にある「親の大きさに合わせる方法」を気づけてませんでした。 magichanさん回答の方を支持させてください!
guest

0

おはようございます。

問題文確認しました。

Frameの枠の指定がうまくいっていないみたいですね。

こちらの記事を参考に、もう一度packについて見直してみると良いかもしれません。
【完全版!?】Tkinterを用いてpackの使い方や実例を解説

投稿2021/05/19 00:57

編集2021/06/14 22:08
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

以下のようにmaster(=root)配下としてラベル作成することで表示されるようになります。

Python

1import tkinter as tk 2 3class App(tk.Frame): 4 def __init__(self,master = None): 5 super().__init__(master) 6 master.title("BMI判定") 7 master.geometry("350x300") 8 self.pack() 9 self.create_widgets(master) 10 11 def create_widgets(self,master): 12 self.lb_height = tk.Label(master) 13 self.lb_height["text"] = "身長(cm)" 14 self.lb_height.place(x = 130,y = 130, width = 50,height = 110) 15 16root = tk.Tk() 17app = App(master = root) 18app.mainloop()

投稿2019/05/08 20:09

編集2019/05/08 23:21
can110

総合スコア38233

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

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

soepu

2019/05/08 20:41

placeの後に packを呼び出すと、配置がpack単独で呼び出し時と変わらず、 place指定(絶対位置)がききませんでした。
can110

2019/05/08 23:21

そうですね…失礼しました。コード修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問