我一直在谷歌搜索并查看StackOverflow但没有运气......
我想要的是在我正在开发的艺术项目中向屏幕(而不是控制台)显示文本。该字符串将以全屏显示 - 边缘到边缘“窗口”,没有菜单栏等。字符串将快速更新(想象一串随机字母显示和重绘速度与计算机允许的速度一样快)。字体和颜色的选择(以字母为单位)将是巨大的奖金。
字符串将以屏幕为中心(不滚动)。
我是编程的新手。在屏幕上显示文字似乎比我预期的要多得多。 :)
我遇到过使用pygame的解决方案,但示例代码不起作用。这是一个典型的例子:
https://www.daniweb.com/programming/software-development/code/244474/pygame-text-python
我在Mac上看到的是一个没有文字的窗口,代码继续无限期地运行。与我遇到的其他代码和其他库类似的经历。
根据我的需要,pygame是我最好的选择(在Python编程的简易性,高速度)还是有其他库更适合我的目标?
如果pygame是正确的方向,那么任何人都可以提出一些示例代码来帮我解决问题吗?
谢谢,
- 达林
答案 0 :(得分:4)
您可以使用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()
单击鼠标左键退出。
这只是一个概念证明。要在逐个字母的基础上控制颜色和/或字体,您需要做一些更复杂的事情。您可以使用一行Label小部件(每个字母一个),或者您可以使用Text小部件。
但是,如果您在Mac上尝试此操作,则窗口可能无法获得焦点,如上所述here。答案here显示了获得全屏窗口的另一种方法,但我怀疑它可能会遇到同样的缺陷。
root.attributes("-fullscreen", True)
这种方法的一个优点是它不需要root.geometry
调用。
答案 1 :(得分:1)
这是一个pygame解决方案。只需将随机字母和颜色传递给Font.render,然后将返回的曲面blit。为了使其居中,我调用get_rect
曲面的txt
方法,并将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()