Изчистване на текстовата област в GUI на Python ToDo-app

Вече направих страхотно малко CLI To-Do приложение в python и сега се опитвам да създам основен GUI около него. Основните бутони, полето на място и вчера измислих как да пренасоча върнатия низ от моя Todo клас към текстовата област. Проблемът ми сега е как да изчистя текстовата област? В момента, ако натисна бутона „Преглед“, той непрекъснато пренасочва текста, без да изтрива предишния изход. Опитах се да създам функция с

self.text.delete('1.0','end') + функцията с изходния низ, но не работи. Можете ли да ми предложите нещо? Благодаря предварително!

import tkinter as tk
from tkinter import messagebox as mbox
from todo_app import ToDo, arguments
import sys


class ToDoGui:
    def __init__(self, root):
       self.t = ToDo()
       self.root = root
       self.mainframe = tk.Frame(self.root, bg="white")
       self.mainframe.pack(fill=tk.BOTH, expand=True)

       self.build_grid()
       self.build_banner()
       self.build_text_area()
       self.build_buttons()
       sys.stderr = TextRedirector(self.text, "stderr")
       self.entry()


def build_grid(self):
        self.mainframe.columnconfigure(0, weight=1)
        self.mainframe.rowconfigure(0, weight=0)
        self.mainframe.rowconfigure(1, weight=1)
        self.mainframe.rowconfigure(0, weight=0)


def build_banner(self):
    banner = tk.Label(
        self.mainframe,
        bg="orange",
        text="PyKeep",
        fg="green",
        font=('Helvetica', 24)
    )
    banner.grid(
        row=0, column=0,
        sticky='ew',
        padx=10, pady=10
    )

def build_buttons(self):
    buttons_frame = tk.Frame(self.mainframe)
    buttons_frame.grid(row=3, column=0, sticky='nsew',
                                         padx=10, pady=10)
    buttons_frame.columnconfigure(0, weight=1)
    buttons_frame.columnconfigure(1, weight=1)
    buttons_frame.columnconfigure(2, weight=1)
    buttons_frame.columnconfigure(3, weight=1)
    buttons_frame.columnconfigure(4, weight=1)

    self.clear_button = tk.Button(
        buttons_frame,
        text='Clear',
        command=self.text.delete('0.0', tk.END)
    )

    self.view_button= tk.Button(
        buttons_frame,
        text='View list',
        command=self.t.list_view
    )

    self.add_button = tk.Button(
        buttons_frame,
        text='Add task',
        command=None
    )

    self.remove_button = tk.Button(
        buttons_frame,
        text='Remove task',
        command=None
    )

    self.complete_button = tk.Button(
        buttons_frame,
        text='Complete task',
        command=None
    )
    self.clear_button.grid(row=0, column=0, sticky='ew')
    self.view_button.grid(row=0, column=1, sticky='ew')
    self.add_button.grid(row=0, column=2, sticky='ew')
    self.remove_button.grid(row=0, column=3, sticky='ew')
    self.complete_button.grid(row=0, column=4, sticky='ew')

def entry(self):
    entry_field = tk.Entry(self.mainframe, bd=2)
    entry_field.grid(row=1, column=0, sticky='nwse', padx=10, pady=10)
    entry_field.insert(0, 'Enter task OR number of a task')
    entry_field.focus()

def build_text_area(self):
    text_frame = tk.Text(self.mainframe, wrap="word")
    text_frame.grid(row=2, column=0, sticky='nsew',
                                    padx=10, pady=10)

    text_frame.columnconfigure(0, weight=1)
    text_frame.config(state=tk.DISABLED)
    text_frame.tag_configure("stderr", foreground="#b22222")
    self.text = text_frame
    return self.text

class TextRedirector(object):
    def __init__(self, widget, tag="stderr"):
        self.widget = widget
        self.tag = tag

    def write(self, str):
        self.widget.configure(state="normal")
        self.widget.insert("end", str, (self.tag,))
        self.widget.configure(state="disabled")

if __name__ == '__main__':
    root = tk.Tk()
    ToDoGui(root)
    root.mainloop()

person p3ter_l0dri    schedule 03.06.2016    source източник
comment
Да, пробвал съм това. self.clear_button = tk.Button( buttons_frame, text='Clear', command=lambda: self.text.delete(1.0, 'end') ) не изчиства полето.   -  person p3ter_l0dri    schedule 03.06.2016
comment
Какво значи не работи? За да изтриете текстова джаджа, трябва да направите точно това, което казахте, че сте опитали: self.text.delete("1.0", "end").   -  person Bryan Oakley    schedule 03.06.2016
comment
Нямате нужда от целия този код, за да възпроизведете проблема. Моля, премахнете всичко, което не е стриктно свързано с проблема. Всичко, от което се нуждаете за проблема, е една текстова джаджа и един бутон и кодът за изчистване на прозореца, за който казвате, че не работи. Вижте stackoverflow.com/help/mcve   -  person Bryan Oakley    schedule 03.06.2016


Отговори (1)


Съдържанието, което се опитвате да изтриете, не е съдържанието на Text. Това е вашата джаджа Entry.

def entry(self):
    entry_field = tk.Entry(self.mainframe, bd=2)
    entry_field.grid(row=1, column=0, sticky='nwse', padx=10, pady=10)
    entry_field.insert(0, 'Enter task OR number of a task')
    entry_field.focus()
    self.entry_field= entry_field #make entry widget class' object

#since there is only one row in common Entry, you need to only specify starting index 
self.clear_button = tk.Button(..., command=lambda: self.entry_field.delete(0, tk.END) 
person Lafexlos    schedule 03.06.2016
comment
Благодаря! Това реши проблема ми, но не мога да разбера защо. Можете ли да ме осветлите, моля? снимка на програмата Така че моята джаджа за влизане е горната част, където можете да въведете задача или номер за добавяне/премахване и т.н. И трябва да изтрия полето за въвеждане, а не текста, защо? - person p3ter_l0dri; 03.06.2016
comment
@p3ter_l0dri Text и Entry приспособленията са различни елементи. Поставяте вашите писания в приспособлението за влизане с entry_field.insert(0, 'Enter task OR number of a task'), така че трябва да го премахнете от там. - person Lafexlos; 03.06.2016