回答編集履歴

1

追記

2019/07/11 17:39

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -2,4 +2,54 @@
2
2
 
3
3
 
4
4
 
5
- 関数のローカル変数として作ったオブジェクトは、関数が返ると「消えてしまう」のが原則です。細かく言うとrootから参照を持ってくれていればなんとかなるのですが、内部的にそういう作りになっていないのです。ちょっと面倒ですね。
5
+ 関数のローカル変数として作ったオブジェクトは、関数が返ると「消えてしまう」のが原則です。細かく言うと、もし引数に渡した`root`から参照を持ってくれるように実装されていればなんとかなるのですが、内部的にそういう作りになっていないのです。ちょっと厄介ですね。
6
+
7
+
8
+
9
+ 質問のコード程度なら対処は簡単で、消えてほしくないものをグローバル変数にします。
10
+
11
+
12
+
13
+ ```python
14
+
15
+ import tkinter as tk
16
+
17
+ from tkinter import ttk
18
+
19
+
20
+
21
+ def create_widget(root):
22
+
23
+ global frame, string, label
24
+
25
+ frame = ttk.Frame(root)
26
+
27
+ frame.grid()
28
+
29
+
30
+
31
+ string = tk.StringVar()
32
+
33
+ string.set('test')
34
+
35
+ label = ttk.Label(frame, textvariable=string)
36
+
37
+ label.grid(row=0, column=0)
38
+
39
+
40
+
41
+ if __name__ == '__main__':
42
+
43
+ root = tk.Tk()
44
+
45
+ create_widget(root)
46
+
47
+ root.mainloop()
48
+
49
+
50
+
51
+ ```
52
+
53
+
54
+
55
+ ただ、関数を複数回呼ぶと上書きされて元のオブジェクトが消えたりしますから、場合によってはもっと複雑な処置(たとえば参照を保持するための`list`を作ってそこに入れるとか)が必要になります。