Seite 1 von 1

PushStatusText() funktioniert nicht

Verfasst: Montag 5. Februar 2007, 21:50
von Alexci
Hallo,

Ich habe ein kleines Problem. PushStatusText() funktioniert nicht wenn man es aus einer anderen klasse ausfuehrt.

Hier erst mal der code:

Code: Alles auswählen

import wx 
import os
import sys


class PreferencesWindow(wx.Frame):
       def __init__(self):
           wx.Frame.__init__(self, None, title="Preferences", size = wx.Size(500, 380))

           # Here we create a panel and a notebook on the panel
           p = wx.Panel(self)
           sizer = wx.BoxSizer()
           p.SetSizer(sizer)

           p.Button4P = wx.Button(p, label='OK', name='Button4', pos=wx.Point(340, 310), size=wx.Size(60, 20), style=0)
           p.Button5P = wx.Button(p, label='Cancel', name='Button5', pos=wx.Point(400, 310), size=wx.Size(60, 20), style=0)
           p.Button4P.Bind(wx.EVT_BUTTON, self.OnOKP)
           p.Button5P.Bind(wx.EVT_BUTTON, self.OnExitP)
           

       def OnExitP(self, event):
            self.Close()
            
       def OnOKP(self, event):  
            self.ref = MyFrame(self)
            self.ref.FNameRefresh(self)
            
                
class MyFrame(wx.Frame):
    def __init__(self, parent = None, id = -1, title = 'A', size = wx.Size(1024, 750)):
        # Frame initialisieren
        wx.Frame.__init__(self, parent, id, title = 'A', size = size)

        self.Maximize()


        #Menue-Leiste oben
        menubar = wx.MenuBar() 
        menu_file = wx.Menu() 

        file_preferences = wx.MenuItem(menu_file, 102, '&Preferences', 'Preferences')
        file_quit = wx.MenuItem(menu_file, 105, '&Quit\tCtrl+Q', 'Quit the Application') 
        menu_file.AppendItem(file_preferences)
        menu_file.AppendSeparator()
        menu_file.AppendItem(file_quit)
        menubar.Append(menu_file, '&File') 
        self.SetMenuBar(menubar)
        
        self.statusbar=self.CreateStatusBar()
        self.statusbar.SetFieldsCount(3)
        self.statusbar.SetStatusWidths([-20, -30,-30])

        
        #self.FNameRefresh(self)
      
        self.Bind(wx.EVT_MENU, self.OnPreferencesWindow, file_preferences)

    def FNameRefresh(self, event):
        self.statusbar.PushStatusText('Text',2)
        print 'def FNameRefresh'

    def OnPreferencesWindow(self, event):
        win = PreferencesWindow()
        win.Show(True)        


def main(): 
    app = wx.PySimpleApp() 
    myframe = MyFrame()
    myframe.Show() 
    app.MainLoop()
    
if __name__ == "__main__": 
    main()
      


Wenn ihr das programm startet klickt auf File--> Preferences. Wenn man auf OK im Preferences klickt muesste auf der MyFrame Statusbar "Text" angezeigt werden, aber es geschied nichts. Es kommt auch keine errormeldung vor, aber die def wird ausgefuehrt - in der schell wird print 'def FNameRefresh' angezeigt...

Wenn man die Zeile #self.FNameRefresh(self) im MyFrame nicht auskommentiert wird auf der Statusbar der Text sofort angezeigt - das heisst dass das def eigentlich funktioniert, aber nicht wenn man es aus einer anderen Class ausfuehrt.
Ich glauebe das problem liegt irgendwo hier:
self.ref = MyFrame(self)
self.ref.FNameRefresh(self)


Bitte um Hilfe! Danke!


Mit freundlichen Gruessen,
Aleksandar

Verfasst: Montag 5. Februar 2007, 22:23
von sape
Warum erzeugst du in Zeile 25 eine neue Instanz von MyFrame?

Ablauf:
``MAinFrame`` wird erzeugt in ``def main()``. Wenn du nun den Eintrag im Menü anklickst, das an die Methode ``self.OnPreferencesWindow`` gebunden ist, wird die Methode ``OnPreferencesWindow```gestartet die eine Instanz von ``PreferencesWindow`` erzuegt, das eine Spezialisierung von ``wx.Frame`` ist. Es wird also ein neuer Frame aufgebaut. Wenn du in dem neuen Frame den OK-Button drückst (``p.Button4P``) der an die Methode ``def OnOKP`` gebunden ist, wird diese Ausgeführt. Die Methode erzuegt ein neue Instanz von ``MyFrame`` (Es müsste ein drittes Fenster erscheinen, was aber nicht passiert da keine Methode ``.Show(True)`` aufgeruffen wird.).

Nach dem ganzen unverständlichen Text von mir mal was verständliches.

Du müsstest eigentlich eine Referenz von ``myframe`` das in der Funktion ``def main():`` ist übergeben an ``win = PreferencesWindow() ``. ein ``self`` als parent solte genügen.

Code: Alles auswählen

def __init__(self, parent): 
    wx.Frame.__init__(self, None, title="Preferences", size = wx.Size(500, 380)) 
    self.parent = parent
[...]
    def OnOKP(self, event): 
         self.parent.FNameRefresh(self) 
Schließlich willst du nicht eine neue Instanz erzeugen und auf die zurückgreifen, sondern auf eine bestehenden zurückgreifen.

BTW: Ungetestet, da ich gerade keine Zeit habe.

lg

EDIT: Wenn man auf den File->Pref. mehrmals drückt, werden mehrere Frames aufgebaut. Das ist sicherlich nicht so gedacht.

Verfasst: Montag 5. Februar 2007, 22:28
von sape
Jupp, geht so wie ich das meine.

Hier der Code:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx
import os
import sys


class PreferencesWindow(wx.Frame):
       def __init__(self, parent):
           wx.Frame.__init__(self, None, title="Preferences", size = wx.Size(500, 380))
           self.parent = parent
           
           # Here we create a panel and a notebook on the panel
           p = wx.Panel(self)
           sizer = wx.BoxSizer()
           p.SetSizer(sizer)

           p.Button4P = wx.Button(p, label='OK', name='Button4', pos=wx.Point(340, 310), size=wx.Size(60, 20), style=0)
           p.Button5P = wx.Button(p, label='Cancel', name='Button5', pos=wx.Point(400, 310), size=wx.Size(60, 20), style=0)
           p.Button4P.Bind(wx.EVT_BUTTON, self.OnOKP)
           p.Button5P.Bind(wx.EVT_BUTTON, self.OnExitP)
           

       def OnExitP(self, event):
            self.Close()
           
       def OnOKP(self, event): 
            self.ref = MyFrame(self)
            self.parent.FNameRefresh(self)
           
               
class MyFrame(wx.Frame):
    def __init__(self, parent = None, id = -1, title = 'A', size = wx.Size(1024, 750)):
        # Frame initialisieren
        wx.Frame.__init__(self, parent, id, title = 'A', size = size)

        #self.Maximize()


        #Menue-Leiste oben
        menubar = wx.MenuBar()
        menu_file = wx.Menu()

        file_preferences = wx.MenuItem(menu_file, 102, '&Preferences', 'Preferences')
        file_quit = wx.MenuItem(menu_file, 105, '&Quit\tCtrl+Q', 'Quit the Application')
        menu_file.AppendItem(file_preferences)
        menu_file.AppendSeparator()
        menu_file.AppendItem(file_quit)
        menubar.Append(menu_file, '&File')
        self.SetMenuBar(menubar)
       
        self.statusbar=self.CreateStatusBar()
        self.statusbar.SetFieldsCount(3)
        self.statusbar.SetStatusWidths([-20, -30,-30])
     
        self.Bind(wx.EVT_MENU, self.OnPreferencesWindow, file_preferences)

    def FNameRefresh(self, event):
        self.statusbar.PushStatusText('Text',2)
        print 'def FNameRefresh'

    def OnPreferencesWindow(self, event):
        win = PreferencesWindow(self)
        win.Show(True)       


def main():
    app = wx.PySimpleApp()
    myframe = MyFrame()
    myframe.Show()
    app.MainLoop()
   
if __name__ == "__main__":
    main() 
lg

P.S: Um das Problem das mehrmals das Pref. Fenster gestartet werden kann, muss du dich unbedingt kümmern.

Verfasst: Dienstag 6. Februar 2007, 00:09
von Alexci
Ja, funktioniert super! Danke nochmals!


Mit freundlichen Gruessen,
Aleksandar