Лучший Python UI Framework для простого отображения (без прямого взаимодействия) - PullRequest
0 голосов
/ 10 октября 2019

TL; DR
Как создать простой «пользовательский интерфейс» для отображения нескольких изображений («прямая трансляция») и обновить несколько ползунков, чтобы отобразить состояние приложения. В основном, как сказать пользовательскому интерфейсу: «показать это новое изображение вместо текущего» и «выделите эту не нажимаемую кнопку, чтобы показать, что она активирована».


У меня абсолютно нулевой опыт работы с пользовательским интерфейсом и графическим отображением, поэтому я не знаю, что гуглить по этому вопросу. У меня есть некоторый код на Python, который использует Raspberry Pi камеру, чтобы делать фотографии, обрабатывать их немного (фильтры) и все. У меня также есть несколько аппаратных компонентов (кнопки, джойстик) для управления этой камерой и обработки, применяемой к снимкам, например, выбор фильтра и интенсивность фильтра. Аппаратные события уже обрабатываются через основной цикл, который опрашивает контроллер кнопок / джойстика. Цикл также захватывает изображения и обрабатывает их. По сути, приложение готово.

Теперь, как лучше всего отобразить эту информацию? Какова лучшая среда Python для достижения этой цели?

Позволят ли мне PyQT или Kivy сделать это? Я хотел бы показать «прямую трансляцию», некоторую информацию о кнопке (какая кнопка была нажата, чтобы показать, какая обработка в настоящее время выполняется на изображениях) в простой симпатичной раскладке. На интерфейсе не нужно ничего нажимать, поскольку взаимодействие происходит на оборудовании.

Спасибо!

1 Ответ

0 голосов
/ 11 октября 2019

Мне действительно нравится библиотека Tkinter для этих более простых задач. Это очень похоже на Java Swing, если вы знакомы с этим. Вот пример кода, который делает почти все, что вам нужно, хотя он довольно грязный. Это должно помочь вам.

frame

Обратите внимание, что Tkinter очень сырой и не рекомендуется для более сложных задач.

import tkinter as tk
from PIL import ImageTk, Image
import time

#manipulating canvas items attributes
def change_color(canvas):
    if canvas.itemcget(label, 'fill') == 'black':
        canvas.itemconfig(label, fill='green')
    else:
        canvas.itemconfig(label, fill='black')

#changing image displayed
def change_image(canvas, current):
    if current == 1:
        canvas.itemconfig(img, image=photo2)
        return 2
    else:
        canvas.itemconfig(img, image=photo1)
        return 1

#slider gauge
def set_gauge(canvas, percentage):
    coords = canvas.coords(gaugefg)
    new_y = -2*percentage + 400
    coords[1] = new_y
    canvas.coords(gaugefg,coords)

color = 'black'
gauge = 0
delta = 10
root = tk.Tk()
#frame size and background
root.geometry('600x600')
root.configure(bg='white')
#make frame pop upfront
root.attributes("-topmost", True)

#uploading images from the same folder
photo1 = ImageTk.PhotoImage(Image.open('download.jpeg'))
photo2 = ImageTk.PhotoImage(Image.open('download1.jpeg'))
current_photo = 1

#canvas on with we'll be drawing
canvas = tk.Canvas(master=root, width=600, height=600)
#text label (xcenter,ycenter)
label = canvas.create_text(500, 500, text='Cool', fill=color, font=('purisa', 20))
#img component (xcenter, ycenter)
img = canvas.create_image(300, 300, image=photo1)
#gauge/slider = two superposed rectangles
#NOTE: (xtopleft, ytopleft, xbottomright, ybottomright)
gaugebg = canvas.create_rectangle(510, 200, 540, 400, fill='black')
gaugefg = canvas.create_rectangle(510, 300, 540, 400, fill='blue')
canvas.pack()

#Main Loop
while True:
    change_color(canvas)
    current_photo = change_image(canvas, current_photo)
    gauge += delta
    if gauge == 100 or gauge == 0:
        delta = -delta
    set_gauge(canvas, gauge)
    #update frame and canvas
    root.update()
    time.sleep(1)

Я надеюсь, что это поможет вамвыполнить то, что вам нужно. Любые вопросы просто текст.

...