Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x textvariables在tkinter中意外绑定在一起_Python 3.x_Tkinter - Fatal编程技术网

Python 3.x textvariables在tkinter中意外绑定在一起

Python 3.x textvariables在tkinter中意外绑定在一起,python-3.x,tkinter,Python 3.x,Tkinter,编写表格以处理库存的显示/输入。 下面的代码已配对到几乎为零。问题是,我有两个1字符的STR变量,它们以某种方式绑定在一起,我不知道如何或为什么 这两个变量在转换为STR后提取INT的第一个和第二个数字。如果INT的第一个和第二个数字相同,那么这两个STR变量将链接起来——对一个变量的更改反映在另一个变量中。如果两个数字不同,则两个STR变量没有链接。我很确定我在做什么蠢事,但我看不出来。我曾尝试过重命名变量、初始化、拆分代码、彻底消除所有内容,但问题仍然存在。有人想告诉我我在做什么蠢事吗 fr

编写表格以处理库存的显示/输入。 下面的代码已配对到几乎为零。问题是,我有两个1字符的STR变量,它们以某种方式绑定在一起,我不知道如何或为什么

这两个变量在转换为STR后提取INT的第一个和第二个数字。如果INT的第一个和第二个数字相同,那么这两个STR变量将链接起来——对一个变量的更改反映在另一个变量中。如果两个数字不同,则两个STR变量没有链接。我很确定我在做什么蠢事,但我看不出来。我曾尝试过重命名变量、初始化、拆分代码、彻底消除所有内容,但问题仍然存在。有人想告诉我我在做什么蠢事吗

from tkinter import *

class company_frame(Frame):
    def __init__(self, master):
        super().__init__(master)
        self["height"] = 40
        self["width"] = 1300
        self["relief"] = RAISED
        self["bd"] = 8
        self["bg"] = "#dfdfdf"

def inv_form():
    inv = [22001,"6' CAT6 Patch Cable, Blue",2.50,6.00,"02/01/2020","THD",1,1]
    cf = company_frame(root)
    cf.grid(row=0, column=2)

    class_id = StringVar()
    subclass_id = StringVar()
    item_id = StringVar()

    class_id =  str(inv[2])[0]
    subclass_id = str(inv[0])[1]
    item_id = str(inv[0])[2:5]

    # ENTRY SECTION
    class_e = Entry(cf, textvariable=class_id)
    class_e.delete(0, END)
    class_e.insert(0, class_id)
    class_e.config(width=1)

    subclass_e = Entry(cf, textvariable=subclass_id)
    subclass_e.delete(0, END)
    subclass_e.insert(0, subclass_id)
    subclass_e.config(width=1)

    item_e = Entry(cf, textvariable=item_id)
    item_e.delete(0, END)
    item_e.insert(0, item_id)
    item_e.config(width=3)

    #item num
    class_e.grid(row=3, column=1)
    subclass_e.grid(row=3, column=3)
    item_e.grid(row=3, column=5)
    return

root = Tk()
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
inv_form()
root.mainloop()
'''

Running python 3 on Ubuntu, tkinter is 8.6.
Any light is greatly appreciated.

问题是您没有将StringVar实例与条目小部件一起使用。您正在将textvariable属性设置为字符串,而不是StringVar。在这种特定情况下,前两个变量设置为字符串“2”,因此tkinter认为它们是同一个变量。第三个被设置为字符串001,因此tkinter将其视为一个单独的变量

这是因为您创建了StringVar的实例,然后立即重新使用相同的变量名来获取空字符串的值,因为您没有将其设置为任何其他值

您需要删除这三行代码,它们会导致您忘记对StringVar实例的引用:

class_id =  str(inv[2])[0]
subclass_id = str(inv[0])[1]
item_id = str(inv[0])[2:5]
您还可以删除以下代码行,其中您将显式地向条目小部件中插入一些内容

class_e.delete(0, END)
class_e.insert(0, class_id)
...
subclass_e.delete(0, END)
subclass_e.insert(0, subclass_id)
...
item_e.delete(0, END)
item_e.insert(0, item_id)
。。。然后添加以下三行以初始化条目小部件:

class_id.set(str(inv[2])[0])
subclass_id.set(str(inv[0])[1])
item_id.set(str(inv[0])[2:5])
但是,您可以将变量的创建和默认值的设置合并到一条语句中:

class_id = StringVar(value=str(inv[2])[0])
subclass_id = StringVar(value=str(inv[0])[1])
item_id = StringVar(value=str(inv[0])[2:5])
另一个不是问题直接原因的问题是,您正在对StringVar实例使用局部变量。当您这样做时,变量将被垃圾收集,您将无法在函数外部使用。在这种情况下,使用StringVar是毫无意义的


如果希望能够从另一个函数中的小部件获取值,则必须保存对小部件本身或StringVar的引用

很抱歉,我没有遵循。StringVar是局部变量,tkinter框架和变量的解引用也是局部变量。问题不在于变量在程序的不同部分发生变化,而是如果运行程序,更改第二个数字会更改帧中的第一个数字。两个未分配给彼此的局部变量不应该这样做,是吗?对不起,我的评论不正确。我没有仔细研究你的问题。局部变量的使用确实是不正确的,但这并不是你看到的问题的根本原因。Bryan-如果tkinter认为它们都是同一个变量,那么为什么它不同时更改项目id?关系问题似乎仅限于类id和子类id。我确实对此感到困惑,并试图理解这个问题。为什么要删除class_e/subclass_e/item_e的插入,它们不是空的,也不是琐碎的。@AKGlenn:我很抱歉。我写开头一段时有点马虎。我把它改写得更准确了。前两个textvariable选项被设置为字符串2,因此tkinter认为它们是同一个变量。第三个有不同的值,所以它与前两个没有关联。布莱恩-谢谢。您是对的,将vars设置为StringVars,分配值并删除删除/插入。我有个问题。为什么tkinter会认为我的原始版本的两个变量中的字符串“2”是同一个字符串。我想我真正的问题是什么时候tkinter会接受这种方法?我怀疑这个问题的答案是一个更大的编程问题,因此,如果将我指向其他地方是合适的,请这样做。谢谢你的帮助和时间。@AKGlenn有个问题。为什么tkinter会认为我的原始版本的两个变量中的字符串“2”是同一个字符串?因为tkinter构建在tcl/tk interepreter之上。传递给tcl/tk interepter的参数应该是变量的名称。因此,tcl将2视为第一个变量的名称,将2视为第二个变量的名称,因此它们是相同的变量。tcl变量可以是任何东西—数字、字符串、空字符串等等。@AKGlenn:我想我真正的问题是,tkinter什么时候可以接受这种方法我不知道该怎么回答。从使用tkinter的人的角度来看,答案可能是永远不会。使用整数或普通字符串作为textvariable选项的值是不可接受的。tkinter开发人员可能应该对这一点提出严格要求,但出于未知的原因,他们没有这样做。