【问题标题】:If I created widgets in one function, how can I access them in another function using Python Tkinter?如果我在一个函数中创建了小部件,如何使用 Python Tkinter 在另一个函数中访问它们?
【发布时间】:2025-12-09 09:35:01
【问题描述】:

这是我第一个使用 Tkinter 的项目,如果问题很容易解决,请原谅。 根据用户从下拉列表中选择的选项,我调用一个函数,该函数在框架上创建和放置某些小部件(例如条目)。然后,当按下另一个按钮时,我想访问此条目中的文本。但是,这似乎给了我错误(说小部件未定义),因为我想访问我在调用函数时创建的小部件。

我看到的一个明显的解决方案是创建我想在函数之外使用的所有可能的小部件,并且仅在调用函数时放置它们。这似乎很草率,并产生了更多问题。还有其他解决方法吗?

提前致谢!

这是我在框架上创建和放置小部件的函数。

def loadBook():
    print("book is loaded")
    #Authors
    labelAuth1 = tk.Label(frame, text="Author 1 Name:")
    entryAuth1 = tk.Entry(frame)

    labelAuth1.place(relwidth=0.23, relheight=0.08, rely=0.1)
    entryAuth1.place(relheight=0.08, relwidth=0.18, relx=0.3, rely=0.1)

这是一个函数的 sn-p,它使用我在上面创建的条目小部件的输入:

def isBook():
    if len(entryAuthSur1.get())==0:
        pass
    else:
        bookString = ""
        bookString += entryAuthSur1.get()

当第二个函数执行时,我得到一个运行时错误,entryAuthSur1 未定义。

【问题讨论】:

  • 你能告诉我们你的代码吗?我的猜测是变量不是全局的。
  • @TheLizzard 感谢您的想法,我刚刚编辑以显示代码
  • 就在print("book is loaded")if len(entryAuthSur1.get())==0: 之前添加global entryAuthSur1。那应该可以解决您的问题。

标签: python tkinter widget


【解决方案1】:

函数内的所有变量都是局部变量。这意味着它在函数调用结束后被删除。由于您的变量 (entryAuth1) 不是全局变量,因此它只存在于函数内部,并在 loadBook 函数结束时被删除。这是工作代码:

import tkinter as tk

# Making a window for the widgets
root = tk.Tk()


def loadBook():
    global entryAuth1 # make the entry global so all functions can access it
    print("book is loaded")
    #Authors
    labelAuth1 = tk.Label(root, text="Author 1 Name:")
    entryAuth1 = tk.Entry(root)
    # I will check if the user presses the enter key to run the second function
    entryAuth1.bind("<Return>", lambda e: isBook())

    labelAuth1.pack()
    entryAuth1.pack()

def isBook():
    global entryAuth1 # make the entry global so all functions can access it

    # Here you had `entryAuthSur1` but I guess it is the same as `entryAuth1`
    if len(entryAuth1.get())==0:
        pass
    else:
        bookString = ""
        bookString += entryAuth1.get()
        print(bookString) # I am going to print the result to the screen


# Call the first function
loadBook()

root.mainloop()

【讨论】:

  • entryAuth1.bind("&lt;Return&gt;", lambda e: isBook())更改为entryAuth1.bind("&lt;Return&gt;", lambda e: isBook(e.widget)),将def isBook()更改为def isBook(entryAuth1),则无需将entryAuth1声明为全局。
  • 我知道这会更容易,但我认为 OP 可以从更多地了解全局/局部变量中受益,因为它们在任何地方都可以使用。如果我使用entryAuth1.bind("&lt;Return&gt;", isBook)def isBook(event): entryAuth1 = event.widget 也会更容易。基本上在第二个函数中移动event.widget