¿Por qué las dos entradas tkinter utilizan el mismo número?

import os import tkinter import tkinter.font as tkFont from tkinter import * coord1 = "0,0" coord2 = "0,0" EQ = "y = mx + b" def tkinter_window(): global coord1Entry global coord2Entry global coord1 global coord tk = Tk() tk.title("Math Graph") #create font1 = tkFont.Font(family="Source Code Pro", size=16) font2 = tkFont.Font(family="Source Code Pro", size=10) coord1Label = Label(tk, text='X coordinate 1:\n( "x,y", no parentheses )', font=font1) coord2Label = Label(tk, text='Y coordinate 2:\n( "x,y", no parentheses )', font=font1) 

Esta es la parte donde defino las dos entradas que parecen usar los mismos números:

  coord1Entry = Entry(tk, textvariable=coord1) coord2Entry = Entry(tk, textvariable=coord2) 

Entonces el problema es que cuando ejecuto el progtwig no muestran nada, como de costumbre. Pero tan pronto como ingrese un carácter en una de las entradas, ambos muestran el (los) carácter (es). No entiendo por qué, usan diferentes variables? ¿Alguien me puede ayudar?

  coordButton = Button(tk, text="Done! (use coordinates)", font=font1) equationLabel = Label(tk, text="Equation: y =", font=font1) equationEntry = Entry(tk, textvariable=EQ, font=font1) equationButton = Button(tk, text="Done! (use equation)", font=font1) iwantanswersCheckbox = Checkbutton(tk, text="I want m, x, b, intercept and x-intercept", font=font1) iwantgraphCheckbox = Checkbutton(tk, text="I want a graph", font=font1) info1Label = Label(tk, text="***Both boxes may be checked***", font=font2) #pack coord1Label.grid(row=0, column=0, padx=15, pady=15) coord2Label.grid(row=1, column=0, padx=15, pady=15) coord1Entry.grid(row=0, column=1, padx=5, pady=5) coord2Entry.grid(row=1, column=1, padx=5, pady=5) coordButton.grid(row=2, columnspan=2, padx=5, pady=15) equationLabel.grid(row=3, column=0, sticky=E, padx=5, pady=5) equationEntry.grid(row=3, column=1, padx=5, pady=5) equationButton.grid(row=4, columnspan=2, padx=5, pady=15) iwantanswersCheckbox.grid(row=5, columnspan=2, padx=5, pady=5) iwantgraphCheckbox.grid(row=6, columnspan=2) info1Label.grid(row=7, columnspan=2) os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') tk.mainloop() tkinter_window() def matplotlib_window(): import matplotlib.pyplot as plt coordX[0] = Xcoord1Entry.get() coordX[1] = Xcoord2Entry.get() coordY[0] = Ycoord1Entry.get() coordY[1] = Ycoord2Entry.get() plt.plot(coordX, coordY) plt.legend(loc=4) plt.xlabel("x") plt.ylabel("y") plt.show() 

Área principal de código donde el problema debe ser (según lo solicitado):

 import tkinter import tkinter.font as tkFont from tkinter import * coord1 = "0,0" coord2 = "0,0" def tkinter_window(): global coord1Entry global coord2Entry global coord1 global coord tk = Tk() tk.title("Math Graph") #create font1 = tkFont.Font(family="Source Code Pro", size=16) font2 = tkFont.Font(family="Source Code Pro", size=10) coord1Label = Label(tk, text='X coordinate 1:\n( "x,y", no parentheses )', font=font1) coord2Label = Label(tk, text='Y coordinate 2:\n( "x,y", no parentheses )', font=font1) coord1Entry = Entry(tk, textvariable=coord1) coord2Entry = Entry(tk, textvariable=coord2) #pack coord1Label.grid(row=0, column=0, padx=15, pady=15) coord2Label.grid(row=1, column=0, padx=15, pady=15) coord1Entry.grid(row=0, column=1, padx=5, pady=5) coord2Entry.grid(row=1, column=1, padx=5, pady=5) tk.mainloop() tkinter_window() 

Esto se debe a que está utilizando cadenas idénticas para la opción de textvariable cuando necesita usar dos instancias diferentes de una de las variables tkinter especiales ( StringVar , etc.)

Por cierto, casi nunca necesitas usar textvariable . Mi consejo es omitirlo ya que claramente no lo estás usando.


Esto sucede porque el widget es solo una envoltura delgada alrededor de un widget implementado en un intérprete Tcl incrustado. El valor de cadena de la opción textvariable se trata como un nombre de variable global en el intérprete Tcl incorporado. Como ambas cadenas son iguales, se convierten en la misma variable dentro del intérprete tcl (y sí, "0.0" es perfectamente válido como variable tcl).

Este comportamiento es en realidad el motivo por el que la textvariable puede ser una herramienta tan poderosa: puede vincular dos o más widgets para que cuando un valor cambie en uno, se refleje inmediatamente en el otro. Además, es posible establecer trazas en estas variables para que pueda obtener una callback cuando la variable se lee, escribe o anula.

Sin embargo, esto es mucho más útil cuando se codifica en Tcl, ya que en Tcl una textvariable puede ser una variable normal de Tcl. En tkinter, debe ser un tipo especial de objeto (una instancia de StringVar , IntVar , DoubleVar o BooleanVar , por lo que no puede usarlo con variables comunes.