Programm mit GUI versehen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

Guten Abend,

ich habe mich gerade gefragt, wie ich eine GUI um ein Programm baue.
Als Anwendungsbeispiel:

Code: Alles auswählen

import time

print('" text1..."')
time.sleep(3)
print('text1')

a = input('')

if a == 'a':
    print('text3')
Muss ich jetzt eine seperate GUI schreiben, welche die Funktion abruft oder muss um die "Funktion" eine GUI geschrieben werden?

sincerly
Lou
Cours, camarade, le vieux monde est derrière toi!
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Dafür nicht, für andere kleine Tests von Codeschnipseln auch nicht. print() wird in einer GUI nicht verwendet, sleep sollte in einer GUI nicht verwendet werden und für input gibt es dann die entsprechenden Widgets mit Eingabefeldern. Eine GUI verwendest Du, wenn Du eine Anwendung schreiben möchtest, die aussehen soll wie eine Fensteranwendung.
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

Okay, war von mir falsch formuliert. Ich dachte Graphic User Interface könnte auch ein Display sein. Wie auch immer jedenfalls
soll das alles in einem Fenster ablaufen. Ich hatte jetzt an Pygame gedacht, wobei mir immer noch nicht klar ist, wie ich den Text in das Display bekomme, wenn ich jetzt display initialisiere, bekomm ich quasi nur ein Display und der ganze printkram läuft nur in der Shell.

Kann mir wer auf die Sprünge helfen?
Cours, camarade, le vieux monde est derrière toi!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Pygame kann text darstellen, ist aber alles etwas fummeliger als ein einfaches Print. Oder ein Label in einer GUI.

Wie waere es wenn du uns mal erzaehlst was du dir am Ende vorstellst, statt schon gleich mit Technologien einzusteigen, deren Eignung noch unklar ist.
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

Es soll eine Art Textadventure werden, wo quasi Usereingaben essentiell sind.
Cours, camarade, le vieux monde est derrière toi!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn es ein reines Text Adventure sein soll, nimm das Terminal. Nicht umsonst laufen auch heute noch MUDs etc dort.

Wenn es noch bebildert werden soll, kommt es auf die Interaktion an. Wirklich Sätze eingeben? Nimm zB Tkinter & ein Texteingabefeld. Auswah von vorgegebenen Worten oder Fragen? Dann ist pygame ganz gut. Tkinter geht aber auch da.
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

Ja früher oder später ist bebildert schon auf dem plan.

ich hab mal ein pygame test gemacht mit inspiration aus dem Internet.

Code: Alles auswählen

[code]import pygame 
import sys
import time

pygame.init()

cSec = 0
cFrame = 0
FPS = 0

fps_font = pygame.font.Font("/usr/local/share/fonts/Arial.ttf", 20)

def show_fps():
    fps_overlay = fps.font.render((str(FPS), True, 0, 0, 0)
    window.blit(fps_overlay, (0, 0)):

def create_window():
    global window, window_height, window_width, window_title
    window_width, window_height = 800, 600  
    window_title = "The tale"
    pygame.display.set_caption(window_title)
    window = pygame.display.set_mode((window_width, window_height), pygame.HWSURFACE|pygame.DOUBLEBUF)
    

def count_fps():
    global cSec, cFrame, FPS

    if cSec == time.strftime("%S"):
        cFrame += 1
    else:
        FPS = cFrame
        cFrame = 0
        cSec = time.straftime("%S")


create_window()

isRunning = True

while isRunning:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            isRunning = False

    window.fill((255, 0, 255))

    show_fps()

    
    pygame.display.update()

pygame.quit()
sys.exit()
[/code]



Dazu zwei Sachen:

1. Ich bin mir nicht sicher wie ich zu den "global" stehen soll.

2.
window.blit(fps_overlay, (0, 0)):
^
SyntaxError: invalid syntax
Cours, camarade, le vieux monde est derrière toi!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

global vermeidet man dadurch, dass man alles war zur Grafikausgabe gehört in einer Klasse definiert. Anweisungen werden nicht mit : abgeschlossen, daher der Syntaxfehler. Frames per second werden normalerweise über Zeit seit dem letzten Frame berechnet.
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

okay. was war nochmal der grund weshalb man globale vermeiden sollte?
den syntax fehler zeigt es mir auch ohne : an.

Code: Alles auswählen

 
   File "übung.py", line 15
    window.blit(fps_overlay, (0, 0))
         ^
SyntaxError: invalid syntax

Cours, camarade, le vieux monde est derrière toi!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lou Cyphr3: weil da noch weitere Syntax-Fehler sind. Zähl mal die Klammern in der Zeile davor.

In Deinem Fall ist "global" unnötig, weil Du besser richtige Funktionen schreiben solltest, die auch Rückgabewerte haben.

Ohne "global" könnte das so aussehen (ungetestet):

Code: Alles auswählen

import pygame
import sys
import time

WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600

def show_fps(window, font, fps):
    fps_overlay = font.render("{:.1f}".format(fps), True, 0, 0, 0)
    window.blit(fps_overlay, (0, 0))
 
def create_window():
    pygame.init()
    pygame.display.set_caption("The tale")
    return pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT), pygame.HWSURFACE|pygame.DOUBLEBUF)
   
def main():
    window = create_window() 
    font = pygame.font.Font("/usr/local/share/fonts/Arial.ttf", 20)
    last_time = 0
 
    while True:
	    current_time = time.time()
		fps = 1 / (current_time - last_time)
		last_time = current_time()
		
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                break
 
        window.fill((255, 0, 255))
        show_fps(window, font, fps)
        pygame.display.update()
 
    pygame.quit()

if __name__ == '__main__':
    main()
Antworten