Просматривайте изображения и текст с помощью графического интерфейса tkinter в Python - PullRequest
0 голосов
/ 19 октября 2019

У меня есть база данных pandas со слайдами и текстом с именем "df_slides". Я хотел бы сделать графический интерфейс пользователя tkinter, чтобы щелкать по слайдам и отображать текст, например:

enter image description here

Это то, что я реализовал до сих пор:

import tkinter
from PIL import Image, ImageTk
import base64
import pandas as pd

i = 0
def load_next_img():
    global pil_image, tk_image, i, text

    i = i+1
    base64string = df_slides["Slide_Image"][i]
    imgdata = base64.b64decode(base64string)
    pil_image =  Image.open(io.BytesIO(imgdata))
    tk_image = ImageTk.PhotoImage(pil_image)
    label['image'] = tk_image

    text = df_slides["Text"][i]



def load_previous_img():
    global pil_image, tk_image, i, text

    i = i-1
    base64string = df_slides["Slide_Image"][i]
    imgdata = base64.b64decode(base64string)
    pil_image =  Image.open(io.BytesIO(imgdata))
    tk_image = ImageTk.PhotoImage(pil_image)
    label['image'] = tk_image

    text = df_slides["Text"][i]





root = tkinter.Tk()
label = tkinter.Label(root)
label.pack(side = "bottom", fill = "both", expand = "yes")
load_next_img()

nextbutton = tkinter.Button(text="next", command=load_next_img)
nextbutton.pack()
backbutton = tkinter.Button(text="back", command=load_previous_img)
backbutton.pack()

T = tkinter.Text(root, height=10, width=30)
T.pack()
T.insert(tkinter.END, text)


root.mainloop()

Это текущий результат:

enter image description here

Как видите, текст не использует полную ширину ичто более важно, он не обновляется вместе со слайдом, когда я нажимаю «Далее» и «Назад». Слайд обновляется, но текст остается неизменным.

1 Ответ

1 голос
/ 19 октября 2019

T.insert(tkinter.END, text) должны появиться в функциях load_next_img и load_previous_img. Для меня самый простой способ - определить класс Slides, чтобы получить правильное пространство имен. Примечание для обновления метки используйте self.label.configure(image=tk_image)

Ниже приведен пример, где я закомментировал фрейм данных, но должен дать подсказку о том, как решить. Примечание, чтобы очистить текст. Я также добавил строку self.T.delete('1.0', tkinter.END)

import tkinter
from PIL import Image, ImageTk
import base64
import pandas as pd


class Slides:

    def __init__(self):
        self.text_array = ['hello there', 'good bye']
        self.pic_array = ['test_1.jpg', 'test_2.jpg']

        self.root = tkinter.Tk()

        nextbutton = tkinter.Button(text="next", command=self.load_next_img)
        nextbutton.pack()
        backbutton = tkinter.Button(text="back", command=self.load_previous_img)
        backbutton.pack()

        self.slide_image = tkinter.Label(self.root)
        self.slide_image.pack(side="bottom", fill="both", expand="yes")

        self.text_box = tkinter.Text(self.root, height=10, width=30)
        self.text_box.pack()

        self.i = -1
        self.load_next_img()

        self.root.mainloop()

    def load_next_img(self):
        self.i += 1
        # base64string = df_slides["Slide_Image"][i]
        # imgdata = base64.b64decode(base64string)
        pil_image =  Image.open(self.pic_array[self.i % 2])
        pil_image = pil_image.resize((200, 200), Image.ANTIALIAS)  # just for my convenience
        tk_image = ImageTk.PhotoImage(image=pil_image)
        self.slide_image.configure(image=tk_image)
        self.slide_image.image = tk_image

        text = self.text_array[self.i % 2]
        self.text_box.delete('1.0', tkinter.END)
        self.text_box.insert(tkinter.END, text)

    def load_previous_img(self):
        self.i -= 1
        # base64string = df_slides["Slide_Image"][i]
        # imgdata = base64.b64decode(base64string)
        pil_image = Image.open(self.pic_array[self.i % 2])
        pil_image = pil_image.resize((200, 200), Image.ANTIALIAS) # just for my convenience
        tk_image = ImageTk.PhotoImage(image=pil_image)
        self.slide_image.configure(image=tk_image)
        self.slide_image.image = tk_image

        text = self.text_array[self.i % 2]
        self.text_box.delete('1.0', tkinter.END)
        self.text_box.insert(tkinter.END, text)


def main():
    slides = Slides()


if __name__ == '__main__':
    main()

. Чтобы правильно расположить кнопки, метки и текст, я бы посоветовал использовать grid вместо pack.

PS. Я позволил себе изменить переменные label на slide_image и T на text_box

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...