Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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 Tkinter:输入框值不为';t存储到StringVar()对象中_Python_Tkinter_Tkinter Entry - Fatal编程技术网

Python Tkinter:输入框值不为';t存储到StringVar()对象中

Python Tkinter:输入框值不为';t存储到StringVar()对象中,python,tkinter,tkinter-entry,Python,Tkinter,Tkinter Entry,我试图查看Entry小部件中输入的值是否存储在StringVar()对象中,但当我打印string value对象的长度时,它显示为0 class POS(tk.Tk): def __init__(self,*args,**kwargs): tk.Tk.__init__(self, *args, **kwargs) """ some code to build multiple frames here """ class MainPage(tk.Frame):

我试图查看Entry小部件中输入的值是否存储在StringVar()对象中,但当我打印string value对象的长度时,它显示为0

class POS(tk.Tk):
def __init__(self,*args,**kwargs):
    tk.Tk.__init__(self, *args, **kwargs)
    """
    some code to build multiple frames here
    """

class MainPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)

        frame5 = Frame(self, bg = "pink")
        frame5.pack(fill = BOTH)

        frame5Label1 = tk.Label(frame5, text = "Product Bar Code", font = NORMAL_FONT)
        frame5Label1.grid(row = 0, column = 0, padx=5, pady=5, sticky = W)

        barCode = StringVar()
        frame5EntryBox = ttk.Entry(frame5, textvariable = barCode, width = 40)
        frame5EntryBox.grid(row = 0, column = 1, padx = 5, pady = 5)

        frame5Button = ttk.Button(frame5, text = "Add Item", command = lambda: updateCustomerList(barCode))
        frame5Button.grid(row = 0, column = 2, padx = 130, pady = 10)


def updateCustomerList(barCode):
    print(len(barCode.get()))

app = POS()
app.geometry("700x700")
app.resizable(False,False)
app.mainloop()

最小工作示例,显示按下
按钮后分配给
条目的
StringVar
长度

import tkinter as tk

# --- functions ---

def check():
    print('len:', len(var.get()))

# --- main ---

root = tk.Tk()

var = tk.StringVar()

ent = tk.Entry(root, textvariable=var)
ent.pack()

but = tk.Button(root, text="Check", command=check)
but.pack()

root.mainloop()
mainloop
显示带有小部件的窗口,因此在启动
mainloop
之前使用
len()
毫无意义,因为
var
仍然为空


编辑:与您的类和函数一起在类外编辑

import tkinter as tk
from tkinter import ttk

# --- classes ---

class MainPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        frame5 = tk.Frame(self, bg="pink")
        frame5.pack(fill="both")

        frame5Label1 = tk.Label(frame5, text="Product Bar Code", font="NORMAL_FONT")
        frame5Label1.grid(row=0, column=0, padx=5, pady=5, sticky="w")

        barCode = tk.StringVar()
        frame5EntryBox = ttk.Entry(frame5, textvariable=barCode, width=40)
        frame5EntryBox.grid(row=0, column=1, padx=5, pady=5)

        frame5Button = ttk.Button(frame5, text="Add Item", command=lambda:updateCustomerList(barCode))
        frame5Button.grid(row=0, column=2, padx=130, pady=10)

# --- functions ---

def updateCustomerList(barCode):
    print(len(barCode.get()))

# --- main ---

root = tk.Tk()

main = MainPage(root, root)
main.pack()

root.mainloop()
或者使用
self.
并将函数作为方法放入类中

import tkinter as tk
from tkinter import ttk

# --- classes ---

class MainPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        frame5 = tk.Frame(self, bg="pink")
        frame5.pack(fill="both")

        frame5Label1 = tk.Label(frame5, text="Product Bar Code", font="NORMAL_FONT")
        frame5Label1.grid(row=0, column=0, padx=5, pady=5, sticky="w")

        self.barCode = tk.StringVar()
        frame5EntryBox = ttk.Entry(frame5, textvariable=self.barCode, width=40)
        frame5EntryBox.grid(row=0, column=1, padx=5, pady=5)

        frame5Button = ttk.Button(frame5, text="Add Item", command=self.updateCustomerList)
        frame5Button.grid(row=0, column=2, padx=130, pady=10)

    def updateCustomerList(self):
        print(len(self.barCode.get()))

# --- functions ---


# --- main ---

root = tk.Tk()

main = MainPage(root, root)
main.pack()

root.mainloop()

您在创建小部件后大约1毫秒调用print语句,由于您没有给它指定值,因此该值为空字符串。请创建一个。我如何使它在按下按钮时工作?我用同样的方法按下按钮,输出同样的打印语句。我可以添加一个sleep变量,但是如果用户花费的时间太长,那么它就不能正常工作。这些小部件是否需要等待运行?定义一个适当的函数用作按钮回调,在该函数中调用
print
mainloop()
启动程序,以便
len()
甚至在tkinter显示窗口之前以及
frame5EntryBox
barCode
仍然为空时执行。通过
打印(len(barCode.get())
分配给按钮正常功能。在按下按钮之前,别忘了在
frame5EntryBox
中输入一些文本。我一直在尝试将其复制到我的代码中,但由于我在应用程序中构建了多个框架,所以在哪里放置“检查”功能会让人困惑。截至目前我编辑的代码,我仍然有相同的问题。我尝试将函数放在init MainFramePage函数之前和之后,但它表示函数未定义。我将把它放在
MainFramePage
中作为它的方法,我将使用
self.barCode
,这样我就可以在不使用
lambda
的情况下使用它。如果出现错误
“函数未定义”
那么可能您有错误的缩进,函数在类内,但它必须在类外。我以前在您的编辑中尝试过第一个缩进,但仍然得到值0(即空),我使用self进行了尝试,得到了相同的答案:0(即空)在按下按钮之前,您是否在
条目中输入了文本?或者显示完整的代码-它可以链接到外部驱动器或GitHub或类似。