Очистка текстовой области в графическом интерфейсе приложения Python ToDo

Я уже сделал классное небольшое приложение CLI To-Do на python, и теперь я пытаюсь создать базовый графический интерфейс вокруг него. Основные кнопки, поле на месте, и вчера я понял, как перенаправить возвращаемую строку из моего класса 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
Спасибо! Это решило мою проблему, но я не могу понять, почему. Не могли бы вы облегчить меня, пожалуйста? фото программы Итак, мой виджет входа это верх, где вы можете ввести задачу или номер, чтобы добавить/удалить и т. д. И мне нужно удалить поле entry_field, а не текст, почему? - 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