使用StringVar的Tkinter文件名

时间:2015-04-16 00:01:03

标签: python-3.x tkinter raspberry-pi

我在tkinter环境中设置文件名时遇到问题(覆盆子上的python 3.2)。为了说明我的意思,我将使用我的代码:

from tkinter import Tk, Canvas, StringVar
from PIL import ImageTk, Image
from threading import Thread

class proc(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run(self):
        self.root=tkinter.Tk()
        self.labelstring = StringVar()
        self.labelstring.set('Foo')

        self.path = StringVar()
        self.path.set('cold.jpg')

        canvas = Canvas(self.root, width=888, height=600)
        canvas.pack()

        im = Image.open(self.path) #<-- does not work
        canvas.image = ImageTk.PhotoImage(im)
        canvas.create_image(0, 0, image=canvas.image, anchor='nw')

        label = tkinter.Label(self.root,textvariable=self.labelstring)
        label.pack()
        self.root.mainloop()


app = proc()
app.start()


for i in range(0, 10):
    time.sleep(5)
    proc.labelstring.set(i)

我更改标签labelstring.set(i)的部分工作正常,但不起作用的是通过path.set('image.jpg')发送文件名。我知道,文件类型不是这样的路径,它是一个tkinter.StringVar对象......我没有找到一个很好的方法使它成为一个路径变量。

在一天结束时

im = Image.open(self.path)
canvas.image = ImageTk.PhotoImage(im)
canvas.create_image(0, 0, image=canvas.image, anchor='nw')
无法使用先前定义的self.path.set('image.jpg')调用

。我想要一个xy图片列表,然后path.set(piclist[i])更改tkinter.canvas中的图像。

1 个答案:

答案 0 :(得分:0)

我不知道你想要实现什么,以及为什么在这里使用Threads。你的代码有一些不一致,缺少import语句等。因此,我简化了它,以便我可以运行它,只关注你指定的行。简化版本是:

from tkinter import Tk, Canvas, StringVar, Label
from PIL import ImageTk, Image
from threading import Thread

class proc():
    def __init__(self):
        pass
       # Thread.__init__(self)

    def run(self):
        self.root=Tk()
        self.labelstring = StringVar()
        self.labelstring.set('Foo')

        self.path = StringVar()
        self.path.set('empty.gif')

        canvas = Canvas(self.root, width=888, height=600)
        canvas.pack()

        im = Image.open(self.path.get()) #<-- does not work
        canvas.image = ImageTk.PhotoImage(im)
        canvas.create_image(0, 0, image=canvas.image, anchor='nw')

        label = Label(self.root,textvariable=self.labelstring)
        label.pack()
        self.root.mainloop()


app = proc()
app.run()

专注于不起作用的行,在你的例子中你有:

im = Image.open(self.path)

但你应该按照以下方式获取文件的路径(如我的例子所示):

im = Image.open(self.path.get())