• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pygame - jak wyświetlić wyśrodkowany tekst?

VPS Starter Arubacloud
+1 głos
664 wizyt
pytanie zadane 19 lipca 2021 w Python przez Hajpa Użytkownik (880 p.)
Witam,

 

Mam program, który działa na pełnym ekranie (0, 0).

Chciałbym wyświetlić okienko z nazwą programu i krótką instrukcją obsługi, które wyświetli się po wciśnięciu F1.

Okienko o wymiarach np. 600x700. Wycentrowane względem całego ekranu a w nim w górnej części nazwa programu większą czcionką i pod spodem mniejszą skróty klawiszowe i objaśnienia.

Może ktoś oświecić?

2 odpowiedzi

+1 głos
odpowiedź 20 lipca 2021 przez VBService Ekspert (251,210 p.)
edycja 20 lipca 2021 przez VBService
0 głosów
odpowiedź 19 lipca 2021 przez niezalogowany
edycja 19 lipca 2021

https://stackoverflow.com/questions/23982907/how-to-center-text-in-pygame

https://pythonprogramming.altervista.org/how-to-center-a-text-with-pygame/?doing_wp_cron=1626699590.2662210464477539062500

przykład

# draw text
font = pygame.font.Font(None, 25)
text = font.render("You win!", True, BLACK)
text_rect = text.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2))
screen.blit(text, text_rect)

 

komentarz 19 lipca 2021 przez VBService Ekspert (251,210 p.)

@niezalogowany koledze chyba chodzi o

 

modal window lub dialog box.

How to create a modal window in pyqt?

1
komentarz 19 lipca 2021 przez niezalogowany

no to już ma wszystko wink thx

komentarz 20 lipca 2021 przez Hajpa Użytkownik (880 p.)

@niezalogowany,

 

Inaczej zapytam. Na pełnym ekranie (0, 0) wyświetlam 4 kółka, 2 w poziomie i 2 w pionie i chciałbym, żeby w środku każdego koła wyświetlona była cyfra. Lewe górne koło "1", lewe prawe "2"  itd. Jak to zrobić? Chciałbym później ruszać tymi kulkami z numerkami.

komentarz 20 lipca 2021 przez niezalogowany

przedstaw odrobinkę Swojego kodu...to skorygujemy wink wtedy ...

komentarz 20 lipca 2021 przez Hajpa Użytkownik (880 p.)
Chciałbym, żeby tekst był w środku kółka a nie na środku ekranu, tak jak w większości przykładów jest przedstawione.

I wtedy, jak już tekst będzie w kulce, to rozumiem, że zmieniając xy kółka, razem z kółkiem będzie się przemieszczać tekst. Nie czaję tych rect, więc przykład byłby najlepszą pomocą.

import pygame

pygame.init()
window = pygame.display.set_mode((600, 600))
font = pygame.font.SysFont(None, 100)
clock = pygame.time.Clock()
text = font.render("Text", True, (255, 255, 255))

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False          
    window.fill(0)
    pygame.draw.circle(window, (220, 220, 220), (150, 150), 100)
    window.blit(text, (300,300))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
exit()
komentarz 20 lipca 2021 przez niezalogowany

rect = rectangle

Tutaj masz przykład jak umieścić text w prostokącie. 

https://stackoverflow.com/questions/19117062/how-to-add-text-into-a-pygame-rectangle

Pobaw się z okręgiem

tutaj masz oficjalną instrukcję obsługi im więcej tam czasu spędzisz tym szybciej dojdziesz do celu laugh

http://www.pygame.org/docs/ref/draw.html

 

Powodzenia wink

komentarz 20 lipca 2021 przez VBService Ekspert (251,210 p.)
edycja 21 lipca 2021 przez VBService

Nie czaję tych rect, więc przykład byłby najlepszą pomocą.

Dobra rozumiem, że czasem kilka linijek kodu jest bardziej pomocne ... wink

 

Bardzo uproszczony przykład (bez "kontenera" - rect)

import pygame
 
pygame.init()
window_size = (600, 600)
window = pygame.display.set_mode(window_size, 0, 32)
 
clock = pygame.time.Clock()
 
font_size = 100
font = pygame.font.SysFont(None, font_size)

text_color = (0, 255, 0)
text_in_circle = ("1", "2", "3", "4")
text_render = [font.render(text, True, text_color) for text in text_in_circle]

 
circle_radius = 50
circle_x = 100
circle_y = 100
circle_color = (220, 220, 220)
 
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
             
    window.fill(0)    
 
 
    # lewy -górny
    (circle_current_x, circle_current_y) = (circle_x, circle_y)
    pygame.draw.circle(window, circle_color, (circle_current_x, circle_current_y), circle_radius)

    (text_width, text_height) = font.size(text_in_circle[0])
    window.blit(text_render[0], (circle_current_x - (text_width / 2), circle_current_y - (text_height / 2)))
     
    # prawy -górny
    (circle_current_x, circle_current_y) = (window_size[0] - circle_x, circle_y)
    pygame.draw.circle(window, circle_color, (circle_current_x, circle_current_y), circle_radius)

    (text_width, text_height) = font.size(text_in_circle[1])
    window.blit(text_render[1], (circle_current_x - (text_width / 2), circle_current_y - (text_height / 2)))    
     
    # lewy - dolny
    (circle_current_x, circle_current_y) = (circle_x, window_size[1] - circle_y)
    pygame.draw.circle(window, circle_color, (circle_current_x, circle_current_y), circle_radius)

    (text_width, text_height) = font.size(text_in_circle[2])
    window.blit(text_render[2], (circle_current_x - (text_width / 2), circle_current_y - (text_height / 2)))     
     
    # prawy - dolny
    (circle_current_x, circle_current_y) = (window_size[0] - circle_x, window_size[1] - circle_y)
    pygame.draw.circle(window, circle_color, (circle_current_x, circle_current_y), circle_radius)

    (text_width, text_height) = font.size(text_in_circle[3])
    window.blit(text_render[3], (circle_current_x - (text_width / 2), circle_current_y - (text_height / 2)))  
 
 
    pygame.display.flip()
    clock.tick(60)
 
pygame.quit()
exit()

komentarz 21 lipca 2021 przez Hajpa Użytkownik (880 p.)
Dzięki za przykładowy kod. Zawsze to łatwiej.

W internecie znalazłem kod, który po małej modyfikacji wyświetla 2 kwadraty, gdzie drugi jest w środku 1go. W jaki sposób wpisać wyraz w ten mały kwadrat?

Dzięki.

 

import pygame   
pygame.init()  
window = pygame.display.set_mode((0, 0))
x = 200
y = 200
width = 100
height = 50
vel = 5

run = True
while run:
    pygame.time.delay(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and x>0:
        x -= vel
    if keys[pygame.K_RIGHT] and x<600-width:
        x += vel
    if keys[pygame.K_UP] and y>0:
        y -= vel
    if keys[pygame.K_DOWN] and y<600-height:
        y += vel
    window.fill((255, 255, 255))
    rect1 = pygame.Rect(x, y, 250, 250)
    rect2 = pygame.Rect(0, 0, 120, 74)
    rect2.center = rect1.center
    pygame.draw.rect(window, (0, 0, 0), rect1)
    pygame.draw.rect(window, (255, 255, 255), rect2)
#    pygame.draw.rect(window, (255, 250, 250), (x, y, width, height))
    pygame.display.update()  
pygame.quit()
komentarz 21 lipca 2021 przez VBService Ekspert (251,210 p.)
edycja 21 lipca 2021 przez VBService

Dodałem też zamykanie aplki przez naciśnięcie klawisza ESC-p.  wink


import pygame

pygame.init()  
window = pygame.display.set_mode((0, 0))

(screen_width, screen_height) = pygame.display.get_surface().get_size()

font_size = 40
font = pygame.font.SysFont("arial", font_size)

(rect1_width, rect1_height) = (250, 250)
rect1_color = (0, 0, 0)
(rect1_x, rect1_y, rect1_step) = (200, 200, 5)

(rect2_width, rect2_height) = (120, 74)
(rect2_x, rect2_y) = (0, 0)
(rect2_color, rect2_text_color) = ((255, 255, 255), (0, 255, 0))
rect2_text_render = font.render("wyraz", True, rect2_text_color)


run = True
while run:
    pygame.time.delay(10)
    keys = pygame.key.get_pressed()
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:
            run = False
            
    if keys[pygame.K_LEFT] and rect1_x > 0:
        rect1_x -= rect1_step
    if keys[pygame.K_RIGHT] and rect1_x < (screen_width - rect1_width):
        rect1_x += rect1_step
    if keys[pygame.K_UP] and rect1_y > 0:
        rect1_y -= rect1_step
    if keys[pygame.K_DOWN] and rect1_y < (screen_height - rect1_height):
        rect1_y += rect1_step

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

    rect1 = pygame.Rect(rect1_x, rect1_y, rect1_width, rect1_height)
    rect2 = pygame.Rect(rect2_x, rect2_y, rect2_width, rect2_height)
    rect2.center = rect1.center
    
    pygame.draw.rect(window, rect1_color, rect1)
    rect2_draw = pygame.draw.rect(window, rect2_color, rect2)
    
    # tekst rect2_text_render wycentrowany w rect2
    window.blit(rect2_text_render, rect2_text_render.get_rect(center = rect2_draw.center))
      
    #pygame.draw.rect(window, (255, 250, 250), (x, y, width, height))
    
    pygame.display.update()
    
    
pygame.quit()

 

 

How to add text into a pygame rectangle ]

 

P.S postaraj się wrzucać kod prawidłowo  smiley  

 Jak wstawić do pytania kod źródłowy?

komentarz 26 lipca 2021 przez Hajpa Użytkownik (880 p.)

Dzięki, chyba załapałem, ale teraz mam pytanko o położenie w rect. W moim przykładzie wyświetlam 6 punktów w czerwonym rect i punkt 2 i 5 nie chcą przytulić się do lewej i prawej. Obszedłem to w punkcie 5, ale gdybym miał tylko jeden punkt i chciałbym go przykleić do lewej na środku, to jak to zrobić?

import pygame as pg
pg.init()
screen = pg.display.set_mode((1000, 500))
clock = pg.time.Clock()
white=(255,255,255)
red=(255,0,0)
black=(0)
radius= 25
xs, ys =screen.get_size()
fullrect = pg.Rect(0, 0, xs, ys)
kafelekrect = pg.Rect(0, 0, 200, 300)
p1rect = pg.Rect(0, 0, 100, 100)
p2rect = pg.Rect(0, 0, 100, 100)
p3rect = pg.Rect(0, 0, 100, 100)
p4rect = pg.Rect(0, 0, 100, 100)
p5rect = pg.Rect(0, 0, 100, 100)
p6rect = pg.Rect(0, 0, 100, 100)
# położenie
kafelekrect.center = fullrect.center
p1rect.topleft = kafelekrect.topleft
p2rect.left = kafelekrect.left
#p2rect.topleft = p1rect.bottomleft
p3rect.bottomleft = kafelekrect.bottomleft
p4rect.topright = kafelekrect.topright
p5rect.topright = p4rect.bottomright
p6rect.bottomright = kafelekrect.bottomright

print ("kafel ", kafelekrect)
print (p1rect)
print (p2rect)
print (p3rect)
print ("p4 ", p4rect)
print (p5rect)
print (p6rect)






done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    screen.fill(black)
#kafelek
    pg.draw.rect(screen, red, kafelekrect)
# punkty
    pg.draw.circle(screen, white, p1rect.center, radius)
    pg.draw.circle(screen, white, p2rect.center, radius)
    pg.draw.circle(screen, white, p3rect.center, radius)
    pg.draw.circle(screen, white, p4rect.center, radius)
    pg.draw.circle(screen, white, p5rect.center, radius)
    pg.draw.circle(screen, white, p6rect.center, radius)
    pg.display.flip()
    clock.tick(60)

 

komentarz 27 lipca 2021 przez VBService Ekspert (251,210 p.)
edycja 27 lipca 2021 przez VBService

Pobierz z parent (czerwony rect)

The Rect object has several virtual attributes which can be used to move and align the Rect:

 

x,y
top, left, bottom, right
topleft, bottomleft, topright, bottomright
midtop, midleft, midbottom, midright
center, centerx, centery
size, width, height
w,h

i przypisz np. do rect.center dla "kropek" ( pg.draw.circle(..., p1rect, ...) )

# położenie p1rect, p2rect, ... itd (kropek) we wnątrz kafelekrect
p1rect.center = kafelekrect.topleft
p2rect.center = kafelekrect.topright
p3rect.center = kafelekrect.midleft
p4rect.center = kafelekrect.midright
p5rect.center = kafelekrect.bottomleft
p6rect.center = kafelekrect.bottomright

wtedy uzyskasz

import pygame as pg

pg.init()
screen = pg.display.set_mode((1000, 500))

clock = pg.time.Clock()

white = (255, 255, 255)
red = (255, 0, 0)
black = (0, 0, 0)

radius = 25
xs, ys = screen.get_size()

fullrect = pg.Rect(0, 0, xs, ys)
kafelekrect = pg.Rect(0, 0, 200, 300)
kafelekrect.center = fullrect.center

p1rect = pg.Rect(0, 0, 100, 100)
p2rect = pg.Rect(0, 0, 100, 100)
p3rect = pg.Rect(0, 0, 100, 100)
p4rect = pg.Rect(0, 0, 100, 100)
p5rect = pg.Rect(0, 0, 100, 100)
p6rect = pg.Rect(0, 0, 100, 100)

# położenie p1rect, p2rect, ... itd (kropek) we wnątrz kafelekrect
p1rect.center = kafelekrect.topleft
p2rect.center = kafelekrect.topright
p3rect.center = kafelekrect.midleft
p4rect.center = kafelekrect.midright
p5rect.center = kafelekrect.bottomleft
p6rect.center = kafelekrect.bottomright
 
print ("kafel ", kafelekrect)
print ("p1", p1rect)
print ("p2", p2rect)
print ("p3", p3rect)
print ("p4", p4rect)
print ("p5", p5rect)
print ("p6", p6rect)  
 
 
done = False
while not done:
    keys = pg.key.get_pressed()
     
    for event in pg.event.get():
        if event.type == pg.QUIT or keys[pg.K_ESCAPE]:
            done = True
 
    screen.fill(black)
    
    # kafelek
    pg.draw.rect(screen, red, kafelekrect)
    
    # punkty
    pg.draw.circle(screen, white, p1rect.center, radius)
    pg.draw.circle(screen, white, p2rect.center, radius)
    pg.draw.circle(screen, white, p3rect.center, radius)
    pg.draw.circle(screen, white, p4rect.center, radius)
    pg.draw.circle(screen, white, p5rect.center, radius)
    pg.draw.circle(screen, white, p6rect.center, radius)
    
    pg.display.flip()
    clock.tick(60)

pg.quit()

 

a np. przypisując ten sam wirtualny atrybut (1:1)

# położenie p1rect, p2rect, ... itd (kropek) we wnątrz kafelekrect
p1rect.topleft = kafelekrect.topleft
p2rect.topright = kafelekrect.topright
p3rect.midleft = kafelekrect.midleft
p4rect.midright = kafelekrect.midright
p5rect.bottomleft = kafelekrect.bottomleft
p6rect.bottomright = kafelekrect.bottomright

uzyskasz  wink

import pygame as pg

pg.init()
screen = pg.display.set_mode((1000, 500))

clock = pg.time.Clock()

white = (255, 255, 255)
red = (255, 0, 0)
black = (0, 0, 0)

radius = 25
xs, ys = screen.get_size()

fullrect = pg.Rect(0, 0, xs, ys)
kafelekrect = pg.Rect(0, 0, 200, 300)
kafelekrect.center = fullrect.center

p1rect = pg.Rect(0, 0, 100, 100)
p2rect = pg.Rect(0, 0, 100, 100)
p3rect = pg.Rect(0, 0, 100, 100)
p4rect = pg.Rect(0, 0, 100, 100)
p5rect = pg.Rect(0, 0, 100, 100)
p6rect = pg.Rect(0, 0, 100, 100)

# położenie p1rect, p2rect, ... itd (kropek) we wnątrz kafelekrect
p1rect.topleft = kafelekrect.topleft
p2rect.topright = kafelekrect.topright
p3rect.midleft = kafelekrect.midleft
p4rect.midright = kafelekrect.midright
p5rect.bottomleft = kafelekrect.bottomleft
p6rect.bottomright = kafelekrect.bottomright
 
print ("kafel ", kafelekrect)
print ("p1", p1rect)
print ("p2", p2rect)
print ("p3", p3rect)
print ("p4", p4rect)
print ("p5", p5rect)
print ("p6", p6rect)  
 
 
done = False
while not done:
    keys = pg.key.get_pressed()
     
    for event in pg.event.get():
        if event.type == pg.QUIT or keys[pg.K_ESCAPE]:
            done = True
 
    screen.fill(black)
    
    # kafelek
    pg.draw.rect(screen, red, kafelekrect)
    
    # punkty
    pg.draw.circle(screen, white, p1rect.center, radius)
    pg.draw.circle(screen, white, p2rect.center, radius)
    pg.draw.circle(screen, white, p3rect.center, radius)
    pg.draw.circle(screen, white, p4rect.center, radius)
    pg.draw.circle(screen, white, p5rect.center, radius)
    pg.draw.circle(screen, white, p6rect.center, radius)
    
    pg.display.flip()
    clock.tick(60)

pg.quit()

 

dzieje się tak, że te "kropki" są pozycjonowane w rect (zielone, niebieskie na obrazku poniżej), które pozycjonowane są względem parent (czerwony rect)  wink

p1rect = pg.Rect(0, 0, 100, 100)
p2rect = pg.Rect(0, 0, 100, 100)
p3rect = pg.Rect(0, 0, 100, 100)
p4rect = pg.Rect(0, 0, 100, 100)
p5rect = pg.Rect(0, 0, 100, 100)
p6rect = pg.Rect(0, 0, 100, 100)
    # rysowanie rect dla demonstracji
    pg.draw.rect(screen, green, p1rect)
    pg.draw.rect(screen, blue, p2rect)
    pg.draw.rect(screen, blue, p3rect)
    pg.draw.rect(screen, green, p4rect)
    pg.draw.rect(screen, green, p5rect)
    pg.draw.rect(screen, blue, p6rect)

 

import pygame as pg

pg.init()
screen = pg.display.set_mode((1000, 500))

clock = pg.time.Clock()

white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
black = (0, 0, 0)

radius = 25
xs, ys = screen.get_size()

fullrect = pg.Rect(0, 0, xs, ys)
kafelekrect = pg.Rect(0, 0, 200, 300)
kafelekrect.center = fullrect.center

p1rect = pg.Rect(0, 0, 100, 100)
p2rect = pg.Rect(0, 0, 100, 100)
p3rect = pg.Rect(0, 0, 100, 100)
p4rect = pg.Rect(0, 0, 100, 100)
p5rect = pg.Rect(0, 0, 100, 100)
p6rect = pg.Rect(0, 0, 100, 100)

# położenie p1rect, p2rect, ... itd (kropek) we wnątrz kafelekrect
p1rect.topleft = kafelekrect.topleft
p2rect.topright = kafelekrect.topright
p3rect.midleft = kafelekrect.midleft
p4rect.midright = kafelekrect.midright
p5rect.bottomleft = kafelekrect.bottomleft
p6rect.bottomright = kafelekrect.bottomright
 
print ("kafel ", kafelekrect)
print ("p1", p1rect)
print ("p2", p2rect)
print ("p3", p3rect)
print ("p4", p4rect)
print ("p5", p5rect)
print ("p6", p6rect)  
 
 
done = False
while not done:
    keys = pg.key.get_pressed()
     
    for event in pg.event.get():
        if event.type == pg.QUIT or keys[pg.K_ESCAPE]:
            done = True
 
    screen.fill(black)
    
    # kafelek
    pg.draw.rect(screen, red, kafelekrect)

    # rysowanie rect dla demonstracji
    pg.draw.rect(screen, green, p1rect)
    pg.draw.rect(screen, blue, p2rect)
    pg.draw.rect(screen, blue, p3rect)
    pg.draw.rect(screen, green, p4rect)
    pg.draw.rect(screen, green, p5rect)
    pg.draw.rect(screen, blue, p6rect)    
    
    # punkty "kropki"
    pg.draw.circle(screen, white, p1rect.center, radius)
    pg.draw.circle(screen, white, p2rect.center, radius)
    pg.draw.circle(screen, white, p3rect.center, radius)
    pg.draw.circle(screen, white, p4rect.center, radius)
    pg.draw.circle(screen, white, p5rect.center, radius)
    pg.draw.circle(screen, white, p6rect.center, radius)
    
    pg.display.flip()
    clock.tick(60)

pg.quit()

1
komentarz 27 lipca 2021 przez Hajpa Użytkownik (880 p.)
Dzięki! Przegapiłem te "mid". Teraz wszystko jasne.

Jeszcze raz dzięki!

Podobne pytania

0 głosów
0 odpowiedzi 132 wizyt
+1 głos
0 odpowiedzi 114 wizyt
pytanie zadane 22 czerwca 2022 w Python przez Karp.exe Początkujący (340 p.)
0 głosów
2 odpowiedzi 438 wizyt
pytanie zadane 10 czerwca 2022 w Python przez Hajpa Użytkownik (880 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...