wx_pygame.exe

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Donnerstag 10. April 2008, 21:40

habe jetzt mal mit dem cx_freeze eine wx_pygame.exe erstellt (python 2.5 und pygame 1.8.0 und wx-pytgon2.8) ohne innosetup.

hier der link :
http://www.python-forum.de/topic-5726.html

und hier die wx_pygame aus diesem forum, funktioniert gantz toll :

Code: Alles auswählen

import wx
import os
import thread
global pygame 

class SDLThread:
    def __init__(self,screen):
        self.m_bKeepGoing = self.m_bRunning = False
        self.screen = screen
        self.color = (255,0,0)
        self.rect = (10,10,100,100)

    def Start(self):
        self.m_bKeepGoing = self.m_bRunning = True
        thread.start_new_thread(self.Run, ())

    def Stop(self):
        self.m_bKeepGoing = False

    def IsRunning(self):
        return self.m_bRunning

    def Run(self):
        while self.m_bKeepGoing:
            e = pygame.event.poll()
            if e.type == pygame.MOUSEBUTTONDOWN:
                self.color = (255,0,128)
                self.rect = (e.pos[0], e.pos[1], 100, 100)
                print e.pos
            self.screen.fill((0,0,0))
            self.screen.fill(self.color,self.rect)
            pygame.display.flip()
        self.m_bRunning = False;

class SDLPanel(wx.Panel):
    def __init__(self,parent,ID,tplSize):
        global pygame
        wx.Panel.__init__(self, parent, ID, size=tplSize)
        self.Fit()
        os.environ['SDL_WINDOWID'] = str(self.GetHandle())
        os.environ['SDL_VIDEODRIVER'] = 'windib'
        import pygame 
        pygame.display.init()
        window = pygame.display.set_mode(tplSize)
        self.thread = SDLThread(window)
        self.thread.Start()

    def __del__(self):
        self.thread.Stop()

class MyFrame(wx.Frame):
    def __init__(self, parent, ID, strTitle, tplSize):
        wx.Frame.__init__(self, parent, ID, strTitle, size=tplSize)
        self.pnlSDL = SDLPanel(self, -1, tplSize)
        #self.Fit()

app = wx.PySimpleApp()
frame = MyFrame(None, wx.ID_ANY, "SDL Frame", (640,480))
frame.Show()
app.MainLoop()

EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 11. April 2008, 01:47

Vielleicht noch ein paar Tips:

"pygame" kannst du auch gleich oben importieren, dann sparst du dir den recht seltsamen Weg über "global".

"SDLThread" sollte besser von "threading.Thread" erben, dass ist im Prinzip die Struktur, die du dir hier selber aufgebaut hast.

Das Attribut "m_bKeepGoing" müsste beim Zugriff eigentlich noch durch einen Lock geschützt werden. Der GIL verhindert in diesem Fall aber schlimmeres.

Die "Run"-Methode frisst etwas viel CPU. Du solltest statt Polling besser auf einen Event warten. Dazu hat man u. A. eigentlich ja Threading.

Die "__del__"-Methode hat auch nicht unbedingt das Verhalten, welches du eventuell erwartest. Führe das Anhalten des Threads besser mit einem expliziten Aufruf durch.

Und schau dir doch bitte noch mal PEP8 an. Im Besonderen werden Attributnamen nicht mit einem vorangestelltem "m" gekennzeichnet und der Typ wird auch nicht mit in den Namen aufgenommen (Typ wird öfter mal geändert, Duck-Typing).
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Freitag 11. April 2008, 08:39

sechsrad hat geschrieben:habe jetzt mal mit dem cx_freeze eine wx_pygame.exe erstellt (python 2.5 und pygame 1.8.0 und wx-pytgon2.8) ohne innosetup.

hier der link :
http://www.python-forum.de/topic-5726.html

und hier die wx_pygame aus diesem forum, funktioniert gantz toll :
Wo ist die Frage bzw. wann kommt das tolle daran?

Der Code ist nur aus wx Wiki kopiert. siehe folgenden Link, drittes Code Beispiel.

http://wiki.wxpython.org/IntegratingPyGame

Und das es mit cx_freeze funktioniert ist toll, sollte es auch dafür ist es gedacht. Geht mit py2exe und mit pyinstaller auch.
BlackJack

Freitag 11. April 2008, 08:54

Ist nicht wirklich toll. ``global`` auf Modulebene, der `m_*`-Präfix und die Verwendung von `__del__()` zeigt, dass da jemand nicht so viel Ahnung von Python hat und eigentlich C++ programmieren möchte.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Freitag 11. April 2008, 15:06

das ist mir auch aufgefallen. aber es aber funktionierte mit der exe-umsetzung.

derjenige ist bestimmt ein c++ fan. ich würde es auch anders programmieren. aber warum soll euer kollege keine chance haben.
er hatte ...lol... von euch gelernt.

also hattet ihr auch mal einen chaotischen programmierstil.

gebt die hoffnung nicht auf, bis zu eurer rente mit 68 klappt es...lol...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 11. April 2008, 15:57

sechsrad hat geschrieben:er hatte ...lol... von euch gelernt.

also hattet ihr auch mal einen chaotischen programmierstil.
Ich bitte um eine Untermauerung dieser Aussagen. Links reichen schon.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Freitag 11. April 2008, 20:33

Ui, hoffentlich gräbt jetzt keiner 6510-Assembler-Quelltext aus den frühen 90ern von mir aus. :-)
Antworten