2017-08-01 938 views
1

我一直在谷歌搜索,并通过StackOverflow寻找,但没有运气...在Python屏幕上显示文本的简单方法?

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

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

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

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

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

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

pygame是我最好的选择(易于在Python编程,高速)为我的需要还是有其他库更适合我后?

如果pygame是正确的方向任何人都可以建议示例代码,将让我走?

感谢,

--Darin

+0

示例代码适用于我和您正在寻找的几乎所有东西。你安装了pygame吗?在命令行中运行'pip install pygame'。 Pygame可能不是最好的选择,但它对你正在尝试做的事很好。 – Milk

+0

这里没有运气。也许我的pygame安装不正确? (虽然它运行了与它一起出现的太空入侵者类型测试游戏)... @PM 2Ring的Tkinter代码运行良好 - 我想我会沿着这条路走下去,看看它在哪里。谢谢! –

回答

0

这是一个pygame解决方案。只需将随机字母和颜色传递到Font.render,然后blit返回的表面。为了居中它,我将txt表面的get_rect方法称为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

这真的很棒。它不仅做我需要做的事情,但我想我通常理解它是如何工作的:)超级有用 - 谢谢! –

2

您可以轻松地做到这样的事情有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电话。

+0

这让我走了。优秀 - 感谢!我在这个问题上花了很多时间:) –

+0

@DarinBoville如果我的回答对你有帮助,请考虑[接受](http://meta.stackexchange.com/a/5235)它。 –