Frame aus MainWindow heraus öffnen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Wie bekomme ich das Frame geöffnet!?

Code: Alles auswählen

def receive(self, message):
        while message != "":
            wx.CallAfter(self.text_output.SetValue, message.decode('utf8'))
            wx.MessageBox(message.decode('utf8'), '-----Neue Nachricht!-----')
            
            #NewWindow öffnen !!!!!!!!!
          
            break

class NewWindow(wx.Frame):

    def __init__(self,parent, id):
        wx.Frame.__init__(self, parent, id, 'New Window', size=(400,300))
        wx.Frame.CenterOnScreen(self)
        #self.new.Show(False)
BlackJack

@Muck22: Hm, Du hast da ein `CallAfter()` aber auch direkt ein erstellen eines `wx.MessageBox()`, das sieht verdächtig gefährlich aus. Das `CallAfter()` deutet auf einen anderen Thread hin. Da darfst Du weder eine MessageBox erstellen noch ein anderes Fenster öffnen. GUI-Kram muss immer im Hauptthread passieren wo die GUI-Hauptschleife läuft. In anderen Threads darf man im Grunde nur drei `wx`-Funktionen aufrufen: `CallAfter()`, `CallLater()`, und `PostEvent()`. Alles andere ist nicht thread-sicher.
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Ups, das ist übel da muss ich mir was anderes einfallen lassen!
Zu dumm, ich wollte auf die message reagieren und bei eingehender Nachricht ein Fenster öffnen! :(
BlackJack

@Muck22: Na dann schreib eine Funktion die das tut und lass die mit `CallAfter()` aufrufen.
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Code: Alles auswählen

def OpenWin(self):
        f1 = wx.Frame(None, title = "-----Neue Nachricht!-----")
        f1.Centre()
        #f1.Iconize(False)
        f1.Show()   
 
 def receive(self, message):
        wx.CallAfter(self.text_output.SetValue, message.decode('utf8'))
        while message != "":
            #wx.MessageBox(message.decode('utf8'), '-----Neue Nachricht!-----')
            wx.CallAfter(self.OpenWin)
            break
Nun hab ich das Problem, das sich das Fenster öffnet, sich aber wie das Hauptfenster (was es auch soll) sich minimiert (Iconize()) das soll es aber nicht! :|
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Und die message will auch nicht in das TextCtrl! Wer kann mir ein gutes Buch auf deutsch empfehlen (wxPython)???????

Code: Alles auswählen

 def OpenWin(f1):
        f1 = wx.Frame(None, title = "-----Neue Nachricht!-----", size=(500, 80))
        f1.SetBackgroundColour((112, 112, 112))
        f1.Centre()
        f1.Show()
        
        text_output = wx.TextCtrl(f1, wx.ID_ANY, size=(180, 20), pos=(5, 5))
        text_output.SetValue(message.decode('utf8'))
        #f1.Iconize(False)
      
    def EvtComboBox(self, evt):
        global data
        cb = evt.GetEventObject()  
        data = cb.GetValue()
           
       
    def send(self, _event):
        message = self.text_input.GetValue()
        self.udp_sock.sendto(message.encode('utf8'), (data, 5555))
        self.Iconize()
        
        
        
    def receive(self, message):
        #wx.CallAfter(text_output.SetValue, message.decode('utf8'))
        while message != "":
            wx.CallAfter(self.OpenWin)
            break
BlackJack

@Muck22: Die grössten Probleme bei diesem Quelltext haben nicht wirklich etwas mit `wx` zu tun. Die Funktion `OpenWin` erwartet ein Argument welches nicht übergeben wird, aber auch gar nicht verwendet wird, weil das erste was passiert ist das der Name neu gebunden wird.

Es wird versucht `message` zu verwenden was allerdings *nicht* übergeben wird. Was soll denn Python an der Stelle machen? Raten welcher Wert von irgendwoher dafür verwendet werden soll?

`f1` ein total schlechter Name.

``global`` hat in sauberen Programmen nichts zu suchen.

Die ``while``-Schleife in `receive` extrem unsinnig. Schleifen die grundsätzlich *immer* nur 0 oder 1mal durchlaufen werden sind keine Schleifen. Dafür gibt es ``if``.

Ich glaube das einzige Buch zu `wx` ist das 8 Jahre alte „wxPython in Action”, und das ist auf englisch. Wobei man letztendlich sowieso englisch lernen sollte, wenn man programmieren will.
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Na ja ein Buch auf deutsch würde die Sache vereinfachen, aber wenn es das nicht gibt dann eben nicht.
Muss ich mir ein gutes Tutorial im Netz suchen! Ist nur die Frage womit fängt man an?
Ich befürchte "Hallo Welt" :lol:
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Code: Alles auswählen

 def OpenWin(TextCtrl):
        f1 = wx.Frame(None, title = "-----Neue Nachricht!-----", size=(500, 80))
        f1.SetBackgroundColour((112, 112, 112))
        f1.Centre()
        text_output = wx.TextCtrl(f1, wx.ID_ANY, size=(80, 20), pos=(5, 5))
        
        #f1.Iconize(False)
        f1.Show()        
        #message = text_output.SetValue()
                   
        text_output.SetValue(message.decode('utf8'))
        
    def EvtComboBox(self, evt):
        global data
        cb = evt.GetEventObject()  
        data = cb.GetValue()
           
       
    def send(self, _event):
        message = self.text_input.GetValue()
        self.udp_sock.sendto(message.encode('utf8'), (data, 5555))
        self.Iconize()
        
        
        
    def receive(self, message):
        #wx.CallAfter(text_output.SetValue, message.decode('utf8'))
        while message != "":
            
            wx.CallAfter(self.OpenWin)
            break
Ich versteh das irgendwie nicht mit den Argumenten? Kann mir das mal einer ganz laaaangsam erklären? :wink:
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo Muck22,
zum Thema Doku zu wxPython. Kennst du die wx-Python-docs und wx-Python-demo (auf der wxPython-Seite)? Die Demo ist ziemlich gut. Da hast du praktisch eine Anwendung in der du die einzelnen wxPython Widgets usw. live ausprobieren kannst und in Verwendung mit Codebeispielen siehst.

Sorry, das ich noch mal nachfrage, aber was möchtest du erreichen? Einfach eine Meldung in einem Fenster/Dialog ausgeben? Dein Titel im Frame "Neue Nachricht" deutet darauf hin. Wenn ich mich richtig erinnere, verwendet man Frames bei wxPython als Hauptfenster,also MainWindow (mit Statusleisten und Menü-Möglichkeiten usw.) und z.B. Dialog oder die vorgegebenden Dialogfenster für Eingaben und Nachrichten an den Nutzer. Oder möchtest du ein ganzes Haupt-Anwendungsfenster nach einer Nachricht öffnen? Also ein MainWindow aus einem MainWindow? Da ich wie immer zu wenig Zeit habe, kann ich natürlich in deinem Post auch was übersehen haben. :D Vielleicht ist es auch möglich dein Problem auf ein ausführbares nicht zu langes Beispiel nicht zu reduzieren und zu posten. Deinen Quellcode so müsste ich erst mal "lauffähig" bei mir machen...und dann weiß man nie, ob dein Restprogramm und mein Rest zueinander passen...
Viele Grüße
Piet
Zuletzt geändert von Piet Lotus am Mittwoch 15. Oktober 2014, 20:17, insgesamt 1-mal geändert.
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo Muck22,
da war ich mal wieder zu schnell. Hier noch meine Anmerkung zu Python-Büchern.
BlackJack schrieb:
BlackJack hat geschrieben: Ich glaube das einzige Buch zu `wx` ist das 8 Jahre alte „wxPython in Action”, und das ist auf englisch. Wobei man letztendlich sowieso englisch lernen sollte, wenn man programmieren will.
Das stimmt, "wxPython in Action" ist schon alt und die wx-Version hat sich mittlerweile etwas weiterentwickelt. Aber das Buch ist sehr gut. Alternativ gibt es noch z.B. noch das "wxPython 2.8 Application Development Cookbook" von Packt Publishing, das hat mir allerdings nicht so gut gefallen. Wenn ich mich richtig erinnere ist das Kapitel zum Thema Grafik recht dünn und ein Kapitel zum Thema Umgang mit Tabellen fehlt völlig.
Viele Grüße
Piet
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Piet Lotus hat geschrieben:Hallo Muck22,
zum Thema Doku zu wxPython. Kennst du die wx-Python-docs und wx-Python-demo (auf der wxPython-Seite)? Die Demo ist ziemlich gut. Da hast du praktisch eine Anwendung in der du die einzelnen wxPython Widgets usw. live ausprobieren kannst und in Verwendung mit Codebeispielen siehst.

Sorry, das ich noch mal nachfrage, aber was möchtest du erreichen? Einfach eine Meldung in einem Fenster/Dialog ausgeben? Dein Titel im Frame "Neue Nachricht" deutet darauf hin. Wenn ich mich richtig erinnere, verwendet man Frames bei wxPython als Hauptfenster,also MainWindow (mit Statusleisten und Menü-Möglichkeiten usw.) und z.B. Dialog oder die vorgegebenden Dialogfenster für Eingaben und Nachrichten an den Nutzer. Oder möchtest du ein ganzes Haupt-Anwendungsfenster nach einer Nachricht öffnen? Also ein MainWindow aus einem MainWindow? Da ich wie immer zu wenig Zeit habe, kann ich natürlich in deinem Post auch was übersehen haben. :D Vielleicht ist es auch möglich dein Problem auf ein ausführbares nicht zu langes Beispiel nicht zu reduzieren und zu posten. Deinen Quellcode so müsste ich erst mal "lauffähig" bei mir machen...und dann weiß man nie, ob dein Restprogramm und mein Rest zueinander passen...
Viele Grüße
Piet
@Piet Lotus, ich hab mich da mitlerweile in dem von mir zusammengewürfelten Code so verwirrt, dass ich beschlossen habe das gannze noch einmal von vorne zu beginnen.

Die Idee war ein UDP Programm das Nachrichten versendet und empfangen kann, vom einen Rechner wird eine Nachricht zur anderen IP Adresse verschickt, wo sich dann ein Frame mit der entsprechenden Nachricht öffnet. Evtl. sollte der Sender noch eine lesebestätigung bekommen oder so etwas in der Art.

Gruß Muck22 :D
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Fehler!!!!! Kann man das hier löschen?
Zuletzt geändert von Muck22 am Donnerstag 16. Oktober 2014, 10:04, insgesamt 1-mal geändert.
BlackJack

@Muck22: Die Methode ist ein Attribut auf `self`. Ich denke es fehlt an Grundlagen. Vielleicht solltest Du GUIs eine Weile zurückstellen und objektorientierte Programmierung erst einmal ohne lernen. Wobei ja offenbar selbst Funktionen und lokale Variablen noch nicht so ganz sitzen.

Attribute sollten nicht ausserhalb von `__init__()` das erste mal gesetzt werden. Nach dem `__init__()` abgearbeitet wurde, sollte das Objekt komplett sein.
Muck22
User
Beiträge: 32
Registriert: Donnerstag 25. September 2014, 05:58

Ja, Du hast recht! Ich find hier nicht den richtigen Einstieg, ich weiss einfach nicht wo ich anfangen soll und vor allem mit welchem Tutorial!
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo Muck22,
wenn du Probleme mit den Grundlagen hast, dann findest du hier im Forum sicherlich einige gute Hinweise. Wenn's nicht unbedingt ein Tutorial sein muss, dann greif auf ein Buch zurück - über gute und schlechte Bücher wird hier ja auch ab und zu was geschrieben. Und wenn es wxPython sein soll, dann schau dir die "mitgelieferten" Demos der Doku an. Da kannst du die Beispiele auch manipulieren. Ansonsten nur Mut! Dranbleiben, Geduld haben, machen und wenn du nicht mehr weiterkommst - frag hier nach :D
Viele Grüße
Piet
Antworten