为什么两个tkinter条目使用相同的数字?

时间:2018-01-20 02:34:09

标签: python python-3.x tkinter

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)

这是我定义似乎使用相同数字的两个条目的部分:

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

所以问题是,当我运行程序时,他们像往常一样没有显示任何内容。但是只要我在其中一个条目中输入一个字符,它们就会显示字符。我不明白为什么,他们使用不同的变量?有人能帮助我吗?

    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()

问题所在的主要代码区域(根据要求):

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()

1 个答案:

答案 0 :(得分:2)

这是因为当您需要使用其中一个special tkinter variablestextvariable等)的两个不同实例时,StringVar选项使用相同的字符串

顺便说一下,你几乎不需要使用textvariable。我的建议是省略它,因为你显然没有使用它。

这是因为窗口小部件只是嵌入式Tcl解释器中实现的窗口小部件的一个薄包装器。 textvariable选项的字符串值在嵌入式Tcl解释器中被视为全局变量名。由于两个字符串都相同,因此它们在tcl解释器中变为相同的变量(是的,"0.0"完全有效作为tcl变量)。

这种行为实际上是textvariable可以成为如此强大工具的原因 - 您可以将两个或多个小部件链接在一起,这样当一个值发生变化时,它会立即反映在另一个中。另外,可以在这些变量上设置跟踪,以便在读取,写入或取消设置变量时获得回调。

然而,当在Tcl中编码时,这更有用,因为在Tcl中textvariable可以是正常的Tcl变量。在tkinter中,它必须是一种特殊类型的对象 - StringVarIntVarDoubleVarBooleanVar的实例 - 因此您无法使用它与普通变量。