Seite 1 von 1

Jeden zweiten Buchstaben in ein Entry einfügen

Verfasst: Freitag 23. April 2004, 13:20
von Pythino
Wie kann ich nur jeden zweiten Buchstaben in ein Entry einfügen?
wort = 'hallo'
wort2 = ???
eingabe.insert(END, wort2)

wort2 soll also jeden zweiten Buchstaben beinhalten, in diesem Fall h l o

Ist dies möglich?

Re: Jeden zweiten Buchstaben in ein Entry einfügen

Verfasst: Freitag 23. April 2004, 13:28
von joerg
Unter Python-2.3 ist es ganz einfach:

wort2 = wort1[::2]

Gruß
Jörg

Verfasst: Freitag 23. April 2004, 15:26
von Milan
Hi. das ist nicht nur unter Python 2.3 einfach. Eine einfache For-Schleife/map/List Comprehension hilft auch weiter:

Code: Alles auswählen

wort2=""
for i in xrange(0,len(wort1),2):
    wort2+=wort1[i]
#oder
wort2=("").join(map(lambda i:wort1[i],xrange(0,len(wort1),2))
#oder
wort2=("").join([wort1[i] for i in xrange(0,len(wort1),2)])
Milan

Verfasst: Freitag 23. April 2004, 19:14
von Pythino
Vielen Dank, es funktioniert natürlich.

Jetzt müsste ich nur noch wissen, wie ich zwischen jedem Buchstaben eine Leerstelle setze. Leider ist meine Lösung noch nicht einfach genug oder funktioniert auch nicht einwandfrei.
Also hallo müsste nicht: hlo, sondern h l o heißen.

Verfasst: Freitag 23. April 2004, 19:23
von Dookie
Hi Pythino,

Code: Alles auswählen

wort2 = " ".join(wort1[::2])
oder

Code: Alles auswählen

wort2 = " ".join(map(lambda i: wort1[i], xrange(0, len(wort1), 2))
Gruß

Dookie

Verfasst: Sonntag 25. April 2004, 12:52
von Pythino
Erstmal vielen Dank!
Es klappt alles soweit, allerdings ist eine kleine Sache merkwürdig:
Ich habe das besagte Entry, besser gesagt viele davon. Ich füge also per Event jeden zweiten Buchstaben ein. Wenn die Buchstaben eingefügt werden, bleibt der Cursor nicht im Entry, sondern wird ein normaler Mauszeiger. Daher kann ich nicht in das Entry schreiben, sondern muss erst wieder mit der Maus in das Fenster klicken.
Füge ich zusätzlich ein, dass der Cursor wieder in das Entry hüpfen soll, funktioniert das auch nicht.
Wahrscheinlich liegt's wieder einmal an meinem komischen PC... :wink:

Verfasst: Sonntag 25. April 2004, 16:57
von wuf
Hallo Pythino!

Hast du schon einmal mit den
allgemeinen Widget-Methoden:


deinwidget.grab_set()
deinwidget.grab_release()
deinwidget.grab_status()
deinwidget.grab_current()


herumexperimentiert?

Gruss wuf :wink:

Verfasst: Sonntag 25. April 2004, 19:03
von Pythino
Hallo wuf,
das löst mein Problem leider gar nicht, oder ich weiß nicht damit umzugehen... :?

Verfasst: Sonntag 25. April 2004, 19:08
von Dookie
Hi Pythino,

mit nem kleinen Stückchen Code könnte man Dir sicher besser helfen.


Gruß

Dookie

Verfasst: Sonntag 25. April 2004, 19:46
von wuf
Hi Pythino

Ich verstehe deine folgende Satzstellung nicht:

'Ich füge also per Event jeden zweiten Buchstaben ein'

Mit was für einem Event?
Oder mit einer Funktion?
Oder mit der Methode eingabe.insert(....)?
Oder von Hand?

Meine Interpretation deines Problems ist wie folgt:

Wenn du etwas in dein Entry-Widget eingibst, wechsel
der Cursor nicht vom Pfeil in einen senkrechte Balken
(d.h. das Entrywidget hat den Fokus) und verhart so
lange als Balken, bis du deine Eingabe mit Enter be-
stätigt hast. Wenn du mit dem Maus-Cursor das Entryfeld
während der Eingabe verlässt, kannst du nichts mehr
eingeben.

Vielleicht kanst du ein wenig Code von deiner Anwendung
präsentieren. Weil der Python-Source Code spricht Klartext.

Gruss wuf :wink:

Verfasst: Montag 26. April 2004, 13:10
von Pythino
Also hier einmal ein kleiner Ausschnitt, allerdings etwas verändert:

Code: Alles auswählen


def einfuegen(event):
    wort1 = wort2[anfang]
    wort2 = " ".join(wort1[::2])
    ent.insert(END, wort2)

lab = Label(root,font = ('arial %d', int(15*faktor)), bg = 'gold',text = wort[i])
lab.pack(fill = BOTH)
ent = Entry(root, bg = 'blue', font = 'arial 10')
ent.pack()

ent.bind('<Return>', einfuegen)

Mit dem Event ist das Binding gemeint.
Ich hoffe, dass ich nichts vergessen habe; ich habe manche Definitionen ausgelassen, da diese schon immer funktioniert haben (siehe faktor...)
Das Problem, das ich beschrieben habe, taucht erst nach dem Einfügen des wort2 auf!

Das Problem ist sehr kompliziert daher versuche ich es einmal sehr einfach zu beschreiben:
Ich füge also mit Return das wort2 (jeder zweite Buchstabe) in ent ein.
Soweit ist es klar. Wort2 wird ohne Probleme eingefügt.
Ich habe bevor ich wort2 mit Return eingefügt habe, den Balken im Entry gehabt (logisch, sonst würde das Bindung auch nicht gehen)
Der Mauscursor (Zeiger) befindet sich immernoch auf dem Entry, ist allerdings wie bei jedem Eingabefeld ein nicht-blinkender Balkencursor.
Doch das was jetzt passiert, wenn ich Return drücke verwundert mich und gefällt mir nicht ganz:
Der nicht-blinkende Balkencursor wird zum normalen Mauszeiger!
Der blinkende Cursor im Entry hört auf zu blinken!
Wenn ich weiterschreiben will, geht dies erst beim ZWEITEN drücken eines Knopfes, nicht wie normal beim ersten.
Drücke ich Return, so erscheint bei der oberen Taskleiste das Menü mit: Fenster minimieren, schließen, maximieren etc.!

Ich hoffe ich habe mich jetzt deutlicher ausgedrückt!

Jetzt ist mir leider noch ein zweites Problem aufgefallen:
wort1 = wort2[anfang]
wort2 = "-".join(wort1[::2])
ent.insert(END, wort2)

Derselbe Skript wie schon oben, nur mit einem - anstatt der Leerstelle.
Wenn der letzte Buchstabe nicht angezeigt werden muss, da dieser ausgelassen werden soll, wird auch kein - angezeigt.

Beispiel:
wort=hallo
wort2 =h-l-o (Das klappt, da der letzte Buchstabe angezeigt wird)
wort = text
wort2 = t-x (Hier seht ihr, dass das letzte t wird nicht mehr angezeigt)

Verfasst: Montag 26. April 2004, 20:05
von wuf
Hallo Pythino!
Danke für den feedback.

Ich möchte dein Problem austesten und habe
hierfür ein Skript, mittels einem Teil aus
deinem Skript, konstruiert.

Ich habe noch einige Probleme mit deinen
unbekannten Variablen:
anfang, word, word2

Ist die Variable word, welche dem Label
zugefügt wird, relevant für den Test??

Könntest du dieses Skript noch so ergänzen
damit man das Beispiel für 'hallo' austesten
kann.

Hier das Skript für den Test:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys
from Tkinter import *


def Beenden():
    sys.exit(0)

def einfuegen(event):
	wort1 = wort2[anfang]
	wort2 = " ".join(wort1[::2])
	ent.insert(END, wort2)

#~~ Erzeugt Hauptfenster
root = Tk()
root.configure(bd=2,relief='raised',bg='steelblue')
root.title('Eingabe-Pythino')

#~~ Zeichensatz für Label
font = ('Arial',10,'bold')

#~~ Konstanten
wort = 'hallo'

#~~ Labelfeld
lab = Label(root,
			bd     = 1,
			relief = 'raised',
			font   = font,
			bg     = 'gold',
			text   = wort,
			)

lab.pack(fill = BOTH,padx=10,pady=5)

#~~ Eingabefeld
ent = Entry(root,
			bd     = 1,
			bg     = 'white',
			font   = font,
			)

ent.pack(padx=10,pady=5)
ent.bind('<Return>', einfuegen)

# Schaltfläche für Beenden
bende = Button(root, text = "Ende", command = Beenden)
bende.pack(side= 'bottom',pady=5)

root.mainloop()
Gruss wuf :wink:

Verfasst: Dienstag 27. April 2004, 15:56
von Pythino

Code: Alles auswählen

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

import sys 
from Tkinter import * 


def Beenden(): 
    root.destroy()

def einfuegen(event): 
   wort2 = "_".join(wort[::2]) 
   ent.insert(END, wort2) 

#~~ Erzeugt Hauptfenster 
root = Tk() 
root.configure(bd=2,relief='raised',bg='steelblue') 
root.title('Eingabe-Pythino') 

#~~ Zeichensatz für Label 
font = ('Arial',10,'bold') 

#~~ Konstanten 
wort = 'hallo' 

#~~ Labelfeld 
lab = Label(root, 
         bd     = 1, 
         relief = 'raised', 
         font   = font, 
         bg     = 'gold', 
         text   = wort, 
         ) 

lab.pack(fill = BOTH,padx=10,pady=5) 

#~~ Eingabefeld 
ent = Entry(root, 
         bd     = 1, 
         bg     = 'white', 
         font   = font, 
         ) 

ent.pack(padx=10,pady=5) 
ent.bind('<Return>', einfuegen) 

# Schaltfläche für Beenden 
bende = Button(root, text = "Ende", command = Beenden) 
bende.pack(side= 'bottom',pady=5) 

root.mainloop() 
Ich habe es jetzt noch etwas verändert, so funktioniert es allerdings. Das Problem könnte darin liegen, dass ich von einer Textdatei die Wörter heraus definiere und einsetze: wort2[anfang] ist einfach ein Wort aus einer Textdatei, wort genauso.
Wenn es daran liegen sollte, müsste ich mein gesamtes Programm posten und das will ich eigentlich nicht :wink:

Falls es wirklich daran liegt und so sieht es aus, muss ich wohl damit leben.
Doch wichtiger wäre jetzt das zweite Problem, warum der letzte Buchstabe nicht mit - angezeigt wird :?

Danke für deine Hilfe.

Verfasst: Dienstag 27. April 2004, 18:31
von wuf
Hallo Pythino

Hier etwas zum ausprobieren.
Ich liebe es manchmal mit
Code etwas verschwenderisch
umzugehen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys
from Tkinter import *


def Beenden():
	root.destroy()

def einfuegen(event):
	spacer  = 2
	counter = 0
	liste = list(wort)
	for index, buchstabe in enumerate(liste):
		counter += 1
		if counter == spacer:
			liste[index] = '-'
			counter = 0
	wort2 = "".join(liste)
	ent.insert(END, wort2)

#~~ Erzeugt Hauptfenster
root = Tk()
root.configure(bd=2,relief='raised',bg='steelblue')
root.title('Eingabe-Pythino')

#~~ Zeichensatz für Label
font = ('Arial',10,'bold')

#~~ Konstanten
wort = 'text'

#~~ Labelfeld
lab = Label(root,
		bd     = 1,
		relief = 'raised',
		font   = font,
		bg     = 'gold',
		text   = wort,
		)

lab.pack(fill = BOTH,padx=10,pady=5)

#~~ Eingabefeld
ent = Entry(root,
		bd     = 1,
		bg     = 'white',
		font   = font,
		)

ent.pack(padx=10,pady=5)
ent.bind('<Return>', einfuegen)

# Schaltfläche für Beenden
bende = Button(root, text = "Ende", command = Beenden)
bende.pack(side= 'bottom',pady=5)

root.mainloop()
Gruss wuf :wink:

Verfasst: Dienstag 27. April 2004, 19:43
von Pythino
Wow, es funktioniert! Vielen Dank, wuf.

Woran könnte jetzt das Verschwinden des Balken liegen?
Wie gesagt, ich habe 5 Entrys, einen Zähler, der die Wörter in einer Textdatei der Reihe nach einliest.
Vielleicht fällt jemandem noch etwas ein... :?

Verfasst: Dienstag 27. April 2004, 22:34
von wuf
Hallo Pythino!

Meine Frage ist folgende:

Kann das Balken-Problem mit dem
letzten Test-Skript mit nur einem
Entry-Feld sichtbar gemacht werden?
Das heisst ist es möglich mit diesem
Skript das Fehlverhalten des Cursor
auszulösen oder muss das Skript mit
den zusätzlichen Entry-Feldern er-
gänzt werden?

Ich persönlich sehe das Fehlverhalten
mit diesem Skript noch nicht!

Ich kann dir nur helfen, wenn du das
Skript noch soweit ergänzen bzw. er-
weitern könntest, dass sich das Problem
simulieren lässt.

Gruss wuf :wink:

Verfasst: Donnerstag 29. April 2004, 20:08
von Pythino
Habe jetzt schon alles ausprobiert, weiß aber immernoch nicht, woran es legen soll. Jetzt hätte ich eine Idee, wie man das Problem einfach umgehen könnte:

Code: Alles auswählen


[...]

def bla(event):
       a = a + 1

root.bind('<Return>', bla)
Das ist ja ein normales Binding. Kann man den Spieß nicht einfach umdrehen und beim Ausführen der Funktion (bla) Return drücken lassen?

Das heißt für eine Funktion, wenn sie ausgeführt wird, wird eine bestimmte Taste gedrückt.
Z.B. Tab drücken, wenn eine Funktion ausgeführt wird?