Python/Tkinter图像和文本标签冲突

0 投票
1 回答
1033 浏览
提问于 2025-04-17 07:18

最近我在玩Python,想做一个图形界面(GUI),可以从CSV文件中读取数据并正确显示出来。

CSV的结构如下:

name,description,image location
steven,some guy,/res/pic/steven.gif

前两个数据应该放在文本标签里,最后一个数据用作图片。在我的代码中,我已经成功插入了图片,但一旦我也加入了文本标签,应用程序就好像陷入了无限循环。如果我把代码中的图片删掉,文本标签就能正常工作,反之亦然。

from Tkinter import *
from PIL import *
import os
import csv

#Functions 

def insertImage(guiName,picture,x,y):

    #This is the Image label insertion, delete it and Text label works
    img = PhotoImage(file=entryList[picture][2])
    preview = Label(guiName, image=img)
    preview.img = img
    preview.grid(row=x,column=y)

    #This is the Text label insertion, delete it and Image Label works        
    Name = StringVar()
    labelName = Label(mainGUI, textvariable=Name, justify=LEFT)
    Name.set(entryList[picture][2])
    labelName.pack()

global mainGUI
mainGUI = Tk()
mainGUI.geometry("500x500")
mainGUI.title('Index')

reader = csv.reader(open("res/test.csv", "rb"))
entryList = []
for row in reader:
    entryList.append( row )

#insertImage(mainGUI,entryList[1][2],1,1)
insertImage(mainGUI,1,1,1)
#insertImage(mainGUI,2,2,1)

mainGUI.mainloop()

有没有人知道可能是什么问题呢?

1 个回答

3

问题在于,你在同一个主控件(mainGUI)里同时使用了grid()pack()来放置小部件。这是行不通的,因为这两个布局管理器默认都会试图控制父控件的大小,结果就会互相争抢大小,这样会导致界面根本无法显示。

最新版本的Tk(Tkinter背后的库)如果你尝试这样做,会直接报错(终于!),所以最好的办法就是每个父控件只用一个布局管理器。(虽然有一些细节可以让你禁用布局传播,使其正常工作,但“父控件”在某些情况下可能会有点复杂,关键问题还是你一开始就做错了。)

另外,一个标签可以同时包含图片和文本;你可以查看compound选项(这个选项可以启用这种功能并控制它们的相对位置规则)。

撰写回答