Tkinter 条目小部件在使用笔记本时不会接受输入

Tkinter entry widget wont take input when using notebook

我正在尝试使用 Python Tkinter 使用 Notebook 从条目小部件获取输入。我已经设法让它在我的主 canvas 上工作,但是一旦我引入选项卡,它就无法工作。我显然遗漏了一些将 .get 函数链接到正确位置的东西,但我不知道是什么。有什么想法吗?

import tkinter 
import win32api
from tkinter import ttk 

checklist = tkinter.Tk()

checklist.title("My Checklist")
ScreenWidth=checklist.winfo_screenwidth()
ScreenHeight=checklist.winfo_screenheight()
checklist.geometry("%dx%d+0+0" % (ScreenWidth, ScreenHeight))

count = 0
tasks = []

tabcontrol = ttk.Notebook(checklist, width = 500, height = 500)
tab = ttk.Frame(tabcontrol)
tabcontrol.add(tab, text = "Checklist Home Page")
tabcontrol.grid(row = 0, column = 0)

main_canvas = tkinter.Canvas(checklist, width = 1000, height = 1000, highlightbackground="green")
main_canvas.grid(row=1, column = 0)
main_canvas.columnconfigure(3)
main_canvas.rowconfigure(6)

def create_checklist():
        global count
        count += 1
        if count > 10:
            win32api.MessageBox(0, 'Maximum number of checklists made!')
        else:
            tab = ttk.Frame(checklist, width = 500, height = 500)
            tabcontrol.add(tab, text = count)
            tabcontrol.grid(row = 0, column = 0)
            button_add_task = tkinter.Button(tab, text="Add task", width=20, height=1, bg="purple", command=add_task).grid(row = 2, column= 2, pady = (100, 1))
            item_entry = tkinter.Entry(tab).grid(row=6, column =2)    
            list_items = tkinter.Listbox(tab)
            list_items.grid(row =7, column =2, pady=10)

def add_task():
    task = item_entry.get()
    if task !="":
        tasks.append('- ' + task)
        update_listbox()

button_create_checklist = tkinter.Button(main_canvas, text="New Checklist", width=20, height=1, bg = "purple", command=create_checklist).grid(row = 3, column = 2, pady = 1 )

checklist.mainloop()

我目前的错误是:

 Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\lucas\anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\lucas\OneDrive\Documents\Employability\untitled0999py.py", line 40, in add_task
    task = item_entry.get()
NameError: name 'item_entry' is not defined

因为item_entry是函数create checklist()的局部变量,不能在add_task()函数中使用。因此,只要按下 Add Task 按钮,我们就会传递 Entry 字段的值。为此,我们可以在 Buttoncommand 选项中使用 lambda 表达式。 add_task() 函数有一些小的变化。

记住: grid是用来组织widget的,它returns None,所以 item_entry 将是您代码中的一个 NoneType 对象,使用 get() 将引发 AttributeError。 所以,我们需要替换

item_entry = tkinter.Entry(tab).grid(row=6, column =2)

item_entry = tkinter.Entry(master=tab)    
item_entry.grid(row=6, column =2)

这段代码工作正常:

def create_checklist():
        global count
        count += 1
        if count > 10:
           win32api.MessageBox(0, 'Maximum number of checklists made!')
        else:
            tab = ttk.Frame(checklist, width = 500, height = 500)
            tabcontrol.add(tab, text = count)
            tabcontrol.grid(row = 0, column = 0)
            item_entry = tkinter.Entry(master=tab)    # Changes in
            item_entry.grid(row=6, column =2)         # these lines
            button_add_task = tkinter.Button(tab, text="Add task", width=20, height=1, bg="purple", command=lambda :add_task(item_entry.get())).grid(row = 2, column= 2, pady = (100, 1))
            list_items = tkinter.Listbox(tab)
            list_items.grid(row =7, column =2, pady=10)


def add_task(task):
    if task !="":
        tasks.append('- ' + task)
        update_listbox()

希望这对您有所帮助。