Python 如何将项目添加到列表框?

Python 如何将项目添加到列表框?,python,python-3.x,tkinter,listbox,Python,Python 3.x,Tkinter,Listbox,我正在创建一个简单的GUI程序来管理优先级。我在向列表框添加项目时遇到问题。我试图通过向构造函数传递两个属性来创建Priority类的实例,然后使用g.listBox.insertEND,item,但它似乎不是这样工作的。我得到一个错误: /usr/bin/python3.5/home/cali/pycharm项目/priorities/priorities.py Tkinter回调回溯最近调用last时出现异常: 文件/usr/lib/python3.5/tkinter/init.py,第15

我正在创建一个简单的GUI程序来管理优先级。我在向列表框添加项目时遇到问题。我试图通过向构造函数传递两个属性来创建Priority类的实例,然后使用g.listBox.insertEND,item,但它似乎不是这样工作的。我得到一个错误:

/usr/bin/python3.5/home/cali/pycharm项目/priorities/priorities.py Tkinter回调回溯最近调用last时出现异常: 文件/usr/lib/python3.5/tkinter/init.py,第1553行,在调用中 返回self.func*args文件/home/cali/PycharmProjects/priorities/priorities.py,第52行,in 增加列表项 item=Prioritysubject=g.textBox.get1.0,'end-1c',priority=g.textBox.get1.0,'end-1c'AttributeError:'GuiPart'对象没有属性'textBox'

进程已完成,退出代码为0

以下是我所做的:

# priorities.py
#   GUI program to manage priorities

from tkinter import *

class Priority:

    def __init__(self, subject, priority):
        self.subject = subject
        self.priority = priority

    def subject(self):
        return self.subject

    def priority(self):
        return self.priority


class GuiPart:

    def __init__(self):
        self.root = self.createWindow()

    def createWindow(self):

        root = Tk()
        root.resizable(width = False, height = False)
        root.title("Priorities")

        return root

    def createWidgets(self):

        Button(self.root,
               text = "Add",
               command = self.addItem).grid(row = 2, column = 0, sticky = W + E)

        Button(self.root,
               text="Remove",
               command = self.removeItem).grid(row = 2, column = 1, sticky = W + E)

        Button(self.root,
               text="Edit",
               command = self.editItem).grid(row = 2, column = 2, sticky = W + E)

        listBox = Listbox(width = 30).grid(row = 1, sticky = W + E, columnspan = 3)

        textBox = Text(height=10, width=30).grid(row = 3, columnspan = 3, sticky = W + E + N + S)


    def addItem(self):
        item = Priority(subject = g.textBox.get("1.0", 'end-1c'), priority = g.textBox.get("1.0", 'end-1c'))

        g.listBox.insert(END, item)

    def removeItem(self):
       pass

    def editItem(self):
        pass

class Client:
    pass

if __name__ == "__main__":
    g = GuiPart()
    g.createWidgets()
    g.root.mainloop()
我正在使用Python 3.5。

这些行导致错误:

这样做:


实际上,您并不是在创建listBox和textBox对象,而是在返回listBox和textBox。因此,如果我理解了您的目的,您正试图通过允许用户在文本区域小部件中键入其主题和顺序中的信息来描述优先级;之后,用户可以单击Add按钮将优先级信息插入列表框

<>你的代码中有很多事情要考虑。如果我去修复并逐一评论它们,我相信我的答案会很长,而我今天感觉很懒

我认为我下面的程序很容易理解,否则请澄清。我没有发现在文本区域中如何键入适当信息的固有规范。因此,我下面的程序的工作假设是用户在文本区域的第一行键入优先主题,然后使用新行键入优先顺序。单击“添加”按钮将导致在文本框小部件的同一行插入这两个数据,如下所示:

这是一个MCVE:

import tkinter as tk

class ProioritiesManager(tk.Frame):

   def __init__(self, master):
       tk.Frame.__init__(self, master)
       self.master = master
       self.master.resizable(width = False, height = False)
       self.master.title("Priorities")
       self.create_buttons()
       self.create_listbox()
       self.create_priorities_description_zone()

   def create_buttons(self):
       add_item = tk.Button(self.master, text='Add', command=self.add_item)
       add_item.grid(row=2, column=0, sticky=tk.W+tk.E)
       remove_item = tk.Button(self.master, text='Remove', command=self.remove_item)
       remove_item.grid(row=2, column=1, sticky=tk.W+tk.E)
       edit_item = tk.Button(self.master, text='Edit', command=self.edit_item)
       edit_item.grid(row=2, column=2, sticky=tk.W+tk.E)

   def create_listbox(self):
       self.item_alternatives = tk.Listbox(self.master, width=30)
       self.item_alternatives.grid(row=1, sticky=tk.W+tk.E, columnspan=3)   

   def create_priorities_description_zone(self):       
       self.priority_text_zone = tk.Text(self.master, height=10, width=30)
       self.priority_text_zone.grid(row=3, columnspan=3, sticky=tk.W+tk.E+tk.N+tk.S)

   def get_priority_subject(self):
       return self.priority_text_zone.get('1.0', '1.0 lineend')

   def get_priority_order(self):
       return self.priority_text_zone.get('2.0', '2.0 lineend')  

   def add_item(self):
       self.item_alternatives.insert(tk.END, self.get_priority_subject()+'  '+ self.get_priority_order())

   def remove_item(self):
       pass

   def edit_item(self):
       pass



if __name__ == "__main__":
    root = tk.Tk()
    ProioritiesManager(root)
    root.mainloop()
如果您希望为GUI提供良好的UX,那么最好添加一个按钮,允许用户清除文本区域的内容,以便他可以键入新的优先级:

为此,您可以添加一个rest按钮,通过添加以下两行代码来创建_按钮函数:

clear_text_area = tk.Button(self.master, text='Reset', command=self.reset_priority_text_zone)
clear_text_area.grid(row=4, column=2)
回调重置优先级文本区域的定义如下:

def reset_priority_text_zone(self):
       self.priority_text_zone.delete('1.0', tk.END)

非常感谢您,先生。不客气,如果我的代码中有您不理解的内容,请告诉我。
clear_text_area = tk.Button(self.master, text='Reset', command=self.reset_priority_text_zone)
clear_text_area.grid(row=4, column=2)
def reset_priority_text_zone(self):
       self.priority_text_zone.delete('1.0', tk.END)