绑定到Entry的StringVar不会更新Entry值

时间:2014-01-30 20:29:34

标签: python python-3.x tkinter

我从Python和Tkinter开始使用GUI,并希望创建一个小窗口,从文件中加载图像并显示文件的路径以及图像。到现在为止,我已经有了我的窗口和按钮来选择图像( tkinter.filedialog.askopenfilename ),但我正在尝试更新应该的条目使用 tkinter.StringVar 显示路径。 StringVar的值正在变化,但不会更改条目中显示的值。

框架代码:

import tkinter as tk
import tkinter.filedialog as tkf

class ImageViewer(tk.Frame):

    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.master.title("Image Viewer")
        self.drawButtons()
        self.grid()

    def drawButtons(self):
        self.lblfilename = tk.Label(self, text="Image: ")
        self.lblfilename.grid(padx=1, column=0, row=0, sticky=tk.N+tk.E+tk.S+tk.W)
        self.eText = tk.StringVar()
        self.eText.set("")
        self.filenametext = tk.Entry(self, background='#fff', width=65, textvariable=self.eText)
        self.filenametext.grid(padx=10, column=1, row=0, columnspan=2, sticky=tk.N+tk.E+tk.S+tk.W)
        self.pickerbut = tk.Button(self, text="Load", command=self.picker)
        self.pickerbut.grid(column=3, row=0, sticky=tk.N + tk.S + tk.W)
        self.image = tk.Canvas(self, height=480, width=640)
        self.image.grid(padx=10, pady=5, column=0, row=1, columnspan=4, rowspan=3)
        self.cancelbut = tk.Button(self, text="Exit", command=self.cancel)
        self.cancelbut.grid(column=3, row=4, sticky=tk.N + tk.W + tk.S)

    def picker(self):
        self.imgpicker = tkf.askopenfilename(parent=self)
        self.eText.set(self.imgpicker)
        print(self.eText.get())

    def cancel(self):
        self.master.destroy()

主要

if __name__ == "__main__":
    imageviewerbutton = tk.Tk()
    imageviewerbutton.geometry('660x550+100+90')
    ImageViewer(imageviewerbutton)
    imageviewerbutton.mainloop()

当我使用 self.eText.get()打印 self.eText 的值时,它会显示正确的图像路径,但我的条目仍为空。

在我看来,当绑定StringVar和Entry时出现任何问题,虽然我已经在互联网上搜索并尝试了我想到的一切,但我没有找到解决方案。

有人能给我一个暗示吗?

1 个答案:

答案 0 :(得分:0)

我没有可以测试它的python3实例,但它似乎在python 2.7上运行正常。

您是否意识到您不需要将StringVar与条目小部件一起使用?在我看来,你几乎不需要一个。您可以在没有它的情况下获取和设置条目的值。

例如:

self.imgpicker = tkf.askopenfilename(parent=self)
self.filenametext.delete(0, "end")
self.filenametext.insert(0, self.imgpicker)