Простой способ отображения текста на экране в Python?

1

Я искал Google и смотрел StackOverflow, но не повезло...

Я бы хотел отобразить текст на экране (а не консоль) для художественного проекта, который я разрабатываю. Строка будет отображаться в полноэкранном окне с краем до края без меню и т.д. Строка будет быстро обновляться (представьте, что строка случайных букв отображается и перерисовывается так же быстро, как позволяет компьютер). Выбор шрифта и цвета (по буквам) будет отличным бонусом.

Строка будет центрирована на экране (не прокручивается).

Я новичок в программировании. Отображение текста на экране кажется гораздо более сложным, чем я ожидал.:)

Я столкнулся с решениями, использующими pygame, но код примера не работает. Вот типичный пример:

https://www.daniweb.com/programming/software-development/code/244474/pygame-text-python

То, что я вижу на своем Mac, - это открытие окна без текста, причем код продолжает работать неограниченно. Подобный опыт с другими кодами и другими библиотеками, с которыми я столкнулся.

Является ли pygame моим лучшим выбором (простота программирования на Python, высокая скорость) для моих нужд или есть ли другие библиотеки, лучше подходящие для того, что я хочу?

Если pygame - правильное направление, может кто-нибудь предложить образец кода, который заставит меня идти?

Спасибо,

- Дарин

  • 0
    Пример кода работает для меня и в значительной степени то, что вы ищете. Вы установили Pygame? Запустите pip install pygame в командной строке. Pygame может быть не лучшим выбором, но это хорошо для того, что вы пытаетесь сделать.
  • 0
    Не повезло здесь. Возможно, моя Pygame установлена неправильно? (Хотя он запускал тестовую игру типа «космические захватчики», которая шла с ним) ... @PM 2King Tkinter работает хорошо - думаю, я пойду по этому пути и посмотрю, куда он меня приведет. Спасибо!
Теги:
pygame
text

2 ответа

0
Лучший ответ

Вот решение для пирогама. Просто передайте случайные буквы и цвет Font.render, а затем blit возвращаемую поверхность. Чтобы центрировать это, я вызываю метод get_rect поверхности txt и передаю центр screen_rect в качестве аргумента center. Обратите внимание, что вы не можете выбрать другой цвет для каждой буквы. Для этого вам, вероятно, придется отобразить несколько поверхностей "одной буквы", а затем объединить их.

Предупреждение о эпилепсии. Текст очень быстро менялся (каждый кадр (30 кадров в секунду)), и я не был уверен, что это может вызвать эпилептические припадки, поэтому я добавил таймер для обновления текста только каждые 10 кадров. Будьте осторожны, если вы хотите увеличить скорость обновления.

import sys
from random import choice, randrange
from string import ascii_letters

import pygame as pg


def random_letters(n):
    """Pick n random letters."""
    return ''.join(choice(ascii_letters) for _ in range(n))


def main():
    info = pg.display.Info()
    screen = pg.display.set_mode((info.current_w, info.current_h), pg.FULLSCREEN)
    screen_rect = screen.get_rect()
    font = pg.font.Font(None, 45)
    clock = pg.time.Clock()
    color = (randrange(256), randrange(256), randrange(256))
    txt = font.render(random_letters(randrange(5, 21)), True, color)
    timer = 10
    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    done = True

        timer -= 1
        # Update the text surface and color every 10 frames.
        if timer <= 0:
            timer = 10
            color = (randrange(256), randrange(256), randrange(256))
            txt = font.render(random_letters(randrange(5, 21)), True, color)

        screen.fill((30, 30, 30))
        screen.blit(txt, txt.get_rect(center=screen_rect.center))

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()
    sys.exit()
  • 1
    Это действительно здорово. Мало того, что он делает то, что мне нужно, но я думаю, что я в целом понимаю, как это работает :) Супер полезно - спасибо!
3

Вы можете легко сделать это с помощью Tkinter, который входит в большинство современных Python-инсталляций. Например,

import tkinter as tk
from random import seed, choice
from string import ascii_letters

seed(42)

colors = ('red', 'yellow', 'green', 'cyan', 'blue', 'magenta')
def do_stuff():
    s = ''.join([choice(ascii_letters) for i in range(10)])
    color = choice(colors)
    l.config(text=s, fg=color)
    root.after(100, do_stuff)

root = tk.Tk()
root.wm_overrideredirect(True)
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
root.bind("<Button-1>", lambda evt: root.destroy())

l = tk.Label(text='', font=("Helvetica", 60))
l.pack(expand=True)

do_stuff()
root.mainloop()

Нажмите левой кнопкой мыши, чтобы выйти.

Это просто доказательство концепции. Чтобы управлять цветом и/или шрифтом по буквам, вам нужно сделать что-то более сложное. Вы можете использовать ряд виджетов Label (по одному для каждой буквы) или использовать виджет Text.


Однако, если вы попробуете это на Mac, окно может не получить фокус, как упоминалось здесь. В ответах здесь показан альтернативный способ получить полноэкранное окно, но я подозреваю, что он может пострадать от одного и того же дефекта.

root.attributes("-fullscreen", True)

Одним из преимуществ этого подхода является то, что он не требует вызова root.geometry.

  • 0
    Это заставляет меня двигаться. Отлично - спасибо! Я потратил очень много времени на эту проблему :)
  • 0
    @DarinBoville Если мой ответ помог вам, пожалуйста , рассмотреть вопрос принятия его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню