用Python在屏幕上显示文本的简单方法?

用Python在屏幕上显示文本的简单方法?,python,text,pygame,Python,Text,Pygame,我一直在谷歌上搜索StackOverflow,但没有运气 我想为我正在开发的艺术项目在屏幕上显示文本(而不是控制台)。字符串将以全屏显示——边到边的“窗口”不带菜单栏等。字符串将快速更新(想象一个随机字母字符串以计算机允许的速度显示和重画)。字体和颜色的选择(以字母为基础)将是巨大的奖金 字符串将在屏幕上居中(不滚动) 我是编程新手。在屏幕上显示文本似乎比我想象的要复杂得多。:) 我遇到过使用pygame的解决方案,但示例代码不起作用。下面是一个典型的例子: 我在Mac上看到的是一个没有文本的

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

我想为我正在开发的艺术项目在屏幕上显示文本(而不是控制台)。字符串将以全屏显示——边到边的“窗口”不带菜单栏等。字符串将快速更新(想象一个随机字母字符串以计算机允许的速度显示和重画)。字体和颜色的选择(以字母为基础)将是巨大的奖金

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

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

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

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

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

如果pygame是一个正确的方向,那么有人能推荐一些示例代码来帮助我吗

谢谢


--Darin

您可以使用Tkinter轻松完成这类工作,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()

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

您可以使用Tkinter轻松完成这类工作,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()

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

这里是一个pygame解决方案。只需将随机字母和颜色传递到返回的曲面,然后blit。要使其居中,我调用
txt
曲面的
get_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()
导入系统 从随机导入选择,随机范围 从字符串导入ascii_字母 导入pygame作为pg def随机字母(n): “”“随机选取n个字母。”“” 返回“”。范围(n)内的u的联接(选择(ascii字母)) def main(): info=pg.display.info() 屏幕=pg.display.set_模式((info.current_w,info.current_h),pg.FULLSCREEN) screen\u rect=screen.get\u rect() font=pg.font.font(无,45) 时钟=pg.time.clock() 颜色=(随机范围(256)、随机范围(256)、随机范围(256)) txt=font.render(随机字母(随机范围(5,21)),真,彩色) 计时器=10 完成=错误 虽然没有这样做: 对于pg.event.get()中的事件: 如果event.type==pg.KEYDOWN: 如果event.key==pg.K_转义: 完成=正确 计时器-=1 #每10帧更新一次文本表面和颜色。
如果计时器这里有一个pygame解决方案。只需将随机字母和颜色传递到返回的曲面,然后blit。要使其居中,我调用
txt
曲面的
get_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()
导入系统 从随机导入选择,随机范围 从字符串导入ascii_字母 导入pygame作为pg def随机字母(n): “”“随机选取n个字母。”“” 返回“”。范围(n)内的u的联接(选择(ascii字母)) def main(): info=pg.display.info() 屏幕=pg.display.set_模式((info.current_w,info.current_h),pg.FULLSCREEN) screen\u rect=screen.get\u rect() font=pg.font.font(无,45) 时钟=pg.time.clock() 颜色=(随机范围(256)、随机范围(256)、随机范围(256)) txt=font.render(随机字母(随机范围(5,21)),真,彩色) 计时器=10 完成=错误 虽然没有这样做: 对于pg.event.get()中的事件: 如果event.type==pg.KEYDOWN: 如果event.key==pg.K_转义: 完成=正确 计时器-=1 #每10帧更新一次文本表面和颜色。
如果定时器的样本代码为我工作,几乎什么你正在寻找。你安装了pygame吗?在命令行中运行
pip安装pygame
。Pygame可能不是最好的选择,但它适合你正在尝试做的事情。这里没有运气。也许我的pygame安装不正确?(尽管它运行了附带的太空入侵者类型测试游戏)@PM 2Ring的Tkinter代码运行良好——我想我会沿着这条路走下去,看看它会把我带到哪里。谢谢示例代码适用于我和您正在寻找的内容。你安装了pygame吗?在命令行中运行
pip安装pygame
。Pygame可能不是最好的选择,但它适合你正在尝试做的事情。这里没有运气。也许我的pygame安装不正确?(尽管它运行了附带的太空入侵者类型测试游戏)@PM 2Ring的Tkinter代码运行良好——我想我会沿着这条路走下去,看看它会把我带到哪里。谢谢这让我走了。非常好,谢谢!我在这个问题上花了很多时间:)这让我很兴奋。非常好,谢谢!我花了一大笔钱