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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

4972閲覧

TkinterのFrameのサイズ指定について

chem_search

総合スコア30

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/04/24 08:45

###質問したいこと

TkinterのFrameのサイズ指定の方法についてです。
以下のソースコードの通り実行すると、目的のものは得られるのですが、
Frameのサイズ指定の部分について聞きたいことがあります。

該当のソースコード

Python

1import tkinter as tk 2 3class Frame1(tk.Frame): 4 def __init__(self, master=None): 5 super().__init__(master,width=400, height=300) 6 7 #ウィンドウの設定 8 self.master.geometry("800x600") 9 self.master.title("ウィンドウのタイトル") 10 11 #フレームの設定 12 self.config(bg="black") 13 self.propagate(False) 14 15 #実行内容 16 self.pack() 17 self.create_widget()#下で定義するメソッドを実行 18 19 def create_widget(self): 20 #ラベルを作製 21 self.label1 = tk.Label(self, text="これはラベルです") 22 self.label1.pack() 23 24 #エントリーを作製 25 self.entry1 = tk.Entry(self) 26 self.entry1.insert(tk.END, "これはエントリーです") 27 self.entry1.pack() 28 29 #ボタンを作製 30 self.button1 = tk.Button(self, text="これはボタンです") 31 self.button1.pack() 32 33root = tk.Tk() 34f1 = Frame1(master = root) 35f1.mainloop() 36

聞きたいこと

Python

1class Frame1(tk.Frame): 2 def __init__(self, master=None): 3 super().__init__(master,width=400, height=300) 4 5 #ウィンドウの設定 6 self.master.geometry("800x600") 7 self.master.title("ウィンドウのタイトル") 8 9 #フレームの設定 10 self.config(bg="black") 11 self.propagate(False)

↑のsuper()~~の部分でFrameのサイズを指定していて、
このFrameが配置されるrootのサイズをその下の#ウィンドウの設定の
self.master.geometry("800x600")で行っています。

ここでのselfはインスタンスのことを指しており、
self.masterというのはrootのことを指すから、
root.geometry("800x600")という記述とほぼ同じだと理解しています。
(実際にself.master.geometry("800x600")という記述を消して、root = tk.Tk()の下に
root.geometry("800x600")と記述しても同様に動きました。)

そこで、

Python

1class Frame1(tk.Frame): 2 def __init__(self, master=None): 3 super().__init__(master) 4 5 #ウィンドウの設定 6 self.master.geometry("800x600") 7 self.master.title("ウィンドウのタイトル") 8 9 #フレームの設定 10 self.width = 400 11 self.height = 300 12 self.config(bg="black") 13 self.propagate(False)

と書き換えても同じように動くかと思ったのですが、
Frameが表示されなくなってしまいました。

これはなぜなのでしょうか。

補足情報(FW/ツールのバージョンなど)

Python 3.7.4
tkinter 8.6

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

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

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

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

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

guest

回答1

0

ベストアンサー

Frameが表示されなくなってしまいました。

2つ目と3つ目のコードに関して、
mainloop迄、コードを省略せずに記載して頂けますか。

pack() が呼ばれていない為なのか、
省略された箇所に含まれるのかの判断がつきません。


表示されなくなった原因は、2通り考えられます

  • pack()が呼ばれていない
  • width, height はPythonでのユーザ定義の属性なので

tk 側へ通知されていません
この場合、レイアウトを適切に設定しないとFrameのサイズは 1x1 で
結果として見えなくなります。

#フレームの設定 self.width = 400 self.height = 300

ここの認識は誤りです。同等のコードを書くとすれば、
属性ではなく添字でアクセス、もしくはconfig()で設定します。

python

1#フレームの設定 2self["width"] = 400 3self["height"] = 300 4 5#フレームの設定2 6self.config(bg="black", width=400, height=300)

追記: オプションの設定で、3通りの設定方法が記載されてます。


ウィジェットのサイズ確認の為のコード

python

1import tkinter as tk 2 3class Frame1(tk.Frame): 4 def __init__(self, master=None): 5 super().__init__(master) 6 7 #ウィンドウの設定 8 self.master.geometry("800x600") 9 self.master.title("ウィンドウのタイトル") 10 11 #フレームの設定 12 self.width = 400 13 self.height = 300 14 15 # サイズ確認 1 1 16 print(self.winfo_reqwidth(), self.winfo_reqheight()) 17 18 self.config(bg="black", width=400, height=300) 19 self.propagate(False) 20 21 # サイズ確認 400 300 22 print(self.winfo_reqwidth(), self.winfo_reqheight()) 23 24 25 self["width"] = 500 26 self["height"] = 500 27 print(self.winfo_reqwidth(), self.winfo_reqheight()) 28 29 # サイズ確認 500 500 30 print(self.winfo_reqwidth(), self.winfo_reqheight()) 31 32 self.pack() 33 34root = tk.Tk() 35f1 = Frame1(master = root) 36f1.mainloop()

投稿2020/04/24 19:42

編集2020/04/25 04:50
teamikl

総合スコア8760

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

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

chem_search

2020/04/25 11:52

とても丁寧に回答して頂き、本当にありがとうございました。 コードの省略については、冗長になってしまうかと思い、変更付近の場所だけ 記載したのですが、たしかに全て書かないと判断がつかないですね……。 申し訳ありませんでした。次回からは記載するようにします。 設定方法についても、公式のリファレンスとともに記載して頂いてありがとうございます。 まずはこちらをしっかりと読み込んでみることにします。
teamikl

2020/04/25 12:35 編集

もし変更の際に他のミスがあった場合、提示されたコードからは原因を特定できないので、 可能な限り、コピーするだけで動作もしくはエラーが確認できるようなコードの方が好ましいです。 今回の場合であれば、create_widgets() なら定義~呼び出しまで全て省いても 問題の現象は確認出来るので、省略するならその辺りなら影響はありませんでした、・・・が 何処が必要か不要か等の判断も、それで解らないことがあり質問されている訳ですから 難しいですよね。とは言え、冗長でもそのまま掲載すればいいという意図でもなくて、 やはり冗長な部分は省かれていた方が、コードの変更点もわかりやすく読みやすいので、 コードを省略する際には、解る範囲で良いので、コードが単体で実行可能かという点を気にかけて見て下さい。 (勿論、コード規模によっては字数制限の都合で差分のみになることも有ると思います、そこは状況次第)
chem_search

2020/04/25 12:52

質問の仕方に関するアドバイスまで、ありがとうございます! たしかに、コピーするだけで動作やエラーが確認できるという観点で考えると、 どこまでを記載すればいいかの一つの基準になりますね。 なかなか難しいですが、次回の質問の際にはその点を気にして投稿内容を考えてみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問