为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

鸿蒙传说 2022-06-28 15:35:10
我有一个带有幻灯片和名为“df_slides”的文本的熊猫数据库。我想制作一个 tkinter GUI 来单击幻灯片并显示文本,如下所示:这是我迄今为止实施的:import tkinterfrom PIL import Image, ImageTkimport base64import pandas as pdi = 0def 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()这是当前的结果:如您所见,文本没有使用全宽,更重要的是,当我按“下一步”和“返回”时,它不会与幻灯片一起更新。幻灯片会更新,但文本始终保持不变。
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

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为Ttext_box


查看完整回答
反对 回复 2022-06-28
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号