Pygame: 适应屏幕宽度和高度

Pygame: fit data into screen width and height

我正在尝试构建一个客户端-服务器应用程序,其中客户端从服务器请求一些关于文件、目录、网络等的信息。问题是,当我尝试加载文件和目录的名称以及它们的相关信息时,出现以下错误:

texto1 = font.render(''+str(files_info), True, verde, preto)
pygame.error: Width or height is too large

这并不奇怪,因为我正在一个非常拥挤的文件夹中测试这个应用程序。我还必须加载 PID 列表及其名称和 CPU 用法,它们很长。我的问题是:如何使大量信息适合 Pygame 屏幕?考虑过可能使用多个表面来执行此操作,例如尝试创建一个“下一步”按钮,但我不知道该怎么做。

服务器端:

import socket, psutil, pickle, os, time, datetime, cpuinfo


def mostra_uso_cpu_e_ram(socket_cliente):
    info1 =('Usuario solicitou Informações de uso de processamento e Memória')
    resposta = []
    cpu = ('Porcentagem: ',psutil.cpu_percent())
    resposta.append(cpu)
    resposta.append(cpuinfo.get_cpu_info()['brand'])
    resposta.append(cpuinfo.get_cpu_info()['arch'])
    resposta.append(cpuinfo.get_cpu_info()['bits'])
    resposta.append(cpuinfo.get_cpu_info()['hz_actual'])
    resposta.append(psutil.cpu_freq()[0])
    resposta.append(psutil.disk_usage('/')[3])
    mem = psutil.virtual_memory()
    mem_percent = mem.used/mem.total
    resposta.append(mem_percent)
    bytes_resp = pickle.dumps(resposta)
    socket_cliente.send(bytes_resp)
    print(info1)


def arquivos_diretorios(socket_cliente):
    info2 = ('\nUsuario solicitou Informações sobre arquivos e diretórios')
    info2 += ('\n\n-------------------------------------------------------\n\n INFORMAÇÕES SOBRE DIRETÓRIOS E ARQUIVOS\n')
    socket_cliente.send(info2.encode('utf-8'))
    
    lista_send = []
    caminho = os.getcwd()
    lista_send.append(caminho)
    caminho = pickle.dumps(lista_send)
    socket_cliente.send(caminho)
    
    lista_arquivos = []
    for a in os.listdir("."):
        if os.path.isdir(a):
            pathname = 'd %s' % a
            lista_arquivos.append(pathname)
            statinfo = os.stat(a)
            data_criacao = datetime.datetime.fromtimestamp(statinfo.st_ctime)
            data_acesso = datetime.datetime.fromtimestamp(statinfo.st_atime)
            data_modificacao = datetime.datetime.fromtimestamp(statinfo.st_mtime)
            size = os.path.getsize(a)
            criacao = 'Data de Criação: {}'.format(data_criacao)
            lista_arquivos.append(criacao)
            acesso = 'Data do Acesso mais recente: {}'.format(data_acesso)
            lista_arquivos.append(acesso)
            modificacao = 'Data da última modificação: {}'.format(data_modificacao)
            lista_arquivos.append(modificacao)
            tamanho = 'Tamanho do diretório em bytes: {}'.format(size)
            lista_arquivos.append(tamanho)
        elif os.path.isfile(a):
            pathname = '- %s' % a
            lista_arquivos.append(pathname)
            statinfo = os.stat(a)
            data_criacao = datetime.datetime.fromtimestamp(statinfo.st_ctime)
            data_acesso = datetime.datetime.fromtimestamp(statinfo.st_atime)
            data_modificacao = datetime.datetime.fromtimestamp(statinfo.st_mtime)
            size = statinfo.st_size
            criacao = 'Data de Criação: {}'.format(data_criacao)
            lista_arquivos.append(criacao)
            acesso = 'Data do Acesso mais recente: {}'.format(data_acesso)
            lista_arquivos.append(acesso)
            modificacao = 'Data da última modificação: {}'.format(data_modificacao)
            lista_arquivos.append(modificacao)
            tamanho = 'Tamanho do arquivo em bytes: {}'.format(size)
            lista_arquivos.append(tamanho)
    arq_dir = pickle.dumps(lista_arquivos)
    socket_cliente.send(arq_dir)

def processos_ativos(socket_cliente):
    info3 = ('\nUsuario solicitou Informações sobre processos ativos')
    info3 += ('\n\n-------------------------------------------------------\n\n INFORMAÇÕES SOBRE PROCESSOS EM ANDAMENTO\n')
    info3 += ('\n\n*** Lista de processos em andamento no servidor ***\n\n')
    socket_cliente.send(info3.encode('utf-8'))
    
    listOfProcessNames = []

    for proc in psutil.process_iter():

        pInfoDict = proc.as_dict(attrs=['pid', 'name', 'cpu_percent'])

        listOfProcessNames.append(pInfoDict)

    proc_info = pickle.dumps(listOfProcessNames)
    socket_cliente.send(proc_info)

socket_servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
porta = 9999
socket_servidor.bind((host, porta))
socket_servidor.listen()
print("Servidor", host, "esperando conexão na porta", porta)
(socket_cliente,addr) = socket_servidor.accept()
print("Conectado a:", str(addr))

while True:
    mostra_uso_cpu_e_ram(socket_cliente)
    arquivos_diretorios(socket_cliente)
    processos_ativos(socket_cliente)

客户端:

import socket, time, pickle

import pygame

def imprime(l):
    texto = ''
    for i in l:
        texto = texto + '\n' + '{:>20}'.format(i)
    #print(texto)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 9999))

bytes_resp = s.recv(1024)
lista = pickle.loads(bytes_resp)


info2 = s.recv(4000)
caminho = s.recv(4000)
arq_dir = s.recv(100000)
files_info = pickle.loads(arq_dir)

info3 = s.recv(4000)
proc_info = s.recv(100000)
processos = pickle.loads(proc_info)


        

def display_slide():
    
    tela1 = True

    while tela1:
        
        tela.fill([0, 0, 0])
    
        texto1 = font.render('MENU', True, verde, preto)
        textoRect1 = texto1.get_rect()
        textoRect1.topleft=[200,25]
        tela.blit(texto1, textoRect1)
        
        textoc = font.render('1 - CPU and Memory ', True, verde, preto)
        textoRectc = textoc.get_rect()
        textoRectc.topleft=[10,100]
        tela.blit(textoc, textoRectc)
        
        texto2 = font.render('2 - Files and Directories ', True, verde, preto)
        textoRect2 = texto2.get_rect()
        textoRect2.topleft=[10,150]
        tela.blit(texto2, textoRect2)
        
        texto3 = font.render('3 - Processes: ', True, verde, preto)
        textoRect3 = texto3.get_rect()
        textoRect3.topleft=[10,200]
        tela.blit(texto3, textoRect3)
        
        texto4 = font.render('4 - Network ', True, verde, preto)
        textoRect4 = texto4.get_rect()
        textoRect4.topleft=[10,250]
        tela.blit(texto4, textoRect4)
        
        texto5 = font.render('5 - Exit ', True, verde, preto)
        textoRect5 = texto5.get_rect()
        textoRect5.topleft=[10,300]
        tela.blit(texto5, textoRect5)
        
        texto6 = font.render('Select one of the options above or press arrow right ', True, verde, preto)
        textoRect6 = texto6.get_rect()
        textoRect6.topleft=[10,350]
        tela.blit(texto6, textoRect6)
    
        pygame.display.flip()
    
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    tela1 = False
                    tela2 = True
                else:
                    if event.key == pygame.K_1:
                        tela1 = False
                        tela2 = True

    while tela2:
        
        tela.fill([0, 0, 0])
        
        titulo = font.render('CPU and Memory Usage: ', True, verde, preto)
        textoRect0 = titulo.get_rect()
        textoRect0.topleft=[300,10]
        tela.blit(titulo, textoRect0)
        
        texto1 = font.render(''+str(lista), True, verde, preto)
        textoRect1 = texto1.get_rect()
        textoRect1.topleft=[10,30]
        tela.blit(texto1, textoRect1)
        
        
        pygame.display.flip()
    
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    tela2 = False
                    tela1 = True
                elif event.key == pygame.K_RIGHT:
                    tela2 = False
                    tela3 = True
    while tela3:
                        
        tela.fill([0, 0, 0])
        
        texto = font.render('Files and Directories: ', True, verde, preto)
        textoRect = texto.get_rect()
        textoRect.topleft=[10,5]
        tela.blit(texto, textoRect)
                        
        texto2 = font.render(''+str(files_info), True, verde, preto)
        textoRect2 = texto2.get_rect()
        textoRect2.topleft=[10,95]
        tela.blit(texto2, textoRect2)
                        
    
        pygame.display.flip()
        
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    tela2 = True
                    tela3 = False

pygame.init()

largura_tela = 800
altura_tela = 800
tela = pygame.display.set_mode((largura_tela, altura_tela))
background = pygame.Surface(tela.get_size())
tela.blit(background, (0,0))
pygame.display.set_caption('Monitoramento e Análise do Sistema')
tela.fill([0, 0, 0])

verde = (0, 255, 0)
preto = (0, 0, 0)
cinza = (128, 128, 128, 255)

font = pygame.font.Font(None, 24)

terminou = False

while not terminou:

    display_slide()
    
    pygame.display.update()

pygame.display.quit()

pygame.quit()

需要呈现的大量文本之一的示例(并且 pygame 由于某种原因将其转换为元组)

['- Port.py', 'Data de Criação: 2020-07-30 22:15:18.937129', 'Data do Acesso mais recente: 2020-09-07 23:23:54.694304', 'Data da última modificação: 2020-07-30 22:15:18.937129', 'Tamanho do arquivo em bytes: 451', '- TP06_AnaCarolina_MeloPereira.py', 'Data de Criação: 2020-09-07 16:09:31.861902', 'Data do Acesso mais recente: 2020-09-07 16:09:33.247105', 'Data da última modificação: 2020-09-07 16:09:31.861902', 'Tamanho do arquivo em bytes: 18679', '- TP06_AnaCarolina_MeloPereira.py.zip', 'Data de Criação: 2020-08-27 22:25:03.858477', 'Data do Acesso mais recente: 2020-08-27 22:25:03.857714', 'Data da última modificação: 2020-08-27 22:25:03.857647', 'Tamanho do arquivo em bytes: 3948', '- .DS_Store', 'Data de Criação: 2020-08-11 00:18:59.014230', 'Data do Acesso mais recente: 2020-08-11 00:18:59.014324', 'Data da última modificação: 2020-08-11 00:18:59.014230', 'Tamanho do arquivo em bytes: 10244', '- processesteste.py', 'Data de Criação: 2020-08-10 23:40:56.940639', 'Data do Acesso mais recente: 2020-09-01 21:45:05.290113', 'Data da última modificação: 2020-08-10 23:40:56.940639', 'Tamanho do arquivo em bytes: 1784', '- Teste.rtf', 'Data de Criação: 2020-07-28 22:44:07.852383', 'Data do Acesso mais recente: 2020-07-28 22:44:07.858401', 'Data da última modificação: 2020-06-22 21:05:49.444665', 'Tamanho do arquivo em bytes: 405', '- clienteteste.py', 'Data de Criação: 2020-09-08 19:45:04.342697', 'Data do Acesso mais recente: 2020-09-08 19:45:06.279300', 'Data da última modificação: 2020-09-08 19:45:04.342697', 'Tamanho do arquivo em bytes: 5586', 'd 02 - Arquitetura de Computadores, Sistemas Operacionais e Redes', 'Data de Criação: 2020-08-11 00:16:02.910568', 'Data do Acesso mais recente: 2020-08-11 00:16:04.645334', 'Data da última modificação: 2020-08-11 00:16:02.910568', 'Tamanho do diretório em bytes: 224', '- asdfghjkl.py', 'Data de Criação: 2020-08-26 23:16:08.074653', 'Data do Acesso mais recente: 2020-09-04 19:57:19.062760', 'Data da última modificação: 2020-08-26 23:16:08.074653', 'Tamanho do arquivo em bytes: 2248', '- seila.py', 'Data de Criação: 2020-08-10 23:40:59.082237', 'Data do Acesso mais recente: 2020-09-07 23:24:10.945553', 'Data da última modificação: 2020-08-10 23:40:59.082237', 'Tamanho do arquivo em bytes: 1369', '- .teste.rtf', 'Data de Criação: 2020-06-22 21:07:29.094099', 'Data do Acesso mais recente: 2020-06-22 21:07:29.094099', 'Data da última modificação: 2020-06-22 21:07:29.094099', 'Tamanho do arquivo em bytes: 0', '- servidorteste.py', 'Data de Criação: 2020-09-08 18:49:47.657584', 'Data do Acesso mais recente: 2020-09-08 18:49:49.351929', 'Data da última modificação: 2020-09-08 18:49:47.657584', 'Tamanho do arquivo em bytes: 6174', '- clientearquivo.py', 'Data de Criação: 2020-09-08 11:55:02.196598', 'Data do Acesso mais recente: 2020-09-08 11:55:04.356020', 'Data da última modificação: 2020-09-08 11:55:02.196598', 'Tamanho do arquivo em bytes: 11613', '- perproc.py', 'Data de Criação: 2020-08-17 22:07:22.857411', 'Data do Acesso mais recente: 2020-09-07 23:23:03.746201', 'Data da última modificação: 2020-08-17 22:07:22.857411', 'Tamanho do arquivo em bytes: 1070', '- servidorarquivo.py', 'Data de Criação: 2020-09-07 19:52:32.416164', 'Data do Acesso mais recente: 2020-09-07 19:52:34.320696', 'Data da última modificação: 2020-09-07 19:52:32.416164', 'Tamanho do arquivo em bytes: 6578', '- clienteTP09.py', 'Data de Criação: 2020-09-08 10:25:11.597179', 'Data do Acesso mais recente: 2020-09-08 10:25:13.191097', 'Data da última modificação: 2020-09-08 10:25:11.597179', 'Tamanho do arquivo em bytes: 2682', '- servidorTP09.py', 'Data de Criação: 2020-09-08 10:25:10.014792', 'Data do Acesso mais recente: 2020-09-08 10:25:11.691246', 'Data da última modificação: 2020-09-08 10:25:10.014792', 'Tamanho do arquivo em bytes: 9511', '- Teste2.py', 'Data de Criação: 2020-06-23 00:45:32.142930', 'Data do Acesso mais recente: 2020-07-28 22:30:01.126377', 'Data da última modificação: 2020-06-23 00:45:32.142930', 'Tamanho do arquivo em bytes: 1075', 'd 01 - Bloco de Entrada', 'Data de Criação: 2020-05-26 21:14:05.451512', 'Data do Acesso mais recente: 2020-05-26 21:14:06.713600', 'Data da última modificação: 2020-05-26 21:14:05.451512', 'Tamanho do diretório em bytes: 192', '- Teste.py', 'Data de Criação: 2020-06-22 21:58:07.500057', 'Data do Acesso mais recente: 2020-07-28 22:30:01.144316', 'Data da última modificação: 2020-06-22 21:58:07.500057', 'Tamanho do arquivo em bytes: 1330', '- servidor.py', 'Data de Criação: 2020-09-01 22:44:03.209760', 'Data do Acesso mais recente: 2020-09-01 22:44:03.211094', 'Data da última modificação: 2020-09-01 22:44:03.209760', 'Tamanho do arquivo em bytes: 857', '- Sera.py', 'Data de Criação: 2020-08-10 01:46:24.746689', 'Data do Acesso mais recente: 2020-09-07 23:24:01.534768', 'Data da última modificação: 2020-08-10 01:46:24.746689', 'Tamanho do arquivo em bytes: 2118', '- Socket.py', 'Data de Criação: 2020-08-04 15:52:59.223063', 'Data do Acesso mais recente: 2020-09-03 20:04:57.059565', 'Data da última modificação: 2020-08-04 15:52:59.223063', 'Tamanho do arquivo em bytes: 398', '- Prints.py', 'Data de Criação: 2020-06-23 19:51:50.521518', 'Data do Acesso mais recente: 2020-07-28 22:30:00.996539', 'Data da última modificação: 2020-06-23 19:51:50.521518', 'Tamanho do arquivo em bytes: 104', '- testearquivo.py', 'Data de Criação: 2020-09-06 22:49:58.351485', 'Data do Acesso mais recente: 2020-09-06 22:49:59.087386', 'Data da última modificação: 2020-09-06 22:49:58.351485', 'Tamanho do arquivo em bytes: 507', '- cliente.py', 'Data de Criação: 2020-09-01 23:17:40.626674', 'Data do Acesso mais recente: 2020-09-01 23:17:41.100185', 'Data da última modificação: 2020-09-01 23:17:40.626674', 'Tamanho do arquivo em bytes: 465']

可能您只需要稍微解析传入的数据来清理它。简单地以 5 的“步长”遍历列表就很容易了:

dir_list = ['- Port.py', 'Data de Criação: 2020-07-30 22:15:18.937129', 'Data do Acesso mais recente: 2020-09-07 23:23:54.694304', 'Data da última modificação: 2020-07-30 22:15:18.937129', 'Tamanho do arquivo em bytes: 451', '- TP06_AnaCarolina_MeloPereira.py', 'Data de Criação: 2020-09-07 16:09:31.861902', 'Data do Acesso mais recente: 2020-09-07 16:09:33.247105', 'Data da última modificação: 2020-09-07 16:09:31.861902', 'Tamanho do arquivo em bytes: 18679', '- TP06_AnaCarolina_MeloPereira.py.zip', 'Data de Criação: 2020-08-27 22:25:03.858477', 'Data do Acesso mais recente: 2020-08-27 22:25:03.857714', 'Data da última modificação: 2020-08-27 22:25:03.857647', 'Tamanho do arquivo em bytes: 3948', '- .DS_Store', 'Data de Criação: 2020-08-11 00:18:59.014230', 'Data do Acesso mais recente: 2020-08-11 00:18:59.014324', 'Data da última modificação: 2020-08-11 00:18:59.014230', 'Tamanho do arquivo em bytes: 10244' ]
print( "Filename                                   Size Last MOdified" )
for i in range( 0, len( dir_list ), 5 ):
    filename         = dir_list[ i + 0 ].strip()
    data_criação     = dir_list[ i + 1 ].split( ':', 1 )[1].strip()[ 0:19 ]  # convert to YYYY-MM-DD HH:MM:SS
    data_acesso      = dir_list[ i + 2 ].split( ':', 1 )[1].strip()[ 0:19 ]  # convert to YYYY-MM-DD HH:MM:SS
    data_modificação = dir_list[ i + 3 ].split( ':', 1 )[1].strip()[ 0:19 ]  # convert to YYYY-MM-DD HH:MM:SS
    file_size        = dir_list[ i + 4 ].split( ':', 1 )[1]

    # limited processing
    if ( filename.startswith( '- ' ) ):
        filename = filename[ 2: ]         # trim leading "- "

    file_size = int( file_size )
    print( "%-40s %6d %s" % ( filename, file_size, data_modificação ) )

这大大减少了数据的文本量,使其可以轻松绘制到 PyGame 表面上的列中。有很多 pygame 文本示例。

对我来说,上面的例子给出了:

[#] python3 ./file_show.py 
Filename                                   Size Last MOdified
Port.py                                     451 2020-07-30 22:15:18
TP06_AnaCarolina_MeloPereira.py           18679 2020-09-07 16:09:31
TP06_AnaCarolina_MeloPereira.py.zip        3948 2020-08-27 22:25:03
.DS_Store                                 10244 2020-08-11 00:18:59