Jeden zweiten Buchstaben in ein Entry einfügen

Fragen zu Tkinter.
Antworten
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

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?
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Unter Python-2.3 ist es ganz einfach:

wort2 = wort1[::2]

Gruß
Jörg
"Sie sind nicht berechtigt, unrechtmäßige Kopien dieses Datenträgers zu erstellen." - Microsoft-Weisheit auf einer CD von MS-VisualC++-6.0
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

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:
Zuletzt geändert von Pythino am Sonntag 25. April 2004, 19:02, insgesamt 1-mal geändert.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

Hallo wuf,
das löst mein Problem leider gar nicht, oder ich weiß nicht damit umzugehen... :?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Pythino,

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


Gruß

Dookie
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

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)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

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... :?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

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?
Antworten