Text Control Focus mit Tabulator Tase

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

Hallo,

vorab: Suchfunktion habe ich benutzt aber war nicht wirklich hilfreich.

Zu meinem Problem:
Ich erzeuge in einem Panel einige TextControls mit der folgenden Anweisungen:

Code: Alles auswählen

self._ctrlEingabe = {}
for i in range (1, 10):
    self._ctrlEingabe[i] = wx.TextCtrl(self, -1, '')
(Edit: Irgendwie klappt das nicht mit der Einrückung, die Anweisung ist natürlich innerhalb der for-Schleife)

Klappt auch soweit ganz gut, nur ich kann nicht mittels Tabulator Taste den Focus verändern. Auch die Anweisung "self._ctrlEingabe.AcceptsFocusFromKeyboard = True" ist nicht hilfreich.

Hat irgendjemand eine Idee was ich da falsch machen könnte?
Danke schon einmal,
Uwe
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Liegen die TextControls wirklich in einem Panel? Die Tabulator-Taste "funktioniert" nämlich nur in Dialogen oder Panels.
Übrigens: Zum Speichern der Ctrls wäre doch eine Liste einfacher als ein Dictionary. Zur Namensgebung von Variablen schau Dir einmal die PEP8 an.
MfG
HWK
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

HWK hat geschrieben:Liegen die TextControls wirklich in einem Panel? Die Tabulator-Taste "funktioniert" nämlich nur in Dialogen oder Panels.
OK, anbei die vollsändige __init__ Prozedur des Panels:

Code: Alles auswählen

class PanelEingabeSpieltag(wx.Panel):

    def __init__(self, parent, id=-1, spielplan=None, spieltag=0):
        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)

        self._lblSpieltag = wx.StaticText(self, -1, '')
        self._lblSpieltag.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))

        self.mainsizer = wx.BoxSizer(wx.VERTICAL)
        self.mainsizer.Add(self._lblSpieltag, 0, wx.ALIGN_CENTER_HORIZONTAL |
                wx.TOP, 10)
        self.mainsizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.TOP |
                wx.BOTTOM, 5)

        self._lblHeim = {}
        self._lblGast = {}
        self._ctrlToreHeim = {}
        self._ctrlToreGast = {}
        hbox = {}

        for i in range(1, 10):
            self._lblHeim[i] = wx.StaticText(self, -1, '', size=(120, -1))
            self._lblGast[i] = wx.StaticText(self, -1, '', size=(120, -1))
            self._ctrlToreHeim[i] = wx.TextCtrl(self, -1, '', size=(30, -1),
                    validator=NumberValidator())
            self._ctrlToreHeim[i].AcceptsFocus = True
            self._ctrlToreHeim[i].AcceptsFocusFromKeyboard = True
            self._ctrlToreGast[i] = wx.TextCtrl(self, -1, '', size=(30, -1),
                    validator=NumberValidator())
            self._ctrlToreGast[i].AcceptsFocus = True
            self._ctrlToreHeim[i].AcceptsFocusFromKeyboard = True
            self._ctrlToreHeim[i].Enable(False)
            self._ctrlToreGast[i].Enable(False)
            hbox[i] = wx.BoxSizer(wx.HORIZONTAL)
            hbox[i].Add(self._lblHeim[i], 0, wx.LEFT | wx.TOP, 3)
            hbox[i].Add(wx.StaticText(self, -1, '-'), 0, wx.TOP, 3)
            hbox[i].Add(self._lblGast[i], 0, wx.RIGHT | wx.LEFT | wx.TOP, 3)
            hbox[i].Add(self._ctrlToreHeim[i], 0, wx.LEFT, 5)
            hbox[i].Add(self._ctrlToreGast[i], 0, wx.RIGHT, 5)
            self.mainsizer.Add(hbox[i], 0, wx.TOP, 5)
        self.mainsizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.TOP, 5)
        self.ChangeView(spielplan, spieltag)
Anmerkung: Ich weiss das die Controls hier noch deaktiviert sind. Zuerst soll der Anwender ja den Spieltag auswählen, danach werden sie aktiviert. Obwohl sie in einem Panel liegen, klappt das nicht mit der Tabtaste :(
HWK hat geschrieben:Übrigens: Zum Speichern der Ctrls wäre doch eine Liste einfacher als ein Dictionary.
Nicht in diesem Fall, oder ich bin zu blöd ;) . Ich muss die Controls mehrfach durchlaufen z.B. wenn sie mit Werten gefüllt werden (in der init-Prozedur werden sie ja nur erzeugt). Und dann muss ich diese mit dem Spielplan vergleichen ob das Spiel schon stattgefunden hat. Falls ja, Ergebnis anzeigen, falls nein, controlls leeren. Da ist es IMHO einfacher wenn ich bei beiden (Spielplan/Controls) einen eindeutigen Zeiger hab.
HWK hat geschrieben:Zur Namensgebung von Variablen schau Dir einmal die PEP8 an.
Ja ne is klar :( Habe ich bereits gemacht und eigentlich auch verinnerlicht. Aber dann habe ich wxPython benutzt und voll den Überblick über die Konventionen verloren ...

Für sinnvolle Vorschläge bezüglich der vermischten Namenskonvention wäre ich sehr dankbar ;)

(Edit: Ich habe gerade selber gesehen das die Übergabe der id ans Panel irgendwie sinnlos ist, also bitte nicht mehr kritisieren *g*)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich hab den Code angepasst, damit er ohne den Programmrest bei mir läuft. Dann funktioniert auch die Tab-Taste:

Code: Alles auswählen

import wx

class MyPanel(wx.Panel):

    def __init__(self, parent, spielplan=None, spieltag=0):
        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)

        self._lblSpieltag = wx.StaticText(self, -1, '')
        self._lblSpieltag.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))

        self.mainsizer = wx.BoxSizer(wx.VERTICAL)
        self.mainsizer.Add(self._lblSpieltag, 0, wx.ALIGN_CENTER_HORIZONTAL |
                wx.TOP, 10)
        self.mainsizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.TOP |
                wx.BOTTOM, 5)

        self._lblHeim = {}
        self._lblGast = {}
        self._ctrlToreHeim = {}
        self._ctrlToreGast = {}
        hbox = {}

        for i in range(1, 10):
            self._lblHeim[i] = wx.StaticText(self, -1, '', size=(120, -1))
            self._lblGast[i] = wx.StaticText(self, -1, '', size=(120, -1))
            self._ctrlToreHeim[i] = wx.TextCtrl(self, -1, '', size=(30, -1))
            #self._ctrlToreHeim[i].AcceptsFocus = True
            #self._ctrlToreHeim[i].AcceptsFocusFromKeyboard = True
            self._ctrlToreGast[i] = wx.TextCtrl(self, -1, '', size=(30, -1))
            #self._ctrlToreGast[i].AcceptsFocus = True
            #self._ctrlToreHeim[i].AcceptsFocusFromKeyboard = True
            #self._ctrlToreHeim[i].Enable(False)
            #self._ctrlToreGast[i].Enable(False)
            hbox[i] = wx.BoxSizer(wx.HORIZONTAL)
            hbox[i].Add(self._lblHeim[i], 0, wx.LEFT | wx.TOP, 3)
            hbox[i].Add(wx.StaticText(self, -1, '-'), 0, wx.TOP, 3)
            hbox[i].Add(self._lblGast[i], 0, wx.RIGHT | wx.LEFT | wx.TOP, 3)
            hbox[i].Add(self._ctrlToreHeim[i], 0, wx.LEFT, 5)
            hbox[i].Add(self._ctrlToreGast[i], 0, wx.RIGHT, 5)
            self.mainsizer.Add(hbox[i], 0, wx.TOP, 5)
        self.mainsizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.TOP, 5)
        self.SetSizer(self.mainsizer)
        self.mainsizer.Fit(self)
        #self.ChangeView(spielplan, spieltag)

def main():
    app = wx.PySimpleApp(True)
    frame = wx.Frame(None, -1, 'Titel', size=(500, 500))
    panel = MyPanel(frame)
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()
Wenn Du nichts aus den Dicts löschst, kannst du auch eine Liste verwenden und über i-1 auf die Einträge zugreifen.
hbox wird außerhalb der Schleife nicht verwendet. Es bräuchte deshalb kein Dict sein. Einfacher stattdessen: hbox = ... und hbox.add(...)
MfG
HWK
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

*grummel*

Auch mit deiner angepassten Version klappt das bei mir nicht.
Liegt aber nicht an der Installation, auf meinem Notebook klappt es auch nicht. Wahrscheinlich liegt es an mir :(

"Lustigerweise" klappt es mit dem "realworld" Beispiel aus dem Buch wxPython in Action. :?:
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Das ist meine Umgebung:
=======================
sys.version: 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)]
sys.platform: win32
sys.winver: 2.4
wx.VERSION_STRING: 2.8.6.0
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

Das ist meine
===================================
sys.version: 2.5.1 (r251:54863, May 2 2007, 16:56:35) [GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)]
sys.platform: linux2
wx.VERSION_STRING: 2.6.3.2
===================================

Komisch, wx Version 2.8 habe ich auch auf dem Rechner. Jetzt muss ich mal suchen welchen Link ich da nun wieder umbiegen muss. Aber nicht mehr heute. Ich war heute Strohwitwer und habe schätzungsweise 12 Stunden mit Python verbracht. Ich seh nur noch flimmernde Buchstaben ...
(das gibt Haue wenn mein Weib widerkommt und ich hab nichts geschafft *g*)

Danke ersteinmal, das könnte ein Ansatz sein.
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

Das mit der wx.Version war ein sehr guter Tipp. Kaum hab ich die 2.6er deinstallieren lassen, schon klappt das mit der Tab-Taste, und auch mein ListCtrl-BackgroundColour Problem ist gelöst.

Danke noch einmal für deine Unterstützung ;)

BTW: Ich würde die beiden Threads gerne als gelöst markieren, weiss aber nicht wie.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Editier den Titel Deines ersten Beitrags entsprechend.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Pumeluk2 hat geschrieben:BTW: Ich würde die beiden Threads gerne als gelöst markieren, weiss aber nicht wie.
Lass es einfach. Das macht zusätzliche Arbeit und hilft nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten