【问题标题】:Simple way to display text on screen in Python?在 Python 中在屏幕上显示文本的简单方法?
【发布时间】:2018-01-07 16:56:44
【问题描述】:

我一直在谷歌上搜索并查看 StackOverflow,但没有运气......

我想要在屏幕(不是控制台)上显示我正在开发的艺术项目的文本。字符串将全屏显示——边缘到边缘的“窗口”,没有菜单栏等。字符串将快速更新(想象一串随机字母以计算机允许的速度显示和重绘)。字体和颜色的选择(逐个字母)将是很大的好处。

字符串将在屏幕上居中(不滚动)。

我是编程新手。在屏幕上显示文本似乎比我预期的要复杂得多。 :)

我遇到过使用 pygame 的解决方案,但示例代码不起作用。这是一个典型的例子:

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

我在 Mac 上看到的是一个没有文本的窗口打开,代码继续无限期地运行。我遇到的其他代码和其他库的类似经历。

pygame 是我的最佳选择(易于使用 Python 编程,速度快),还是有其他库更适合我的需求?

如果 pygame 是正确的方向,任何人都可以建议让我继续前进的示例代码吗?

谢谢,

--达林

【问题讨论】:

  • 示例代码适用于我,几乎是您正在寻找的。你安装了pygame吗?在命令行中运行 pip install pygame。 Pygame 可能不是 最佳 选择,但它适合您尝试做的事情。
  • 运气不好。也许我的 pygame 安装不正确? (虽然它运行了随附的太空入侵者类型测试游戏)...@PM 2Ring 的 Tkinter 代码运行良好——我想我会沿着这条路走下去,看看它会把我带到哪里。谢谢!

标签: python text pygame


【解决方案1】:

您可以使用 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 上尝试此操作,则窗口可能无法获得焦点,如 here 所述。答案here 显示了获得全屏窗口的另一种方法,但我怀疑它可能会遇到同样的缺陷。

root.attributes("-fullscreen", True)

这种方法的一个优点是它不需要root.geometry 调用。

【讨论】:

  • 这让我继续前进。太棒了——谢谢!我在这个问题上花了很多时间:)
【解决方案2】:

这是一个 pygame 解决方案。只需将随机字母和颜色传递给Font.render,然后对返回的表面进行 blit。为了使其居中,我调用txt 表面的get_rect 方法并将screen_rect 的中心作为center 参数传递。请注意,您不能为每个字母选择不同的颜色。为此,您可能需要渲染几个“单字母”表面,然后将它们组合起来。

癫痫警告 - 文本变化非常快(每帧 (30 fps)),我不确定这是否会导致癫痫发作,所以我添加了一个计时器来更新文本仅每 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()

【讨论】:

  • 这真的很棒。它不仅可以完成我需要做的事情,而且我认为我大致了解它是如何工作的 :) 非常有帮助——谢谢!
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多