Python, Pygame, Pyro: Wie sende ich eine Oberfläche über ein Netzwerk?
-
13-09-2019 - |
Frage
Ich arbeite an einem Projekt in Python mit Pygame und Pyro. Ich kann Daten, Funktionen, Klassen und dergleichen leicht senden. Ich kann jedoch nicht eine Oberfläche über den Draht schicken, ohne dass sie während des Transports an mir sterben.
Der Server macht eine Oberfläche in der def __init__
von der Klasse, die über den Draht zugegriffen wird:
self.screen = pygame.display.set_mode(SCREENRECT.size, NOFRAME)
Auf dem Server druckt der Siebdruck als Surface(800x800x32 SW)
Aber wenn vom Kunden abgerufen werden Surface(Dead Display)
.
Etwas zu beachten. Ich bekomme ein toter Anzeige, wenn ich eine Accessor -Funktion verwende, um meinen Bildschirm zu erhalten. Wenn ich benutze print Player.screen
Um die Variable zu erhalten, bekomme ich stattdessen einen Pyro -Zeiger auf den Bildschirm: <Pyro.core._RemoteMethod instance at 0x02B7B7B0>
. Vielleicht kann ich das Dereference?
Ich bin höchstwahrscheinlich dick, hat jemand Einblick? Vielen Dank. :)
Lösung
Eine Pygame -Oberfläche ist eine Wrapper um eine darunter liegende SDL -Oberfläche, von der ich vermute, dass sie nicht durch Pyro serialisiert werden kann. Wenn Sie seinen Inhalt über den Draht kopieren möchten, wären Sie besser dran, so etwas zu tun:
- Verwenden Sie auf dem Server Surface.get_buffer (), um Zugriff auf die zugrunde liegenden Pixel zu erhalten.
- Notieren Sie sich die Abmessungen, die Farbtiefe usw. der Oberfläche.
- Senden Sie die aus den Schritten 1 und 2 erhaltenen Daten über den Kabel an den Client.
- Erstellen Sie auf dem Client eine neue Oberfläche mit den Abmessungen, der Farbtiefe usw. aus Schritt 2.
- Stellen Sie die Pixel der neuen Oberfläche mit Surface.get_buffer () und kopieren Sie in den Pixeln aus Schritt 1 ein.
Bearbeiten:Mir ist einfach in den Sinn gekommen, dass ich es überkompliziere. Um Ihre Oberfläche zu serialisieren, verwenden Sie pygame.image.tostring (), und um es neu zu laden, verwenden Sie es pygame.image.fromstring ().
Andere Tipps
Im Allgemeinen möchten Sie keine Oberfläche (ich gehe davon aus, dass eine Oberfläche eine geräteabhängige Anzeige ist) im Netzwerk. Meistens ist Ihr Kunde für die Verwaltung der Zeichnung auf der lokalen Oberfläche verantwortlich, und Ihr Server ist dafür verantwortlich, dem Kunden zu sagen, was er zum Zeichnen benötigt. Ein Server kann nicht einmal haben Ein Display, das Grafiken anzeigen kann!
Versuchen Sie, das Objekt zu wählen und die Datei zu senden ...