【问题标题】:Why are the two tkinter entries using the same number?为什么两个 tkinter 条目使用相同的数字?
【发布时间】:2018-01-20 02:34:09
【问题描述】:
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()

【问题讨论】:

  • 请为您遇到的问题创建一个minimal reproducible example,而不是切片代码。
  • 您可能希望查看this 以决定何时使用textvariable 选项。

标签: python python-3.x tkinter


【解决方案1】:

这是因为当您需要使用 special tkinter variablesStringVar 等)之一的两个不同实例时,您对 textvariable 选项使用相同的字符串

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


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

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

然而,这在 Tcl 中编码时更有用,因为在 Tcl 中,textvariable 可以是一个普通的 Tcl 变量。在 tkinter 中,它必须是一种特殊类型的对象——StringVarIntVarDoubleVarBooleanVar 的实例——所以你不能将它与普通变量一起使用。

【讨论】:

  • K,谢谢,我不太明白这两个条目是如何连接在一起的,但我将“o,o”替换为“”。
  • @Nae:我已经更新了我的答案,试图简要描述正在发生的事情。
  • @Cedric:如果你将"0.0" 替换为"",你还不如根本不使用textvariable。使用textvariable唯一 原因是您想稍后访问它。否则它毫无用处
  • 使用textvariable 的原因是您可以稍后更新它。这都是 Tk 的原生 MVP 系统的一部分。 Tkinter 代码通常不会很好地利用它(或者它会使用StringVar 更多的trace 方法)。
  • 是的,但是由于您可以在没有 textvariable 的情况下更新小部件,因此在 tkinter 中它相当无用,除非您要添加跟踪或除非您明确想要将两个或更多小部件绑定在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多