ShowModal() Frame

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Die wx.Frame Klasse hat ja kein ShowModal. Ich hätte aber trodzdem gerne Frames, welche in dem aktuellen Programm zu oberst sind. Die hinteren Frames sollten Deaktiviert sein (also nichs anklickbar).

Gibts da was?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:Die wx.Frame Klasse hat ja kein ShowModal. Ich hätte aber trodzdem gerne Frames, welche in dem aktuellen Programm zu oberst sind.
Hi DatenMetzgerX!

Erstelle statt einem wx.Frame einen wx.Dialog. Diesen kannst du dann statt mit Show() mit ShowModal() aufrufen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

dann geht CreateStatusBar() nicht mehr
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:dann geht CreateStatusBar() nicht mehr
Hi DatenMetzgerX!

Stimmt. Daran hatte ich nicht gedacht.

http://lists.wxwidgets.org/archive/wxPy ... 00147.html
http://wxwidgets.org/manuals/2.6.3/wx_w ... wmakemodal

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Genau das habe ich gesucht, Merci :)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Irgend wie gibt es da noch einen Fehler...

z.T stürzt das ganze dann einfach ab, im Anhang mal die Dateien.

http://famreiser.ch/python/image_resizer.zip

benötigt wird wxPython und PIL
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:http://famreiser.ch/python/image_resizer.zip
Hi DatenMetzgerX!

Ich habe mir den Code mal angesehen. Ich glaube ich weiß, warum das Programm abstürzt.

1. Du hast ja mehrere Frames. Wenn du vom Hauptframe aus den BrowseFolder-Frame aufrufst, dann machst du den BrowseFolder-Frame "modal". Zuerst einmal, würde ich den Frame nur dann modal machen, wenn ich vorher geprüft habe, ob ein Parent übergeben wurde.

Code: Alles auswählen

if parent:
    self.MakeModal(True)
2. Du lässt das Event "EVT_CLOSE" und den Button zum Schließen auf die selbe Methode zugreifen. Allerdings wird das Event EVT_CLOSE immer aufgerufen wenn du das Fenster schließt. Egal ob das durch deinen Close-Button oder durch einen Klick auf das X in der Titelleiste passiert.
Dadurch kommt das System ein wenig durcheinander. --> Die Methode wird zu oft aufgerufen.

Besser wäre es, wenn du das Event EVT_CLOSE abfängst und dort prüfst ob ein Parent übergeben wurde. Wenn ja, dann rufe

Code: Alles auswählen

self.MakeModal(False)
auf.

Den Schließen-Button würde ich auf eine **eigene** Methode zugreifen lassen.

Code: Alles auswählen

def __init__(self, parent, ...):
    self.parent = parent
    ...
    self.Bind(wx.EVT_CLOSE, self.on_close)
    self.cmdClose.Bind(wx.EVT_BUTTON, self.exit)
    ...
    self.Layout()
    if self.parent:
        self.MakeModal(True)
        self.CenterOnParent()
    else:
        self.Center()

def exit(self, event = None):
    """
    Event-Handler für den Button
    """
    self.Close()

def on_close(self, event):
    """
    Bei jedem EVT_CLOSE...
    """
    if self.parent:
        self.MakeModal(False)
    event.Skip()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Merci für die Tips....

Der Fehler lag gar nicht an dem makeModal :oops: , sondern an wx.BuyInfo. Die lassen sich irgend wie nicht zerschtören (Destroy())
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:sondern an wx.BuyInfo. Die lassen sich irgend wie nicht zerschtören (Destroy())
Hi DatenMetzgerX!

Die Aufrufe von wxBusyInfo() hatte ich vorher schon raus genommen. Trotzdem stürzte das Ding ab. Erst nach den anderen Änderungen funktioniert es bei mir wie gewünscht.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

DatenMetzgerX hat geschrieben:Merci für die Tips....

Der Fehler lag gar nicht an dem makeModal :oops: , sondern an wx.BuyInfo. Die lassen sich irgend wie nicht zerschtören (Destroy())
Hi, das kommt mir bekannt vor.
Ich glaube, du musst die Instanz von BusyInfo mit del zerstören und
nicht mit .Destroy()
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

So nun bin ich wiedermal bei einem ähnlichen Problem :roll:

Habe ein Hauptframe... aus dem rufe ich ein Subframe auf ( das MakeModal == True setzt). Nun will ich im Hauptframe auf die "Antwort" des Subframes warten. D.h. Wenn der User den Ok Button klickt ( wx.ID_OK) soll im Hauptframe dann xy abläufen sonst yx. Nur wenn ich if msg.Show() == wx.ID_OK:
mache wartet er nicht. Er zeigt das Frame an und geht gleich weiter ;(

Wie kann mann das relativ einfach umgehen....
Antworten