Emailantworte das ' > ' entfernen

Fragen zu Tkinter.
Antworten
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Montag 12. Juni 2006, 15:18

Hallo,

bin neu in der Pythonprogrammiersprache ! ( Programmieren ueberhaupt )
Ich hoffe ihr wisst was ich mit dem Titel meine!

( Bei uns in der Arbeit, muss ich so einige Emails beantworten )
Wenn mann eine Emialantwort bekommt, werden doch diese ' > ' Zeichen (auch hausdaecher genannt)
zur der Nachricht eingefuegt. Das mag ich nicht und dachte, ja mach halt was mit Python !!

Ich hätte niegedacht, dass es nur 4 Zeilen Code werden ! :shock:

das ist meine Funktion.

Code: Alles auswählen


def haus_dach_weg(x):
	teile_x = x.split('>')
	for n in teile_x:
		print n,#
#test Code

text='''
>>> Beautiful is better than ugly.
>>> Explicit is better than implicit.
'''
haus_dach_weg(text)

#ausgabe.
   Beautiful is better than ugly.
   Explicit is better than implicit.
So nun habe ich dazu eine Oberflaeche gecodet..... die sieht so aus

Code: Alles auswählen

from Tkinter import *

class Main:
    def __init__(self):
        self.fenster=Tk()
        #____________SCROLLBARS______________________________
        self.scrollbar=Scrollbar(self.fenster)
        self.scrollbar.pack(side=RIGHT, fill=Y)

        self.scrollbar2=Scrollbar(self.fenster)
        
        #self.scrollbar2.pack(side=BOTTOM, fill=X)

        #____________LABELS_________________________________
        self.label1=Label(self.fenster, fg='blue',
                          text='text_feld_1', font=(None, 14))
        self.label2=Label(self.fenster, fg='blue',
                          text='text_feld_2', font=(None, 14))
        self.label1.pack(pady=4)

        #____________TEXTFELDER______________________________
        self.text_feld_1 = Text(self.fenster, width=40,
                        height=10, bg='white', font=(None, 10),wrap=WORD,
                                yscrollcommand=self.scrollbar.set)
        self.text_feld_1.pack(padx=6, pady=6)
        self.label2.pack()
        self.text_feld_2 = Text(self.fenster, width=40,
                        height=10, bg='white', font=(None, 10))
        self.text_feld_2.pack(padx=6, pady=10)

        #____________BUTTONS_________________________________
        self.button=Button(self.fenster, text='Haus_Weg', width=10, height=2)
        self.button.pack(pady=10)
        self.scrollbar.config(command=self.text_feld_1.yview)
      
        self.fenster.mainloop()

m=Main()
aber ich bekomme es einfach nichthin, dass wenn ich ein Email in den Text_feld_1 einfuege, soll durch einen klick auf dem Button 'Haus_Weg'
die Daecher in den Text_feld_2 eingefuegt werden so das die Daecher verschwinden:

ich habe es schon mit probiert

Code: Alles auswählen

def haus_weg():
	text_feld_2.insert(END, text_feld_1.get())
ich bekommen dann immer eine fehler.

Kann mir bitte einer helfen. Erlich Jungs ich habe schon so einigesachen versucht, ich bekomme es einfach nicht gebacken.

Danke&Gruss
pyStyler

edit war nicht richtig Formuliert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 12. Juni 2006, 16:14

pyStyler hat geschrieben:Ich hoffe ihr wisst was ich mit dem Titel meine!
Hi pyStyler!

Ohne jetzt auf dein Python-Problem eingehen zu wollen, stellt sich mir eine Frage: "Warum willst du die '>' los werden?". Die sind wichtig!

http://www.afaik.de/usenet/faq/zitieren ... php3#ss1.1

So verfahre ich auch mit meinen Mails. Und fahre gut damit.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Montag 12. Juni 2006, 16:40

gerold hat geschrieben:
pyStyler hat geschrieben:Ich hoffe ihr wisst was ich mit dem Titel meine!
Hi pyStyler!

Ohne jetzt auf dein Python-Problem eingehen zu wollen, stellt sich mir eine Frage: "Warum willst du die '>' los werden?". Die sind wichtig!

http://www.afaik.de/usenet/faq/zitieren ... php3#ss1.1

So verfahre ich auch mit meinen Mails. Und fahre gut damit.

mfg
Gerold
:-)
also es ist meistens so, dass ich in der CC ( Antwort an ) so um die 10 Leute drauf habe. Wenn ich jetzt mit denen schreibe, dann werden die ' > '
doch etwas laenger, deswegen dachte ich ,ich mache sie weg.

Mich stören die ' > ' nicht wriklich denn es hat ja seinen Sinn warum sie da sind, wie es wunderbar im obigen Link erklärt wird.

Vlt kann mir trotzdem jemand bei meinem Problem helfen.
Gruss
pyStyler
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 12. Juni 2006, 17:42

...nach Tkinter verschoben.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Montag 12. Juni 2006, 18:16

achja das ist es geblieben... hier ist es auch besser aufgehoben denke ich :) .

mein code sieht jetzt so aus...

Code: Alles auswählen

#! /usr/bin/python
from Tkinter import *

class Main:
	def __init__(self):
		self.fenster=Tk()
		self.frame=Frame(self.fenster, width=400, height=200)
		self.frame.pack()
		
		self.label=Label(self.frame, text='T E X T F E L D',
			font=(None, 14))
		self.label.pack()
		
		self.scrollbar=Scrollbar(self.frame)
		self.scrollbar.pack(side=RIGHT, fill=Y)
		
		self.text=Text(self.frame, wrap=WORD, 
				font=(None, 10), bg='white', 
				width=50, height=10,yscrollcommand=self.scrollbar.set)
		self.text.pack(pady=30, padx=30, expand=YES)
		self.scrollbar.config(command=self.text.yview)
		
		self.text_eingabe=Entry(self.frame, width=60)
		self.text_eingabe.pack(expand=YES, pady=10)
		
		self.button=Button(self.frame, text='(...)',
				width=10, height=2, command=self.haus_loeschen)
		self.button.pack(pady=10)
		self.fenster.mainloop()
		
	def haus_loeschen(self):
		eingabe_lesen=self.text_eingabe.get()
		haus_loeschen=eingabe_lesen.split('>')
		for  n in haus_loeschen:
			self.text.insert(END, n)

		
		self.text_eingabe.config(text='')
m=Main()
mit 2 Textfelder krieg ich es imm noch nicht hin..
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 12. Juni 2006, 18:44

pyStyler hat geschrieben:

Code: Alles auswählen

	def haus_loeschen(self):
		eingabe_lesen=self.text_eingabe.get()
		haus_loeschen=eingabe_lesen.split('>')
		for  n in haus_loeschen:
			self.text.insert(END, n)
		
		self.text_eingabe.config(text='')
m=Main()
Hi pyStyler!

Dieser Code löscht alle ">"-Zeichen im Text und das auf ziemlich unkonventionelle Art und Weise. Warum? Weil der Text in eine Liste aufgesplittet wird und dann wird jedes Listenelement einzeln angefügt.
Die Idee ist zwar nicht schlecht, aber der Code:

Code: Alles auswählen

""">>> irgendein Text""".replace(">", "")
würde das gleiche tun. Er würde einfach alle ">"-Zeichen durch "" ersetzen.

Hier ein Stück Code, das nicht alle ">"-Zeichen, sondern nur die ">"-Zeichen löscht, die am Anfang einer Zeile stehen. Diese Aufgabe kann man auf verschiedenste Arten lösen. Das ist eine davon.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

def bereinigen(original_text):
    """
    Entfernt die Größerzeichen (>) vom Anfang jeder Zeile.
    Gibt einen String ohne die führenden Größerzeichen zurück.
    
    :param original_text: String mit dem Text, der geändert werden soll.
    """

    # Das ginge mit Regular Expressions zwar in wenigen Codezeilen,
    # aber man muss ja nicht unbedingt mit RE anfangen. ;-)

    # Text in einzelne Zeilen aufsplitten
    lines = original_text.split("\n")
    
    # Ziel-Liste als Zwischenstation
    ret_list = []

    # Jede Zeile durchlaufen
    for line in lines:
        counter = 0
        while True:
            # Leerzeichen und Zeilenumbrüche vom Anfang und vom Ende
            # der Zeile entfernen.
            line = line.strip()
                
            # Prüfen ob die Zeile mit einem Größerzeichen beginnt.
            # Wenn JA --> entfernen
            if line.startswith(">"):
                line = line[1:]
                counter += 1 # Zählt jede Ersetzung
            else:
                # Kein Größerzeichen mehr --> ab in die Liste damit
                ret_list.append(" " * counter + line)
                break
    
    # Aus der Liste wieder einen String machen und zurück geben
    return "\n".join(ret_list)

if __name__ == "__main__":
    # Testen
    text = '''
    >> Irgendjemand schrieb:
    >>> Beautiful is better > > than ugly.
    >>> Explicit is better > > than implicit.
    
    > Martin schrieb:
    >> Jetzt ist Winter.
    
    Gerold schrieb:
    > Das Tal ist bunt.
    '''
    print bereinigen(text)
Dein Problem mit Tkinter ist eine andere Sache. Vielleicht hilft dir dabei jemand anders. Ich bin nicht mehr so fit mit Tkinter.

mfg
Gerold
:-)
Zuletzt geändert von gerold am Montag 12. Juni 2006, 20:33, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 12. Juni 2006, 19:17

Ich weiß. -- Es passt nicht ins Tkinter-Forum. Aber so lange niemand eine Lösung mit Tkinter aufzeigt... :twisted:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

# Benötigt wxPython, das man unter http://www.wxpython.org/download.php
# herunterladen kann.

import wx


def bereinigen(original_text):
    """
    Entfernt die Größerzeichen (>) vom Anfang jeder Zeile.
    
    :param original_text: String mit dem Text, der geändert werden soll.

    Gibt einen String ohne die führenden Größerzeichen zurück.
    """

    # Das ginge mit Regular Expressions zwar in wenigen Codezeilen,
    # aber man muss ja nicht unbedingt mit RE anfangen. ;-)

    # Text in einzelne Zeilen aufsplitten
    lines = original_text.split("\n")
    
    # Ziel-Liste als Zwischenstation
    ret_list = []

    # Jede Zeile durchlaufen
    for line in lines:
        counter = 0
        while True:
            # Leerzeichen und Zeilenumbrüche vom Anfang und vom Ende
            # der Zeile entfernen.
            line = line.strip()
                
            # Prüfen ob die Zeile mit einem Größerzeichen beginnt.
            # Wenn JA --> entfernen
            if line.startswith(">"):
                line = line[1:]
                counter += 1 # Zählt jede Ersetzung
            else:
                # Kein Größerzeichen mehr --> ab in die Liste damit
                ret_list.append(" " * counter + line)
                break
    
    # Aus der Liste wieder einen String machen und zurück geben
    return "\n".join(ret_list)


class MyFrame(wx.Frame):
    """
    Hauptfenster
    """
    
    def __init__(
        self, parent = None, id = -1, 
        title = "Text bereinigen",  size = (700, 400)
    ):
        """
        Initialisierung
        """
        
        wx.Frame.__init__(self, parent, id, title, size = size)
        
        panel = wx.Panel(parent = self)
        
        hb = wx.BoxSizer(wx.HORIZONTAL)
        panel.SetSizer(hb)
        
        # Originaltext
        vb = wx.BoxSizer(wx.VERTICAL)
        
        label = wx.StaticText(parent = panel, id = -1, label = "Originaltext")
        vb.Add(label, proportion = 0, flag = wx.ALL, border = 5)
        
        self.tc_original = wx.TextCtrl(
            parent = panel, id = -1, style = wx.TE_MULTILINE | wx.TE_DONTWRAP
        )
        vb.Add(
            self.tc_original, proportion = 1, 
            flag = wx.ALL | wx.EXPAND , border = 5
        )
        hb.Add(vb, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
        
        # Button
        self.btn_bereinigen = wx.Button(panel, id = -1, label = "Bereinigen >>")
        self.Bind(event = wx.EVT_BUTTON, handler = self.text_bereinigen)
        hb.Add(self.btn_bereinigen, proportion = 0, flag = wx.CENTER)
        
        # bereinigter Text
        vb = wx.BoxSizer(wx.VERTICAL)
        
        label = wx.StaticText(parent = panel, id = -1, label = "Bereinigter Text")
        vb.Add(label, proportion = 0, flag = wx.ALL, border = 5)
        
        self.tc_bereinigt = wx.TextCtrl(
            parent = panel, id = -1, style = wx.TE_MULTILINE | wx.TE_DONTWRAP
        )
        vb.Add(
            self.tc_bereinigt, proportion = 1, 
            flag = wx.ALL | wx.EXPAND , border = 5
        )
        hb.Add(vb, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
        
    
    def text_bereinigen(self, event):
        """
        Nimmt den Text von der linken Textbox und fügt den bereinigten
        Text in die rechte Textbox ein.
        """
        
        original_text = self.tc_original.GetValue()
        bereinigter_text = bereinigen(original_text)
        self.tc_bereinigt.SetValue(bereinigter_text)


if __name__ == "__main__":
    
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Center()
    frame.Show()
    app.MainLoop()
mfg
Gerold
:-)
Zuletzt geändert von gerold am Montag 12. Juni 2006, 20:32, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Montag 12. Juni 2006, 19:39

oh mann jetzt hast Du mich plattgemacht : :shock: :shock: :D

einfach geil dein Code - mann sieht wieviel erfahrung Du mit Python schon hast.
Ich muss mir mal wx doch noch näher anschauen. Scheint auf den ersten Augenblick ein bisschen schwer zu sein.

Aber erst lerne ich wohl besser Programmieren.

Ich danke Dir vielmals.

MfG
pyStyler
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Dienstag 13. Juni 2006, 22:11

Hallo,

wollte das auch mal nachreichen!

Code: Alles auswählen

#! /usr/bin/python
from Tkinter import *

class Main:
	def __init__ (self):
		self.fenster=Tk()
		self.fenster.title('replacer')
		self.fenster.geometry('900x400+50+120')
		self.frame=Frame(self.fenster)
		self.frame.pack()
		
		self.scrollbar=Scrollbar(self.frame)
		self.scrollbar.pack(side=RIGHT, fill=Y)
		
		self.label=Label(self.frame, text='textbereiniger', font=('Courier', 15, 'bold'))
		self.label.pack()
		
		self.b1=Button(self.frame, text='00000>>',
			width=7, height=1, relief=GROOVE, command=self.loesche_rechts)
		self.b1.pack(side=LEFT)
		
		self.t1=Text(self.frame, wrap=WORD, bg='white', 
			width=45, height=25, relief=GROOVE)
		self.t1.pack(side=LEFT, pady=5, padx=5, expand=YES)
		
		self.b2=Button(self.frame, text='>>>>', 
			width=7, height=1, relief=GROOVE, command=self.loesche_haus)
		self.b2.pack(side=LEFT)
		
		self.t2=Text(self.frame, wrap=WORD, bg='white',
			width=45, height=25, relief=GROOVE, yscrollcommand=self.scrollbar.set)
		self.scrollbar.config(command=self.t2.yview)
		
		self.t2.pack(side=LEFT, pady=5, padx=5, expand=YES)	
		self.b3=Button(self.frame, text='<<00000', 
			width=7, height=1, relief=GROOVE, command=self.loesche_links)
		self.b3.pack(side=RIGHT)
		self.fenster.mainloop()
		
	def loesche_haus(self):
		lese_text = self.t1.get('0.0', END)
		zeichen_loeschen = lese_text.split('>')
		for n in zeichen_loeschen:
			n_lstrip =n.lstrip()
			self.t2.insert(END, n_lstrip)
		return n
		
	def loesche_rechts(self):
		self.t1.delete('1.0', END)
		
	def loesche_links(self):
		self.t2.delete('1.0', END)
m=Main()
ich weiss, dass lstrip momentan nur die erste Zeile stript aber ich wollte
nichts mehr rummachen.
Antworten