回答編集履歴

4

補足

2022/04/16 06:32

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -101,8 +101,9 @@
101
101
  map_03 = tk.Frame(frame, width=600, height=400, bg="green")
102
102
  map_03.grid(row=0, column=0, sticky=tk.NSEW)
103
103
 
104
- # NOTE: 質問と同じエラーを起こすため
104
+ # NOTE: 質問と同じエラーを起こす
105
- # ここでは意図的に str 型に変換します
105
+ # ここでは意図的に str 型に変換しますが、
106
+ # 暗黙の型変換が行われている可能性があります。
106
107
  map_no = [str(map_01), str(map_02), str(map_03)]
107
108
  print(f"{map_no}")
108
109
 

3

コードとコメントがあってなかったので修正

2022/04/16 05:46

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -77,7 +77,11 @@
77
77
  ```
78
78
 
79
79
  ----
80
+ 追記2: AttributeError: 'str' object has no attribute 'tkraise' の場合
81
+
80
- 追記2
82
+ 質問と同じエラーを再現とその対処方法です。
83
+ 但し、map_no の内容次第では nametowidget を適応できない場合もあるので、
84
+ 変数の中身を確認してください。ここでは ウィジェットの識別子の文字列になってる場合を想定。
81
85
 
82
86
  ```python
83
87
 
@@ -108,8 +112,8 @@
108
112
  # 文字列の内容次第では、全然別の問題だったという事もあります。
109
113
  # (※掲載されてるコードからは解らない箇所)
110
114
  def change_map(value):
111
- # map_no[value].tkraise()
115
+ map_no[value].tkraise()
112
- root.nametowidget(map_no[value]).tkraise()
116
+ # root.nametowidget(map_no[value]).tkraise()
113
117
 
114
118
  map_radio = tk.IntVar()
115
119
  radio_frame = tk.Frame(root)

2

AttributeError str object has no attribute の場合の対策を追記

2022/04/16 05:42

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -75,3 +75,63 @@
75
75
  main()
76
76
 
77
77
  ```
78
+
79
+ ----
80
+ 追記2
81
+
82
+ ```python
83
+
84
+ import tkinter as tk
85
+
86
+
87
+ def main():
88
+ root = tk.Tk()
89
+ frame = tk.Frame(root)
90
+
91
+ map_01 = tk.Frame(frame, width=600, height=400, bg="red")
92
+ map_01.grid(row=0, column=0, sticky=tk.NSEW)
93
+
94
+ map_02 = tk.Frame(frame, width=600, height=400, bg="blue")
95
+ map_02.grid(row=0, column=0, sticky=tk.NSEW)
96
+
97
+ map_03 = tk.Frame(frame, width=600, height=400, bg="green")
98
+ map_03.grid(row=0, column=0, sticky=tk.NSEW)
99
+
100
+ # NOTE: 質問と同じエラーを起こすために
101
+ # ここでは意図的に str 型に変換します
102
+ map_no = [str(map_01), str(map_02), str(map_03)]
103
+ print(f"{map_no}")
104
+
105
+ # XXX: 以下のコードは str.tkraise を呼び出そうとして質問と同じエラー
106
+ # もし map_no[value] がウィジェットのIDだった場合の解決策が nametowidget
107
+ # 以下にコメントアウトして示します。
108
+ # 文字列の内容次第では、全然別の問題だったという事もあります。
109
+ # (※掲載されてるコードからは解らない箇所)
110
+ def change_map(value):
111
+ # map_no[value].tkraise()
112
+ root.nametowidget(map_no[value]).tkraise()
113
+
114
+ map_radio = tk.IntVar()
115
+ radio_frame = tk.Frame(root)
116
+ tk.Radiobutton(radio_frame,
117
+ variable=map_radio, value=0
118
+ ).grid(row=0, column=0)
119
+ tk.Radiobutton(radio_frame,
120
+ variable=map_radio, value=1
121
+ ).grid(row=0, column=1)
122
+ tk.Radiobutton(radio_frame,
123
+ variable=map_radio, value=2
124
+ ).grid(row=0, column=2)
125
+ tk.Button(radio_frame, text="change",
126
+ command=lambda: change_map(map_radio.get())
127
+ ).grid(row=0, column=3)
128
+
129
+ radio_frame.pack()
130
+ frame.pack()
131
+
132
+ root.geometry("600x400")
133
+ root.mainloop()
134
+
135
+ if __name__ == '__main__':
136
+ main()
137
+ ```

1

サンプルコードを掲載

2022/04/16 05:03

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -18,3 +18,60 @@
18
18
  どこかで文字列になってるのかもしれません。
19
19
  IDの文字列 -> widget 変換には、nametowidget 関数が提供されてますが、
20
20
  map_no に関するコードが質問に掲載されてないため、詳細はわかりません。
21
+
22
+
23
+ ----
24
+ 追記: 画面遷移のサンプルコードを掲載
25
+ ```python
26
+
27
+
28
+ import tkinter as tk
29
+
30
+
31
+ def main():
32
+ root = tk.Tk()
33
+ frame = tk.Frame(root)
34
+
35
+ map_01 = tk.Frame(frame, width=600, height=400, bg="red")
36
+ map_01.grid(row=0, column=0, sticky=tk.NSEW)
37
+
38
+ map_02 = tk.Frame(frame, width=600, height=400, bg="blue")
39
+ map_02.grid(row=0, column=0, sticky=tk.NSEW)
40
+
41
+ map_03 = tk.Frame(frame, width=600, height=400, bg="green")
42
+ map_03.grid(row=0, column=0, sticky=tk.NSEW)
43
+
44
+ # NOTE: map_no の定義は
45
+ # 内容の map_01, map_02, map_03 が見える場所で定義する
46
+ map_no = [map_01, map_02, map_03]
47
+
48
+ # NOTE: change_map の定義は
49
+ # map_no の見える場所で定義する
50
+ def change_map(value):
51
+ map_no[value].tkraise()
52
+
53
+ map_radio = tk.IntVar()
54
+ radio_frame = tk.Frame(root)
55
+ tk.Radiobutton(radio_frame,
56
+ variable=map_radio, value=0
57
+ ).grid(row=0, column=0)
58
+ tk.Radiobutton(radio_frame,
59
+ variable=map_radio, value=1
60
+ ).grid(row=0, column=1)
61
+ tk.Radiobutton(radio_frame,
62
+ variable=map_radio, value=2
63
+ ).grid(row=0, column=2)
64
+ tk.Button(radio_frame, text="change",
65
+ command=lambda: change_map(map_radio.get())
66
+ ).grid(row=0, column=3)
67
+
68
+ radio_frame.pack()
69
+ frame.pack()
70
+
71
+ root.geometry("600x400")
72
+ root.mainloop()
73
+
74
+ if __name__ == '__main__':
75
+ main()
76
+
77
+ ```