在 Python 中使用 tkinter GUI 单击图像和文本

我有一个带有幻灯片和名为“df_slides”的文本的熊猫数据库。我想制作一个 tkinter GUI 来单击幻灯片并显示文本,如下所示:

http://img3.mukewang.com/62baaf430001e6a110060691.jpg

这是我迄今为止实施的:


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()

这是当前的结果:

http://img3.mukewang.com/62baaf500001dd1809230657.jpg

如您所见,文本没有使用全宽,更重要的是,当我按“下一步”和“返回”时,它不会与幻灯片一起更新。幻灯片会更新,但文本始终保持不变。



鸿蒙传说
浏览 139回答 1
1回答

qq_遁去的一_1

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 tkinterfrom PIL import Image, ImageTkimport base64import pandas as pdclass 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为Ttext_box
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python