[gelöst] Entry-Eingaben mit ENTER Taste steuern

Plattformunabhängige GUIs mit wxWidgets.
Antworten
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Mittwoch 19. November 2008, 15:40

Hi,


ich möchte die gesamte Bedienung mit "ENTER" durchführen, d.h. erste Eingabe:X1 -> ENTER -> jetzt ist X2 aktiv -> ENTER -> ...-> Enter -> Berechnen-Button ist aktiv -> ENTER -> Ausgabe-Button ist aktiv.

Wie kann ich das machen?


CODE AUSGELAGERT: http://paste.pocoo.org/show/91861/


Edit by Gerold: Code ausgelagert
Zuletzt geändert von mathi am Donnerstag 20. November 2008, 09:27, insgesamt 1-mal geändert.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Donnerstag 20. November 2008, 07:51

Ich habe es mit

Code: Alles auswählen

 style = wx.TE_PROCESS_ENTER
zumindest geschafft, dass ich mit TAB alle Textctrl's in einem Panel nacheinander ansprechen kann, ohne dass das Panel gewechselt wird.

Das ist aber nicht zufriedenstellend. Gibt es denn keine Möglichkeit mit ENTER innerhalb des Panels zu bleiben und die Textctrl's zu durchlaufen???

Mit SetDefaultItem und GetDefaultItem scheint mir sehr aufwändig für mein "triviales" Problem, wenn es denn überhaupt richtig ist.

Eine Antwort wäre mir wirklich wichtig.

Gruß Mathi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Donnerstag 20. November 2008, 08:20

mathi hat geschrieben:Gibt es denn keine Möglichkeit mit ENTER innerhalb des Panels zu bleiben und die Textctrl's zu durchlaufen?
Hallo Mathi!

Ja, die gibt es.

Code: Alles auswählen

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

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class MyPanel(wx.Panel):
    
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour("yellow")
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox)
        
        txt1 = wx.TextCtrl(self, size = (100, -1))
        self.txt1 = txt1
        vbox.Add(txt1, 0, wx.EXPAND | wx.ALL, 5)
        
        txt2 = wx.TextCtrl(self, size = (100, -1))
        vbox.Add(txt2, 0, wx.EXPAND | wx.ALL, 5)
        
        txt3 = wx.TextCtrl(self, size = (100, -1), style = wx.TE_PROCESS_ENTER)
        vbox.Add(txt3, 0, wx.EXPAND | wx.ALL, 5)
        txt3.Bind(wx.EVT_CHAR, self.on_txt3_char)
    
    
    def on_txt3_char(self, event):
        if event.GetKeyCode() == wx.WXK_RETURN:
            self.txt1.SetFocus()
            self.txt1.SelectAll()
        event.Skip()


class MyFrame(wx.Frame):
    
    def __init__(self, parent = None, title = "Example"):
        wx.Frame.__init__(self, parent, -1, title)
        
        base_panel = wx.Panel(self)
        
        hbox_main = wx.BoxSizer(wx.HORIZONTAL)
        base_panel.SetSizer(hbox_main)
        
        self.left_panel = MyPanel(base_panel)
        hbox_main.Add(self.left_panel, 1, wx.EXPAND | wx.ALL, 3)
        
        self.right_panel = MyPanel(base_panel)
        hbox_main.Add(self.right_panel, 1, wx.EXPAND | wx.ALL, 3)
        
        # Layout
        base_panel.Fit()
        self.Fit()
        self.SetMinSize(self.GetSize())
    
    
def main():
    """Testing"""
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Donnerstag 20. November 2008, 08:32

Hallo Gerold,

Du hilfst mir irgendwie immer aus der Klemme :-),

aber bei Deinem Beispiel kannst Du mit ENTER im aktuellen Panel alle Textctrl's nacheinander ansprechen und mußt nur den Letzten an die Methode on_txt3_char binden. Mein Problem ist aber, dass in meinem Programm nach Eingabe von X1 -> Enter -> der Focus auf das nächste Panel wechselt (Button Berechnung), das sollte doch aber erst nach Eingabe aller TxtCtrl's im Eingabepanel paasieren.
Ich hoffe Du verstehst.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Donnerstag 20. November 2008, 09:04

mathi hat geschrieben:Mein Problem ist aber, dass in meinem Programm nach Eingabe von X1 -> Enter -> der Focus auf das nächste Panel wechselt
Hallo mathi!

Ich hatte mir dein Beispiel gar nicht angesehen, weil es zu groß ist um nur mal kurz darüberzulesen.

Dein Problem ist, dass du den Standard-Style des Panels überschreibst. Der Standardstyle ist ``wx.TAB_TRAVERSAL``!!!

So funktioniert es:

Code: Alles auswählen

wx.Panel.__init__(self, parent, style = wx.TAB_TRAVERSAL | wx.BORDER_RAISED)

mfg
Gerold
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Donnerstag 20. November 2008, 09:27

mensch Gerold, ich bin begeistert, VIELEN Dank für Deine schnelle und ergiebige Hilfe :-)

Gruß mathi
Antworten