Problem - Mit Tab zum nächstem Control wechseln

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Gast

Hallo,

ich versuche gerade ein erstes kleines Hilfsprogramm in Python zu schreiben, bisher habe ich hauptsächlich mit VB 6 gearbeitet. Dank dieses klasse Forums bin ich auch schon um einiges schlauer. Danke für die vielen hilfreichen Threads hier. :)

Allerdings habe ich zu meinem aktuellem Problem nichts gefunden, deshalb wag ich es mal Euch das Problem zu schildern in der Hoffnung, dass mir jemand helfen kann.

Ich habe in einem SashWindow Layout 3 Frames Top, Left und Right. Im Top Frame habe ich einige Textfelder und Buttons angelegt. Nun möchte ich dem Anwender die Möglichkeit geben mittels der Tab-Taste von einem Textfeld oder Button zum nächsten zu springen. Leider funktioniert dies nicht. Ich habe versucht die Tab Taste über Events abzufangen, aber das scheint nicht hinzuhauen. Mit Return ist es kein Problem, aber sobald die Tabulator Taste gedrückt wird verschwindet der Focus im Nirvana und läßt sich auch mit Shift-Tab nicht zurück holen, so muß ich dann jedesmal die Maus bemühen und in ein Feld klicken. Hätte hier jemand einen Tip für mich wie ich dieses Problem lösen kann? Würde mich wirklich freuen.

Gruß und schönes Wochenende,
Montecore...
Francesco

Anonymous hat geschrieben:
Ich habe in einem SashWindow Layout 3 Frames Top, Left und Right. Im Top Frame habe ich einige Textfelder und Buttons angelegt. Nun möchte ich dem Anwender die Möglichkeit geben mittels der Tab-Taste von einem Textfeld oder Button zum nächsten zu springen. Leider funktioniert dies nicht. Ich habe versucht die Tab Taste über Events abzufangen, aber das scheint nicht hinzuhauen. Mit Return ist es kein Problem, aber sobald die Tabulator Taste gedrückt wird verschwindet der Focus im Nirvana und läßt sich auch mit Shift-Tab nicht zurück holen, so muß ich dann jedesmal die Maus bemühen und in ein Feld klicken. Hätte hier jemand einen Tip für mich wie ich dieses Problem lösen kann? Würde mich wirklich freuen.


Montecore...
Hallo Montecore,

meinst Du, mit der Tab taste zwischen den Frames (den Sash Windows)
zu springen, oder in einem Frame von einem control zum anderen?

Könntes Du eventuell ein gekürztes Sample hereinstellen?

mfg,
Gast

Ich habe von Demo das SashWindow modifizier, und dabei gesehen,
dass wenn man im ersten Sash Window tab drückt, tatsächlich der Focus
nicht weiterbewegt wird. Meinst Du das?

Code: Alles auswählen



import  wx

#---------------------------------------------------------------------------

class TestSashWindow(wx.Panel):
    ID_WINDOW_TOP    = 5100
    ID_WINDOW_LEFT1  = 5101
    ID_WINDOW_LEFT2  = 5102
    ID_WINDOW_BOTTOM = 5103


    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)


        # will occupy the space not used by the Layout Algorithm
        self.remainingSpace = wx.Panel(self, -1, style=wx.SUNKEN_BORDER)


        self.Bind(wx.EVT_SIZE, self.OnSize)


        # Create some layout windows
        # A window like a toolbar
        win = wx.SashLayoutWindow(
            self, self.ID_WINDOW_TOP, wx.DefaultPosition, (200, 30), 
            wx.NO_BORDER|wx.SW_3D
            )

        win.SetDefaultSize((1000, 30))
        win.SetOrientation(wx.LAYOUT_HORIZONTAL)
        win.SetAlignment(wx.LAYOUT_TOP)
        win.SetBackgroundColour(wx.Colour(255, 0, 0))
        win.SetSashVisible(wx.SASH_BOTTOM, True)

        self.topWindow = win


        # A window like a statusbar
        win = wx.SashLayoutWindow(
                self, self.ID_WINDOW_BOTTOM, wx.DefaultPosition, (200, 30), 
                wx.NO_BORDER|wx.SW_3D
                )

        win.SetDefaultSize((1000, 30))
        win.SetOrientation(wx.LAYOUT_HORIZONTAL)
        win.SetAlignment(wx.LAYOUT_BOTTOM)
        win.SetBackgroundColour(wx.Colour(0, 0, 255))
        win.SetSashVisible(wx.SASH_TOP, True)

        self.bottomWindow = win

        # A window to the left of the client window
        win =  wx.SashLayoutWindow(
                self, self.ID_WINDOW_LEFT1, wx.DefaultPosition, (200, 30), 
                wx.NO_BORDER|wx.SW_3D
                )

        win.SetDefaultSize((120, 1000))
        win.SetOrientation(wx.LAYOUT_VERTICAL)
        win.SetAlignment(wx.LAYOUT_LEFT)
        win.SetBackgroundColour(wx.Colour(0, 255, 0))
        win.SetSashVisible(wx.SASH_RIGHT, True)
        win.SetExtraBorderSize(10)
        textWindow = wx.TextCtrl(
                        win, -1, "", wx.DefaultPosition, wx.DefaultSize, 
                        wx.TE_MULTILINE|wx.SUNKEN_BORDER
                        )
        textWindow2 = wx.TextCtrl(
                        win, -1, "", (0, 200), wx.DefaultSize, 
                        wx.TE_MULTILINE|wx.SUNKEN_BORDER
                        )

        btn = wx.Button(
                        win, -1, "test", (0, 350), wx.DefaultSize, 
                        wx.TE_MULTILINE|wx.SUNKEN_BORDER
                        )

        textWindow.SetValue("A sub window")

        self.leftWindow1 = win


        # Another window to the left of the client window
        win = wx.SashLayoutWindow(
                self, self.ID_WINDOW_LEFT2, wx.DefaultPosition, (200, 30), 
                wx.NO_BORDER|wx.SW_3D
                )

        win.SetDefaultSize((120, 1000))
        win.SetOrientation(wx.LAYOUT_VERTICAL)
        win.SetAlignment(wx.LAYOUT_LEFT)
        win.SetBackgroundColour(wx.Colour(0, 255, 255))
        win.SetSashVisible(wx.SASH_RIGHT, True)

        self.leftWindow2 = win



    def OnSize(self, event):
        wx.LayoutAlgorithm().LayoutWindow(self, self.remainingSpace)

#---------------------------------------------------------------------------

def runTest(nb):
    win = TestSashWindow(nb)
    return win

class MyFrame(wx.Frame):
	def __init__(self, parent, id, title):
		wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.DefaultSize, wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)
		runTest (self)
		
class DrApp(wx.App):

	def OnInit(self):
		
		frame = MyFrame(None, 101, "MyFrame")	
		frame.Show(True)
		self.SetTopWindow(frame)
		return True
	
	
if __name__ == '__main__':
	app = DrApp(0)
	app.MainLoop()


Montecore
User
Beiträge: 5
Registriert: Freitag 19. November 2004, 13:09

Francesco hat geschrieben: meinst Du, mit der Tab taste zwischen den Frames (den Sash Windows)
zu springen, oder in einem Frame von einem control zum anderen?
Könntes Du eventuell ein gekürztes Sample hereinstellen?
mfg,
Hallo Francesco,
erstmal danke fürs antworten. :)
Sorry das ich mich so unverständlich ausgedrückt habe. Ich möchte nicht von einem Frame zum anderem springen, sondern von einem TextControl zum nächsten. z.B. vom Eingabefeld für den Vornamen zum Eingabefeld für den Nachnamen und nach dem letztem Eingafeld möchte ich, dass der Focus auf den OK Button bewegt wird und bei einem weiterem Druck auf Tab soll es zum Cancel Button weitergehen. Hoffe, dass mein Vorhaben nun ein wenig verständlicher geworden ist, wenn nicht bitte nochmal bescheid sagen.

Ich wundere mich das diese Funktion in Python nicht Standart ist, denn in Windows ist der Felderwechsel mittels Tab doch eigentlich immer möglich? Kann es sein, dass man vielleicht die Aktivierungsreihenfolge so wie unter VB irgendwo festlegen muß?

Gruß,
Montecore (diesesmal hoffentlich eingeloggt ;) )
Francesco

Hallo Francesco,
erstmal danke fürs antworten. :)
Sorry das ich mich so unverständlich ausgedrückt habe. Ich möchte nicht von einem Frame zum anderem springen, sondern von einem TextControl zum nächsten. z.B. vom Eingabefeld für den Vornamen zum Eingabefeld für den Nachnamen und nach dem letztem Eingafeld möchte ich, dass der Focus auf den OK Button bewegt wird und bei einem weiterem Druck auf Tab soll es zum Cancel Button weitergehen. Hoffe, dass mein Vorhaben nun ein wenig verständlicher geworden ist, wenn nicht bitte nochmal bescheid sagen.

Ich wundere mich das diese Funktion in Python nicht Standart ist, denn in Windows ist der Felderwechsel mittels Tab doch eigentlich immer möglich? Kann es sein, dass man vielleicht die Aktivierungsreihenfolge so wie unter VB irgendwo festlegen muß?

Hallo Montecore

natürlich sollte es Standard sein, und es ist auch so, wie Du beschrieben
hast.
Nach der Reihenfolge, wie Du die Controls angelegt hast, nach der richtet
sich dann die "Tab Order".

Ich habe das Beispiel geändert (kein Sash Window und kein Button)
und mit tab kommt man da weiter,
Eigenartigerweise, wenn der Button mit dabei ist, kommt man nach dem
dritten mal tab, nicht mehr auf das erste Feld zurück.

Ich glaube, da könnte man in der wxPython-user mailing List
mal eine Frage reinstellen, oder weiss sonst wer Bescheid? :wink:

BTW: der "Gast" oben war auch ich, wieder vergessen, Benutzername anzugeben. :oops:

Code: Alles auswählen


import  wx

#---------------------------------------------------------------------------

class TestSashWindow(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)


        self.remainingSpace = wx.Panel(self, -1, style=wx.SUNKEN_BORDER)


        self.Bind(wx.EVT_SIZE, self.OnSize)

        textWindow = wx.TextCtrl(
                        self.remainingSpace, -1, "", wx.DefaultPosition, wx.DefaultSize,
                        wx.TE_MULTILINE|wx.SUNKEN_BORDER
                        )
        textWindow2 = wx.TextCtrl(
                        self.remainingSpace, -1, "", (0, 200), wx.DefaultSize,
                        wx.TE_MULTILINE|wx.SUNKEN_BORDER
                        )

#        btn = wx.Button(
#                        self.remainingSpace, -1, "test", (0, 350), wx.DefaultSize,
#                        wx.TE_MULTILINE|wx.SUNKEN_BORDER
#                        )

        textWindow.SetValue("A sub window")



    def OnSize(self, event):
        wx.LayoutAlgorithm().LayoutWindow(self, self.remainingSpace)

#---------------------------------------------------------------------------

def runTest(nb):
    win = TestSashWindow(nb)
    return win

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.DefaultSize, wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)
        runTest (self)
       
class DrApp(wx.App):

    def OnInit(self):
       
        frame = MyFrame(None, 101, "MyFrame")   
        frame.Show(True)
        self.SetTopWindow(frame)
        return True
   
   
if __name__ == '__main__':
    app = DrApp(0)
    app.MainLoop() 
Antworten