neuer wx.Frame im Hintergrund

Plattformunabhängige GUIs mit wxWidgets.
Antworten
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Hallo,

ich stelle aus meinem Haptframe einen neuen Frame und lasse ihn mir Show() anzeigen. Soweit kein problem, bis auf das der neue Frame hinter dem Hauptframe liegt. Eigentlich sollte der neue Frame den Focus bekommen. Gibt es da eine Möglichkeit den neuen in den Focus (Vordergrund) zu befördern?

Der Programmablauf ist ungefähr so:

wx.App -> wx.Frame (Hauptframe) -> Show() -> wx.EVT_BUTTON -> wx.Frame -> Show()
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Ich habe mal jeweils das Event wx.EVT_ACTIVATE auf eine einfache Ausgabe Funktion gebunden die Namen und GetAktive() ausgibt. Hier das Ergebnis

Haupt True
Haupt False
Neu True
Neu False
Haupt True

Daraus schließe ich, dass der neue Frame erst im Vorgrund ist, aber anschließend sich der Hauptframe den Focus wiederholt. Warum macht der das xD

EDIT:
Der Focus geht erst nach dem Beenden der an wx.EVT_BUTTON Methode verloren.
BlackJack

Gibt es in dem neuen Frame denn irgendwelche Eingabemöglichkeiten die den Fokus dort erforderlich machen? Kannst Du vielleicht ein minimales, lauffähiges Beispiel zeigen, das dieses Verhalten zeigt?
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Mit dem minimalen Beispiel wird schwierig, da das Programm mittlerweile 10450 sloc hat. Der neun Frame hat besteht hauptsächlich aus einer wx.Notebook, der Hauptframe aus einem wx.SplitterWindow mit wx.TreeCtrl und wx.html.HtmlWindow zusätzlich ist noch ein wx.MiniFrame offen.

Merkwürdig ist auch, dass das Problem nur unter Windows auftritt, unter Linux ist der neue Frame im Vordergrund.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Du kannst den Fokus selber setzten

Code: Alles auswählen

self.SetFocus() # im neuen Frame
self.child_frame.SetFocus()
the more they change the more they stay the same
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Dav1d hat geschrieben:Du kannst den Fokus selber setzten

Code: Alles auswählen

self.SetFocus() # im neuen Frame
self.child_frame.SetFocus()
Klappt leider nicht

Code: Alles auswählen

 
   #....
    self._fc = True
    self._time = 0
    self.Bind(wx.EVT_ACTIVATE,self.OnActivate)
  def OnActivate(self,event):
    if self._fc and event.GetActive():
      self._time = time()
      print "aktivate"
    if self._fc and not event.GetActive() and time()-self._time < 1.5:
      self._fc = False
      self.SetFocus()
      print "reaktivate"
Antworten