前提・発生症状
python3 + tkinterで簡単なGUIツールを作成しようとしているのですが
Frameに配置したLabelの文字列が出たり出なかったりして困っております。
具体的には以下のように記載すると"test"という文字が表示されますが
OK
1import tkinter as tk 2from tkinter import ttk 3 4if __name__ == '__main__': 5 root = tk.Tk() 6 7 frame = ttk.Frame(root) 8 frame.grid() 9 10 string = tk.StringVar() 11 string.set('test') 12 label = ttk.Label(frame, textvariable=string) 13 label.grid(row=0, column=0) 14 15 root.mainloop() 16```![イメージ説明](83b41b359c29085c362481e62f21d5ff.jpeg) "test"が表示される 17 18以下のように処理を関数に移動すると"test"が表示されません。 19```NG 20import tkinter as tk 21from tkinter import ttk 22 23 24def create_widget(root): 25 frame = ttk.Frame(root) 26 frame.grid() 27 28 string = tk.StringVar() 29 string.set('test') 30 label = ttk.Label(frame, textvariable=string) 31 label.grid(row=0, column=0) 32 33if __name__ == '__main__': 34 root = tk.Tk() 35 create_widget(root) 36 root.mainloop() 37```![イメージ説明](8153e1cac39636e01be71d043ce60b76.jpeg) "test"が表示されない 38 39### 試したこと 40上記NGケースにて 41label = ttk.Label(frame, textvariable=string) 42→label = tk.Label(frame, textvariable=string) 43というようにttkではなくtkで作成すると"test"が表示されました。 44そのため回避方法はあるのですが、なぜ関数内でLabel作成・配置すると文字が表示されないのか気になっております。 45もし何かご存知またはお気づきの点などありましたらご指摘いただけますと幸いです。 46 47### 補足情報 48環境はWindows7 SP1(32bit) + Minicondaで導入したpython 3.7.3です。
root.mainloopはroot.mainloop()の間違いでは?
おっしゃる通りmainloop()が正解と思われます。
(エラー出ないのですね…)
修正後も動作は変わりませんでしたが、ご指摘いただきましてありがとうございます。
できれば質問文を編集して反映しておいてください。
root.mainloopで「メソッドへの参照を取得する」という意味です。後ろにカッコを付けると「カッコをつけられたものを呼び出す」という処理が走ります。
私が試した範囲ではカッコを付けないとウィンドウがそもそも出現しなかったのですが、もしかしたら環境によるのかもしれません。
ありがとうございます、質問文を修正いたしました。
カッコ有無による意味の違いについて承知いたしました。確かに関数名を引数で渡すような場合はカッコがありませんね。
またこちらで試したところ、root.mainloop()そのものをコメントアウトしても一応ウィンドウは表示されましたので環境依存の部分があるかもしれません。
回答1件
あなたの回答
tips
プレビュー