Python - Ids en kivyMD

 
Vista:
Imágen de perfil de Jorge Alberto
Val: 137
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Ids en kivyMD

Publicado por Jorge Alberto (48 intervenciones) el 27/08/2021 00:00:21
Hola, cómo están? Estoy practicando con kivyMD, pero como siempre tengo problemas con las ids. Lo que estoy "creando" es un juego simple y conocido (el ahorcado). Pero cuando intento referenciar algo, me sale el error 'Something' object has no attribute ids. Les paso el código del archivo py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from kivymd.app import MDApp
from kivy.lang import Builder
from random import choice
 
 
 
class MainAhorcadoApp(MDApp):
 
	list_of_words = ['HOLA', 'AHORCADO', 'PALABRA']
 
	def build(self):
		self.theme_cls.secondary_color = 'Teal'
		self.theme_cls.accent_palette = 'BlueGray'
		self.new_game()
		return Builder.load_file('ahorcado.kv')
 
	def new_game(self):
		'''
		Chose a word from the list, replace the letters with a "_" and add the widgets to the screen
		'''
		word = choice(self.list_of_words)
		self.root.ids.the_word.text = word
		print(word)
 
 
	def exitapp(self):
		MDApp.get_running_app().stop()
 
if __name__ == '__main__':
	MainAhorcadoApp().run()

y del archivo kv:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
MDBoxLayout:
    orientation: "vertical"
 
    MDRelativeLayout:
    	# Acá se dibuja el ahorcado
    	MDLabel:
    		# Acá se dibujará el hombre
    		id: hang_man
    		size_hint: 0.3, 1
    		canvas:
				Color:
					rgba: 1, 0, 0, 1
    			Line:
    				points: self.width * .1, self.height * .1, self.width * .7, self.height * .1
    				width: 4
    			Line:
    				points: self.width * .15, self.height * .1, self.width * .15, self.height * .8
    				width: 4
    			Line:
    				points: self.width * .15, self.height * .8, self.width * .6, self.height * .8
    				width: 4
    			Line:
    				points: self.width * .6, self.height * .8, self.width * .6, self.height * .7
    				width: 4
 
    	MDLabel:
    		# Acá figura la palabra a descubrir
    		id: the_word
    		size_hint: (.7, 1)
    		pos_hint: {'right': 1}
    		text: 'Word'

En este caso, el error que arroja es:
1
2
3
File "c:/kivymd/ahorcado.py", line 22, in new_game
     self.root.ids.the_word.text = word
AttributeError: 'NoneType' object has no attribute 'ids'

Si intento modificar la línea 22 a
1
self.ids.the_word.text = word
el error que arroja es similar:

1
2
3
File "c:/kivymd/ahorcado.py", line 22, in new_game
     self.ids.the_word.text = word
 AttributeError: 'MainAhorcadoApp' object has no attribute 'ids'

Lo raro es que ya había hecho lo mismo en otro programa y no tuve ningún problema. No entiendo por qué ahora no funciona. ¿Alguna idea?

PD: si quieren ver un bosquejo de lo que intento hacer, quiten la línea 22 e imaginen que en vez de WORD dice _ _ _ _ (un _ por cada letra). La idea es que la persona elige una letra: si es parte de la palabra, lo modifica; si no, suma un error y empieza a dibujar a una persona.

En fin, eso es todo. Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jorge Alberto
Val: 137
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Ids en kivyMD

Publicado por Jorge Alberto (48 intervenciones) el 27/08/2021 06:21:47
Bueno, algo logré, pero sigo teniendo problemas. Los archivos se llamaban ahorcado.py y ahorcado.kv. Al cambiar el nombre del arhivo kv a mainahorcado.kv, el problema de las ids dejó de suceder. El tema es que sigue figurando la palabra 'Word' en vez de la elección hecha en word. Mejoró un poco, pero ahora no sé por qué no cambia la palabra.

Una cosa más. Agregué un botón con una función choice_of_word que hace lo siguiente:

1
2
3
def choice_of_word(self):
		word = choice(self.list_of_words)
		self.root.ids.the_word.text = word

Como ven, hace lo mismo que la función new_game, con la única diferencia que esta sí funciona. Por lo tanto, la pregunta pasa a ser, por qué esta funciona y la otra no?

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar