acceder al valor de retorno de la función que estaba vinculada a un evento (tkinter)

Básicamente, lo que he hecho es vincular un evento de clic a una función. Por ejemplo:

self.button1.bind("",self.chooseDice) 

Lo que quiero ahora es acceder al resultado de chooseDice() en otra función. ¿Cuál es la mejor manera de hacerlo?

 class GraphicsInterface: #we want to initialize the game board here, set up the dice and buttons def __init__(self): self.window = Tk() self.window.geometry("720x500") #buttons under each die self.clicked=[] #empty list to collect all the buttons that were clicked (see chooseDice function) self.button1 = Button(self.window, text="Dice 1", width=13) #create the button object self.button1.place(x=60, y=160) #bind button click event to a function (chooseDice()) self.button1.bind("",self.chooseDice) self.button2 = Button(self.window, text="Dice 2", width=13) self.button2.place(x=185, y=160) self.button2.bind("",self.chooseDice) #using the event as an argument, append the text to the clicked list def chooseDice(self, event): self.clicked.append(event.widget.cget('text')) self.diceList=[] #create a new empty list for i in range(len(self.clicked)): self.diceList.append(int(self.clicked[i][5])) #get just the int value of the last character (ie the dice number) self.deactivate(event.widget) #deactivate the button return self.diceList 

Ya estás haciendo lo que necesitas hacer. Su código de ejemplo establece self.diceList en algún valor. En cualquier otro lugar de su código, puede utilizar directamente self.diceList .

Por cierto, está escribiendo un código que será difícil de mantener con el tiempo. Por ejemplo, ¿qué sucede si cambia la etiqueta de los dados a “Dice One” o simplemente “One” en lugar de “Dice 1”? O, a medida que su aplicación avanza, es posible que desee imágenes gráficas en lugar de texto en los botones. Tendrás que modificar el código que analiza el nombre del botón. Esencialmente, está codificando información en una etiqueta de botón que no es una buena idea.

Una solución simple, que también simplifica y facilita la comprensión del método chooseDice , es pasar el número del dado en la callback. Por ejemplo:

 self.button1.configure(command=lambda btn=self.button1: self.chooseDice(btn, 1)) 

Lo anterior pasa dos parámetros al método chooseDice : la instancia del botón (para que pueda deshabilitarlo) y el número del botón (para que no tenga que analizar el nombre del botón para obtenerlo)

Esto también te permite crear tus dados en un bucle en lugar de codificar varias copias del mismo bloque de código. Aquí hay un ejemplo completo de trabajo:

 from Tkinter import * class GraphicsInterface: def __init__(self): self.window = Tk() self.window.geometry("720x500") self.clicked=[] self.buttons = [] for n in range(1, 3): btn = Button(text="Button " + str(n)) btn.configure(command=lambda btn=btn, n=n: self.chooseDice(btn, n)) btn.pack() self.buttons.append(btn) btn = Button(text="Go!", command=self.go) btn.pack() self.window.mainloop() def go(self): print "buttons:", self.clicked self.reset() def reset(self): '''Reset all the buttons''' self.clicked = [] for button in self.buttons: button.configure(state="normal") def chooseDice(self, widget, number): self.clicked.append(number) widget.configure(state="disabled") app = GraphicsInterface() 

Finalmente, algunos últimos consejos:

No use place , hace que sus GUIs sean más difíciles de crear, y no reactjsrán bien a los cambios en el tamaño de la ventana, los cambios en la fuente, los cambios en la plataforma, etc. Use pack y grid lugar. Además, no cree botones de ancho fijo. De nuevo, esto es para manejar mejor los cambios en las fonts. Hay ocasiones en las que desea botones de ancho fijo, pero no parece que su código tenga ninguna razón para usarlos.

Finalmente, no sé qué es lo que realmente intentas lograr, pero generalmente si estás usando botones para rastrear el estado (¿está esto presionado o no?) Quieres usar casillas de verificación (elegir N de N) o botones de radio ( recoger 1 de N). Es posible que desee considerar cambiar a los botones en lugar de a.

simplemente agregue un atributo self.result a su clase y chooseDice() en chooseDice()

Refactor Divide esto en dos funciones.

Uno devuelve el resultado adecuado, utilizable por otros objetos.

El otro está vinculado a un control de GUI, y utiliza el resultado adecuado para activar y desactivar objetos de GUI.

De hecho, siempre debes hacer esto. Siempre debe tener funciones que funcionen normalmente en Python, que funcionen correctamente sin la GUI y que puedan probarse en unidades sin la GUI. Luego conectas este “modelo” de trabajo a la GUI.