2016-06-03 5 views
0

Ich habe bereits eine coole kleine CLI To-Do-Anwendung in Python, und jetzt versuche ich, eine grundlegende GUI um es herum zu bauen. Die Hauptschaltflächen, das Feld an Ort und Stelle und gestern habe ich herausgefunden, wie ich die Rückführungszeichenfolge von meiner Todo-Klasse in den Textbereich umlenke. Mein Problem ist jetzt, wie man den Textbereich löscht? Momentan, wenn ich den "View" -Button drücke, wird der Text ständig umgeleitet, ohne die vorherige Ausgabe zu löschen. Ich habe versucht, eine Funktion mitPython ToDo-App GUI mit Text löschen

self.text.delete ('1.0', 'Ende') + die Funktion mit der String-Ausgabe zu erstellen, aber es funktioniert nicht. Kannst du mir etwas vorschlagen? Danke im Voraus!

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() 
+0

Ja, ich habe das versucht. self.clear_button tk.Button = ( \t \t \t buttons_frame, \t \t \t text = 'Löschen', \t \t \t command = Lambda: self.text.delete (1,0, 'end') \t \t) das Feld nicht löschen. –

+0

Was bedeutet "nicht funktioniert"? Um ein Text-Widget zu löschen, tun Sie genau das, was Sie gesagt haben: 'self.text.delete (" 1.0 "," end ")'. –

+0

Sie benötigen nicht den gesamten Code, um das Problem zu reproduzieren. Bitte entfernen Sie alles, was nicht unbedingt mit dem Problem zusammenhängt. Alles, was Sie für das Problem benötigen, ist ein Text-Widget und eine Schaltfläche, und der Code zum Löschen des Fensters, das Sie sagen, funktioniert nicht. Siehe http://www.stackoverflow.com/help/mcve –

Antwort

1

Der Inhalt, den Sie löschen möchten, ist nicht Inhalt. Es ist dein Entry Widget.

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) 
+0

Danke! Es löste mein Problem, aber ich kann nicht herausfinden warum. Kannst du mich bitte aufhellen? [Bild des Programms] (https://github.com/greenfox-velox/szepnapot/blob/master/week-05/pykeep.png) Also mein Eintrag Widget ist der Anfang, wo Sie eine Aufgabe eingeben können oder Nummer zum Hinzufügen/Entfernen usw. Und ich muss das entry_field nicht den Text löschen, warum? –

+0

@ p3ter_l0dri ['Text'] (http://effbot.org/tkinterbook/text.htm) und [' Entry'] (http://effbot.org/tkinterbook/entry.htm) Widgets sind verschiedene Elemente. Sie schreiben Ihre Einträge in das Eingabe-Widget mit 'entry_field.insert (0, 'Aufgabe oder Nummer einer Aufgabe eingeben')', also sollten Sie sie von dort entfernen. – Lafexlos