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()
答案 0 :(得分:2)
这是因为当您需要使用其中一个special tkinter variables(textvariable
等)的两个不同实例时,StringVar
选项使用相同的字符串
顺便说一下,你几乎不需要使用textvariable
。我的建议是省略它,因为你显然没有使用它。
这是因为窗口小部件只是嵌入式Tcl解释器中实现的窗口小部件的一个薄包装器。 textvariable
选项的字符串值在嵌入式Tcl解释器中被视为全局变量名。由于两个字符串都相同,因此它们在tcl解释器中变为相同的变量(是的,"0.0"
完全有效作为tcl变量)。
这种行为实际上是textvariable
可以成为如此强大工具的原因 - 您可以将两个或多个小部件链接在一起,这样当一个值发生变化时,它会立即反映在另一个中。另外,可以在这些变量上设置跟踪,以便在读取,写入或取消设置变量时获得回调。
然而,当在Tcl中编码时,这更有用,因为在Tcl中textvariable
可以是正常的Tcl变量。在tkinter中,它必须是一种特殊类型的对象 - StringVar
,IntVar
,DoubleVar
或BooleanVar
的实例 - 因此您无法使用它与普通变量。