Добавление прямых в список для отображения в 7-сегментных цифрах в pygame

#python #python-3.x #pygame

Вопрос:

У меня было два файла python, один для всех данных, которые были сделаны ранее, а другой файл функций для правильного отображения данных на экране с помощью pygame.

—Функционирование—

Моя идея заключается в том,что отображение сегментов названо в алфавитном порядке A,B,C,D,E,F, G Пожалуйста, обратитесь к этому изображению

Вот, до сих пор каждый сегмент отображается, но если вы видите в моих data.py кода Вы можете видеть, есть словарь под названием ‘final_data’, где каждая цифра имеет двоичный код, который означает просто «сколько отрезков пришлось светиться…» Примечание:- ‘1’ означает, светиться и » 0 » означает, чтобы не светиться, можно сказать, что эти кнопки. каждая кнопка имеет список [x,y,ширина,высота] для отображения на экране. Я также даю двоичные файлы и их позиции. Словарь работает правильно проблема в его реализации в моем втором файле ‘functions.py».

Код

Мой первый файл-это data.py и код таков……

 nums = (0,1,2,3,4,5,6,7,8,9)

binaries = ([1,1,1,1,1,1,0],[1,1,0,0,0,0,0],[1,0,1,1,0,1,1],[1,1,1,0,0,1,1],
[1,1,0,0,1,0,1],[0,1,1,0,1,1,1],[0,1,1,1,1,0,1],[1,1,0,0,0,1,0],[1,1,1,1,1,1,1],[1,1,1,0,1,1,1])

positions = ([200,110,10,50],[200,170,10,50],[150,220,50,10],[140,170,10,50],[140,110,10,50],[150,100,50,10],[150,160,50,10])


final_data = {'0':{"1": [[200, 110, 10, 50], [200, 170, 10, 50], [150, 220, 50, 10], [140, 170, 10, 50], [140, 110, 10, 50], [150, 100, 50, 10]], "0": [[150, 160, 50, 10]]},
'1':{"1": [[200, 110, 10, 50], [200, 170, 10, 50]], "0": [[150, 220, 50, 10], [140, 170, 10, 50], [140, 110, 10, 50], [150, 100, 50, 10], [150, 160, 50, 10]]},
'2':{"1": [[200, 110, 10, 50], [150, 220, 50, 10], [140, 170, 10, 50], [150, 100, 50, 10], [150, 160, 50, 10]], "0": [[200, 170, 10, 50], [140, 110, 10, 50]]},
'3':{"1": [[200, 110, 10, 50], [200, 170, 10, 50], [150, 220, 50, 10], [150, 100, 50, 10], [150, 160, 50, 10]], "0": [[140, 170, 10, 50], [140, 110, 10, 50]]},
'4':{"1": [[200, 110, 10, 50], [200, 170, 10, 50], [140, 110, 10, 50], [150, 160, 50, 10]], "0": [[150, 220, 50, 10], [140, 170, 10, 50], [150, 100, 50, 10]]},
'5':{"1": [[200, 170, 10, 50], [150, 220, 50, 10], [140, 110, 10, 50], [150, 100, 50, 10], [150, 160, 50, 10]],"0": [[200, 110, 10, 50], [140, 170, 10, 50]]},
'6':{"1": [[200, 170, 10, 50], [150, 220, 50, 10], [140, 170, 10, 50], [140, 110, 10, 50], [150, 160, 50, 10]],"0": [[200, 110, 10, 50], [150, 100, 50, 10]]},
'7':{"1": [[200, 110, 10, 50], [200, 170, 10, 50], [150, 100, 50, 10]], "0": [[150, 220, 50, 10], [140, 170, 10, 50], [140, 110, 10, 50], [150, 160, 50, 10]]},
'8':{"1": [[200, 110, 10, 50], [200, 170, 10, 50], [150, 220, 50, 10], [140, 170, 10, 50], [140, 110, 10, 50], [150, 100, 50, 10], [150, 160, 50, 10]]},
'9':{"1": [[200, 110, 10, 50], [200, 170, 10, 50], [150, 220, 50, 10], [140, 110, 10, 50], [150, 100, 50, 10], [150, 160, 50, 10]], "0": [[140, 170, 10, 50]]}
}

"""
A,B,C,D,E,F,G
1,1,1,1,1,1,0
1,1,0,0,0,0,0
1,0,1,1,0,1,1
1,1,1,0,0,1,1
1,1,0,0,1,0,1
0,1,1,0,1,1,1
0,1,1,1,1,0,1
1,1,0,0,0,1,0
1,1,1,1,1,1,1
1,1,1,0,1,1,1
"""
 

Мое второе досье functions.py

 import pygame, sys
pygame.init()

size = width,height = 400,400
running = True
segments = []
screen = pygame.display.set_mode(size)

def draw_rect(x,y,width,height):
    pygame.draw.rect(screen,(0,0,0),(x,y,width,height))

def digits():
    #A
    draw_rect(200,110,10,50)
    #B
    draw_rect(200,170,10,50)
    #C
    draw_rect(150,220,50,10)
    #D
    draw_rect(140,170,10,50)
    #E
    draw_rect(140,110,10,50)
    #F
    draw_rect(150,100,50,10)
    #G
    draw_rect(150,160,50,10)



while running:
    screen.fill((148,241,251))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    key = pygame.key.get_pressed()
    if key[pygame.K_q]:
        run = False
        sys.exit()

    digits()
    pygame.display.update()

 

**пожалуйста, скажите мне в комментариях, нравится ли вам моя идея? и является ли формат задаваемого вопроса правильным. **

Комментарии:

1. @Rabbid76 Спасибо за редактирование вопроса

Ответ №1:

Тебе final_data это совсем не нужно. Просто напишите функцию draw_digit :

 def draw_digit(surf, color, i):
    for j, on in enumerate(binaries[i]):
        if on:
            pygame.draw.rect(surf, color, positions[j])
 

И назови это так:

 draw_digit(screen, "black", 0)
 

Добавьте дополнительный offset аргумент для отображения нескольких цифр в строке:

 def draw_digit(surf, color, offset, i):
    for j, on in enumerate(binaries[i]):
        if on:
            pygame.draw.rect(surf, color, pygame.Rect(positions[j]).move(offset, 0))
 
 draw_digit(screen, "black", 0, 2)
draw_digit(screen, "black", 100, 3)
 


Минимальный пример:

repl.it/@Rabbid76/PyGame-7SegementDisplay

data.py

 binaries = ([1,1,1,1,1,1,0],[1,1,0,0,0,0,0],[1,0,1,1,0,1,1],[1,1,1,0,0,1,1],
[1,1,0,0,1,0,1],[0,1,1,0,1,1,1],[0,1,1,1,1,0,1],[1,1,0,0,0,1,0],[1,1,1,1,1,1,1],[1,1,1,0,1,1,1])

positions = ([200,110,10,50],[200,170,10,50],[150,220,50,10],[140,170,10,50],[140,110,10,50],[150,100,50,10],[150,160,50,10])
 

functions.py

 import pygame, sys
from data import *

pygame.init()

size = width,height = 400,400
run = True
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()

def draw_digit(surf, color, offset, i):
    for j, on in enumerate(binaries[i]):
        if on:
            pygame.draw.rect(surf, color, pygame.Rect(positions[j]).move(offset, 0))

count = 0  
while run:
    clock.tick(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    screen.fill((148,241,251))
    draw_digit(screen, "black", 0, count // 10)
    draw_digit(screen, "black", 100, count % 10)
    count  = 1
    if count >= 100:
        count = 0
    pygame.display.update()