回答編集履歴

5

コードを追記

2022/12/15 04:51

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -73,3 +73,40 @@
73
73
  追記: 目的の挙動を達成するためだけなら
74
74
  Label ウィジェットは予め関数外に作成しておき、`label.config(text="あいうえお")` のように
75
75
  ウィジェットはそのままで、表示する文字のみ変更する方法をお勧めします。
76
+
77
+ ```python
78
+ # python 3.10+
79
+
80
+ from enum import Enum
81
+ import tkinter as tk
82
+ from tkinter import ttk
83
+
84
+
85
+ class Shape(Enum):
86
+ CIRCLE, SQUARE, HEXAGON = "丸", "板", "六角"
87
+
88
+ @classmethod
89
+ def values(cls) -> list[str]:
90
+ return [x.value for x in cls]
91
+
92
+ labels = {
93
+ Shape.CIRCLE: "あいうえお",
94
+ Shape.SQUARE: "かきくけこ",
95
+ Shape.HEXAGON: "さしすせそ",
96
+ }
97
+
98
+ def onComboboxSelected(event):
99
+ key = event.widget.get()
100
+ if value := labels.get(key, None):
101
+ label.config(text=value)
102
+
103
+
104
+ root = tk.Tk()
105
+ root.geometry("600x300")
106
+ label = tk.Label(root)
107
+ label.place(x=210, y=60)
108
+ combo = ttk.Combobox(root, values=Shape.values())
109
+ combo.bind("<<ComboboxSelected>>", onComboboxSelected)
110
+ combo.pack()
111
+ root.mainloop()
112
+ ```

4

表示のみ変更する方法を追記

2022/12/15 04:24

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  問題点は、label1~3 は関数内で宣言されたローカル変数の為、
22
22
  他の関数からは参照できません。(name を付けると、root2 から nametowidgetメソッド で参照する方法はあります)
23
- 解決方法は2通りあり
23
+ 解決方法はいくつかあり
24
24
 
25
25
  - label変数をグローバル変数にして(双方の関数内でグローバル宣言、関数外で変数を初期化)box_delete 内で destroy する。
26
26
  - 予め3つのラベルを関数外で生成して、イベント時に一旦全部非表示してから、必要なものを place で表示
@@ -68,3 +68,8 @@
68
68
  if label := labels.get(combobox1.get(), None):
69
69
  label.place(6, 210)
70
70
  ```
71
+
72
+ ----
73
+ 追記: 目的の挙動を達成するためだけなら
74
+ Label ウィジェットは予め関数外に作成しておき、`label.config(text="あいうえお")` のように
75
+ ウィジェットはそのままで、表示する文字のみ変更する方法をお勧めします。

3

補足情報

2022/12/15 03:43

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -8,6 +8,9 @@
8
8
  label2=tk.Label(root2,text='さし', name="label")
9
9
  label3=tk.Label(root2,text='たちつてとかき', name="label")
10
10
  ```
11
+
12
+ 追記: デメリットが一応あり、クラス化する際は固定で同じ名前をつけると、
13
+ クラスの再利用がしにくくなる状況があります。今回は関係なし。
11
14
 
12
15
  ----
13
16
  現状のアプローチで前のウィジェットを削除する方法
@@ -24,8 +27,7 @@
24
27
  必ず、「生成・破棄」もしくは「place/forget で表示・非表示」のどちらかにします。
25
28
 
26
29
  生成・破棄する方法
27
- おそらく質問のコードで実装したい方法の場合は、注意点は
30
+ おそらく質問のコードで実装したい方法の場合は、注意点は変数のスコープ。
28
- 変数のスコープ。
29
31
 
30
32
  ```python
31
33
  label = None

2

コード修正

2022/12/15 03:37

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -56,11 +56,11 @@
56
56
  label1 = tk.Label(..., text="あいうえお")
57
57
  label2 = tk.Label(..., text="さし")
58
58
  label3 = tk.Label(..., text="かきくけこ")
59
- labels = {"丸": label1, "板": label2, "六角": label3}
59
+ labels = {"丸": label1, "板": label2, "六角": label3} # 辞書にまとめておくと、一括して処理できるので、長いif文を省けます
60
60
 
61
61
  def enter_data():
62
62
  # box_delete 一旦全てのラベルを非表示
63
- for label in [label1, label2, label3]:
63
+ for label in labels.values():
64
64
  label.place_forget()
65
65
 
66
66
  if label := labels.get(combobox1.get(), None):

1

校正

2022/12/15 03:35

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -1,4 +1,4 @@
1
- tkinter の使用を利用した、簡単な解決方法
1
+ ウィジェット生成時の name を利用した、簡単な解決方法
2
2
 
3
3
  name で毎回同じ名前を付けることで
4
4
  同名のウィジェットの重複を防げます。
@@ -19,11 +19,8 @@
19
19
  他の関数からは参照できません。(name を付けると、root2 から nametowidgetメソッド で参照する方法はあります)
20
20
  解決方法は2通りあり
21
21
 
22
- - label変数をグローバル変数にして(双方の関数内でグローバル宣言、関数外で変数を初期化)
22
+ - label変数をグローバル変数にして(双方の関数内でグローバル宣言、関数外で変数を初期化)box_delete 内で destroy する。
23
- box_delete 内で destroy する。
24
- - 予め3つのラベルを関数外で生成して、
25
-  イベント時に一旦全部非表示してから、必要なものを place で表示
23
+ - 予め3つのラベルを関数外で生成して、イベント時に一旦全部非表示してから、必要なものを place で表示
26
-
27
24
  必ず、「生成・破棄」もしくは「place/forget で表示・非表示」のどちらかにします。
28
25
 
29
26
  生成・破棄する方法