pygame Gui meigu

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Hallo,

ich schreibe zur Zeit eine Gui für pygame.
Das ist mein erstes "richtiges" Projekt und um git ein bisschen zu lernen, hab ich es mal auf bitbucket hochgeladen.

Ich verwende pygame 1.9.2 und python3

Die Platzierung der Widige soll später mit Pfaden und vordefinierten geometrischen Figuren möglich sein

hier mal beispiel.py

Code: Alles auswählen

#!/usr/bin/env python3

"""Gui Test und Beispiel"""

import sys
import pygame
from pygame.freetype import Font, SysFont
from pygame.locals import *

#Import von meingu
import meingu.Gui as Gui
from meingu.locals import *

#init der pygame Umgebung
pygame.init()
buffer = pygame.display.set_mode((600, 600))
pygame.key.set_repeat(1, 1) #sollte immer gesetzt werden
CLOCK = pygame.time.Clock()

#Erstelle ein Standard Font Objekt für die Gui
#Es muss ein freetype Font sein
DEFAULTFONT = SysFont(None, 12)

#Das Haupt Fenster der Gui mit der Größe des ganzen Fensters
interface = Gui.Interface(buffer.get_size())

#Erstellung aller anderen Gui Elemente
container = Gui.Container(size=(160, 160))
color_test = Gui.Color((40, 40), (255, 0, 0))
color_test2 = Gui.Color((40, 40), (0, 255, 0))
text_test = Gui.Text("EXIT", font=DEFAULTFONT, fg=(255, 0, 0),
                 bg=(255, 255, 255))
image_test = Gui.Image("Test.png")
text_test2 = Gui.Text("Test", font=DEFAULTFONT, bg=(255, 255, 255))
label_test = Gui.Label("Label_test", font=DEFAULTFONT, bg=(255, 255, 255))
entry_test = Gui.Entry(font=DEFAULTFONT)
entry_text = Gui.Text("Entry", font=DEFAULTFONT, fg=(255, 255, 255),
                      bg=(100, 100, 155))
entry_test2 = Gui.Entry(font=DEFAULTFONT, color=(255, 255, 255))
entry_text2 = Gui.Text("Entry", font=DEFAULTFONT, fg=(255, 255, 255),
                      bg=(100, 100, 155))
labtestplace = Gui.Label("test place_to", font=DEFAULTFONT,
                     color=(200, 100, 100), size=(128, 32))
liste = [Gui.Text("das ist text " + str(num), DEFAULTFONT,
                  fg=(255, 255, 0)) for num in range(0, 6)]

#einstellen der event eingaben
text_test.bind_mouse_event(MOUSEBUTTONUP, 1, sys.exit)

#setzt den Fokus der Gui auf label_test wen es angeklickt wird
label_test.bind_mouse_event(MOUSEBUTTONUP, 1, label_test.activate)
container.bind_mouse_event(MOUSEBUTTONUP, 1, container.activate)

#Ruft eine Funktion auf bei Fokussierung
label_test.bind_event(SET_FOKUS, lambda: print("fokus set at Label_test"))
container.bind_event(SET_FOKUS, lambda: print("fokus set at container"))

#platziert alle Widige die ins Interface sollen
interface.place(container, side="center", anchor="center")
interface.place(image_test, side="topleft", anchor="topleft")
interface.place(text_test2, side="bottomright", anchor="bottomright")
interface.place(label_test, side="bottomleft", anchor="bottomleft")
interface.place(entry_test, side="topright", anchor="topright")

#platziert alle Widige die in den Container sollen
container.place(color_test, side="topleft", anchor="topleft")
container.place(color_test2, side="bottomright", anchor="bottomright")
container.place(text_test, side="center", anchor="center")
container.place(entry_text2, side="bottomleft", anchor="bottomleft")

#platziert labtestplace anliegend an Container in den gleichen Master
Gui.place_too(container, labtestplace)
Gui.place_too(entry_test, entry_text, side="midright", anchor="midleft",
              offset=(-2, 0))
Gui.place_too(entry_text2, entry_test2, side="midleft", anchor="midright",
              offset=(2, 0))

#platziert die Widige in der liste in einer reihe
Gui.place_in_line(interface, liste, image_test.get_pos("bottomleft"),
                  offset=(0, 2))

if __name__ == '__main__':
    while True:
        
        for event in pygame.event.get():
            etype = event.type
            if etype == QUIT:
                sys.exit()
            elif etype == MOUSEMOTION:
                #muss immer aufgerufen werden
                interface.mousemotion(event.buttons, event.pos, event.rel)
            elif etype == MOUSEBUTTONUP:
                #muss immer aufgerufen werden
                interface.mouse_imput(etype, event.button)
            elif etype == MOUSEBUTTONDOWN:
                #muss immer aufgerufen werden
                interface.mouse_imput(etype, event.button)
            if etype == KEYDOWN:
                #muss immer aufgerufen werden
                interface.key_input(KEYDOWN, event.key, event.unicode)
            elif etype == KEYUP:
                #muss immer aufgerufen werden
                interface.key_input(KEYUP, event.key, None)
            if etype == VIDEORESIZE:
                pass
            
        buffer.fill((0, 0, 0))
        
        #muss immer aufgerufen werden
        interface.update()
        interface.draw(buffer)#buffer ist das Surface auf das die Gui zeichnet
        
        past_time = CLOCK.tick(30)
        pygame.display.flip()
würde mich über Verbesserungsvorschläge und Kritik freuen
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

hi,

nach längerer zeit und Änderung des namens, ist nun v 0.1 meiner Gui fertig.
https://bitbucket.org/Erkenbrand/pyogi

enthalten sind:
  • eine Interface classe
    Base_text : einzeiliges text Widget
    Multiline : mehrzeiliges text Widget
    Base_color : einfarbiges Widget
    Container : einfarbiges Widget das andere Widget enthält
    Label : einzeiliges text Widget auf eine Farbe abgebildet
    Entry : einzeiliges Eingabe Feld
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Sag mal worin der Sinn liegt eines Shebangs, wenn das Modul gar nicht aufgerufen wird?
Ein leere Except Zweig ist schlechter Stil, in allen Programmiersprachen.
PEP8 nochmal anschauen, bspw. bei Klassennamen(kein Unterstrich) und Funktionen(mit Unterstrich) wenn sie aus 2 Wörter sich zusammensetzen.
Bei einigen Codestellen frag ich mich, ob das so funktioniert, Vergleich auf None mittels Gleichheitsoperator.
normalizecolor sieht der unschön aus.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

hallo,

der Sinn des Shebangs liegt darin das ich in Zukunft erst denke und Dan Schreibe :oops:

Der vergleich mit None funktioniert weil None =! False ist.
Das Modul normalizecolor.py nenne ich in edit.py um und die Funktion in normalize so das es mit pyogi.color.edit.normalize aufgerufen werden kann.
meinst du """"korrigiert alle die Farben auf einen zulaessigen wert""" :? oder die Funktion an sich mit unschön?

danke für deine Meldung.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Erkenbrand hat geschrieben: Der vergleich mit None funktioniert weil None =! False ist.
Ausgerechnet bei ``None`` sollte man aber auf die Identität testen - schließlich ist das ein Singleton und wenn etwas daran gebunden ist, dann ist es immer *dasselbe* Objekt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Jetzt wo du Singleton schreibst, fällt mir ein das ich schon öfters gelesen habe, man sol mit is None prüfen.
Danke ich Weis jetzt was er meinte.
Antworten