【问题标题】:List won't bring up definition when item is clicked on单击项目时列表不会显示定义
【发布时间】:2021-07-15 20:59:38
【问题描述】:

我已经开始学习如何编码,目前正在学习 Python 的基础知识。我一直在尝试让一个小型待办事项列表应用程序工作并在我单击列表项时显示描述,但它出现“无属性描述”。有人可以告诉我我的代码中缺少什么吗?

from tkinter import *
from tkinter.font import BOLD
import tkinter as tk


class ToDoItem:
    def __init__(self, name, description):
        self.name= name
        self.description = description

class ToDoListApp:
    def __init__(self, root):
        root.title("To Do List")
    
        frame = Frame(root, borderwidth=2, relief=SUNKEN)
        frame.grid(column=1,row=1, sticky= (N, E, S, W))
        root.columnconfigure(1, weight=1)
        root.rowconfigure(1, weight=1)

        list_label= Label(frame, text='To Do Items')
        list_label.grid(column=1,row=1, sticky=(S, W))
        
        self.to_do_items = [
            ToDoItem('cleaning','laundry,dishes,sweeping'),
            ToDoItem('job','coding, dashing, bills'),
            ToDoItem('self_care', 'bubble bath , manicure, sleep'),
            ]
        
        self.to_do_names =StringVar(value= list(map(lambda x: x.name,self.to_do_items)))
        items_list= Listbox(frame, listvariable=self.to_do_names)
        items_list.bind('<<ListboxSelect>>',lambda s: self.select_item(items_list.curselection()))
        items_list.grid(column=1,row=2, sticky= (W, E), rowspan=5)
        
        self.selected_descriptions =StringVar()
        selected_descriptions_label = Label(frame, textvariable=self.selected_descriptions, wraplength=200)
        selected_descriptions_label.grid(column=1, row=7, sticky=(E, W))

        #New ITem

        new_item_label= Label(frame, text="new item")
        new_item_label.grid(column=2,row=1, sticky=(S,W))

        name_label= Label(frame, text="item name")
        name_label.grid(column=2,row=2, sticky=(S,W))

        self.name= StringVar()
        name_entry=Entry(frame, textvariable=self.name)
        name_entry.grid(column=2,row=3, sticky=(N,E,W))

        #Description/Definition

        description_label= Label(frame, text="item description")
        description_label.grid(column=2,row=4, sticky=(S,W))

        self.description=StringVar()
        description_entry=Entry(frame, textvariable=self.description)
        description_entry.grid(column=2,row=5, sticky=(N,E,W))

        save_button= Button(frame, text= 'save', command=self.save_item)
        save_button.grid(column=2,row=6, sticky=(E))

    def save_item(self,):
        name= self.name.get()
        description =self.description.get()
        new_item=ToDoItem(name,description)
        self.to_do_items.append(new_item)
        self.to_do_names.set(list(map(lambda x: x.name,self.to_do_items)))

    def select_item(self, index):
        selected_item =self.to_do_items[index[0]]
        self.selected_descriptions.set(selected_item.descriptions)

root = Tk()
ToDoListApp(root)

root.mainloop()

【问题讨论】:

  • 请发布完整的回溯。听起来selected_item 不是ToDoItem 对象。

标签: python user-interface tkinter


【解决方案1】:

这只是一个错字。
你写的

def select_item(self, index):
   selected_item =self.to_do_items[index[0]]
   self.selected_descriptions.set(selected_item.descriptions)

你得到的错误是

AttributeError: 'ToDoItem' object has no attribute 'descriptions'

这是因为 ToDoItem 类具有属性 description 而不是 descriptions

删除 s 就完成了。

def select_item(self, index):
   selected_item =self.to_do_items[index[0]]
   self.selected_descriptions.set(selected_item.description)

【讨论】:

  • 您应该将该问题标记为错字并留下评论,而不是发布对此的答案。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多