Pygame:让数据适合屏幕的宽度和高度

问题描述

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

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,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])
    
        texto1 = font.render('MENU',preto)
        textoRect1 = texto1.get_rect()
        textoRect1.topleft=[200,25]
        tela.blit(texto1,textoRect1)
        
        textoc = font.render('1 - cpu and Memory ',preto)
        textoRectc = textoc.get_rect()
        textoRectc.topleft=[10,100]
        tela.blit(textoc,textoRectc)
        
        texto2 = font.render('2 - Files and Directories ',preto)
        textoRect2 = texto2.get_rect()
        textoRect2.topleft=[10,150]
        tela.blit(texto2,textoRect2)
        
        texto3 = font.render('3 - Processes: ',preto)
        textoRect3 = texto3.get_rect()
        textoRect3.topleft=[10,200]
        tela.blit(texto3,textoRect3)
        
        texto4 = font.render('4 - Network ',preto)
        textoRect4 = texto4.get_rect()
        textoRect4.topleft=[10,250]
        tela.blit(texto4,textoRect4)
        
        texto5 = font.render('5 - Exit ',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 ',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])
        
        titulo = font.render('cpu and Memory Usage: ',preto)
        textoRect0 = titulo.get_rect()
        textoRect0.topleft=[300,10]
        tela.blit(titulo,textoRect0)
        
        texto1 = font.render(''+str(lista),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])
        
        texto = font.render('Files and Directories: ',preto)
        textoRect = texto.get_rect()
        textoRect.topleft=[10,5]
        tela.blit(texto,textoRect)
                        
        texto2 = font.render(''+str(files_info),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])

verde = (0,255,0)
preto = (0,0)
cinza = (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