Cursor-Position bei einem Entry-Widget

Fragen zu Tkinter.
Benutzeravatar
wuf
User
Beiträge: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Samstag 27. September 2008, 09:04

Hallo kaytec

Danke für deinen komplett neuen Lösungsansatz. Werde deine Idee noch eingehender studieren. Das Eingabe-Feld muss ein Feld sein dessen Funktionalität dem eines Tk-Entry-Widget mit all seinen Steuerfunktionen wie TAB, DEL, END, HOME, ENTER usw. entspricht. Wie ich sehe benützt du ein Label-Widget. OK wie gesagt ich muss deine Variante noch genauer anschauen.

Es muss schlussendlich ein Eingabe-Widget werden in dem nur gewünschte Zeichen aufgenommen werden.
(Gut ich könnte das Entry-Widget von Pmw nehmen, aber ich möchte fur die GUI nur Tkinter importieren)

Besten Dank! Gruss wuf :wink:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Samstag 27. September 2008, 15:56

Hallo wuf,
dass die Enter-Taste löscht, habe ich eher
als Feature denn als Bug angesehen. :wink:

Hier nochmal eine Version *ohne* 'Enter' und 'Return':

http://paste.pocoo.org/show/86353/

Kaytec's Label-Lösung find' ich gut. :)
Daher hier eine kleine Erweiterung:

http://paste.pocoo.org/show/86354/

:wink:
yipyp
Benutzeravatar
wuf
User
Beiträge: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Montag 29. September 2008, 19:11

Hallo yipyip

Danke für deine Skripte. Bin leider zeitlich verhindert gewesen mich weiter mit dem Problem zu beschäftigen. Dein erstes Skript verhält sich was die ENTER betrifft für meinen Einsatz richtig. Aber wie schon angedeutet es ist noch nicht das Ende der Geschichte. Was ich mit meinem und deinem Skript festgestellt habe ist, wenn du etwas mit SHIFT plus Rechts-Taste markierst und mit einer Buchstaben-Taste löscht bleibt der Buchstabe im Eingabefeld zurück. Passiert aber nicht, wenn du mit SHIFT plus Links-Taste markierst.

Mit der Label-Variante muss ich mich noch näher beschäftigen.

Hier mein letzter Wurf:

[Code ausgelagert]

Gruss wuf :wink:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Montag 29. September 2008, 20:27

...mmmh...
... bei Shift+Rechts+Buchstabentaste erscheinen bei *Deinem* Programm
keine Buchstaben, dafür aber bei
Tab+Ende+Buchstabentaste...

Ich halte das Ganze sowieso nicht für eine
so gute Idee, dem Entry-Widget so ins Handwerk
zu pfuschen, ich würde an Deiner Stelle
vielleicht doch lieber einen prinzipiell
anderen Ansatz vorziehen.

Ist das bei Deiner Aufgabe nicht möglich?
(Im Moment fällt mir für das Entry-Widget
nix Sinnvolles mehr ein :( )

:K
yipyip
Benutzeravatar
wuf
User
Beiträge: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Montag 29. September 2008, 21:20

Hallo yipyip

Deine Feststellung hat sich auch bei mir bestätigt. Stimmt es ist aufwendig das Entry-Widget zu bändigen. Trotzdem forsche ich weiter und möchte ich dir hierbei nochmals danken für deine grosszügige Unterstützung.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Dienstag 30. September 2008, 15:35

Hallo yipyip

Hier meine Endlösung. Markierte Bereiche bzw. Zeichen können nur mit Zeichen gelöscht werden die das Filter zulässt mit Ausnahme der obligaten Steuerzeichen:

Code: Alles auswählen

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

# Verfasser : wuf
# Skriptname: entry_num_filter_05.py
# Datum     : 30.09.2008

# Funktion  : Eingabe mit Filter

import Tkinter as tk
from string import digits

ENTRY_FILTER = list(digits + ".")

class MyEntry(object, tk.Entry):

    def __init__(self, parent):

        self.parent = parent
        self.entry_value = tk.StringVar()

        tk.Entry.__init__(self, self.parent, width=20, bg='white', bd=1,
            validate='key', vcmd=self.validate_entry, highlightthickness=0,
            textvar=self.entry_value, exportselection=False)
        self.pack(side='top')

        self.bind('<Return>', self.entry_return)

    def entry_return(self, event=None):

        print "Entry-Value", self.entry_value.get()

    def validate_entry(self):

        index = self.index('insert')
        value = self.entry_value.get()
        arg = index, value

        self.after_idle(self.test, arg)

        return True

    def test(self, arg):

        self.flag = False
        val_index, val_value = arg

        index = self.index('insert')
        value = self.entry_value.get()

        for char in value:
            if char in ENTRY_FILTER:
                continue
            else:
                print 'Hallo', ord(char)
                self.flag = True
                self.entry_value.set(val_value)
                self.icursor(val_index)

        return

root = tk.Tk()
root.geometry('200x100')

my_entry = MyEntry(root)
my_entry.pack_configure(pady=10)

my_entry.focus_set()

root.mainloop()
Gruss wuf (the Voodoo-Programmer) :wink:
Take it easy Mates!
Antworten