【问题标题】:Refresh image in Tkinter window在 Tkinter 窗口中刷新图像
【发布时间】:2016-03-31 12:54:59
【问题描述】:

我正在构建一个应用程序来连续显示从 IP 摄像机获取的图像。我已经弄清楚如何获取图像,以及如何使用 Tkinter 显示图像。但我无法让它不断刷新图像。使用 Python 2.7+。

这是我目前的代码。

import urllib2, base64
from PIL import Image,ImageTk
import StringIO
import Tkinter

URL = 'http://myurl.cgi'
USERNAME = 'myusername'
PASSWORD = 'mypassword'

def fetch_image(url,username,password):
    # this code works fine
    request = urllib2.Request(url)
    base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
    request.add_header("Authorization", "Basic %s" % base64string)   
    result = urllib2.urlopen(request)
    imgresp = result.read()
    img = Image.open(StringIO.StringIO(imgresp))
    return img

root = Tkinter.Tk()
img = fetch_image(URL,USERNAME,PASSWORD)
tkimg = ImageTk.PhotoImage(img)
Tkinter.Label(root,image=tkimg).pack()
root.mainloop()

我应该如何编辑代码以便重复调用 fetch_image 并在 Tkinter 窗口中更新其输出?

请注意,我没有使用任何按钮事件来触发图像刷新,而是应该自动刷新,例如每 1 秒一次。

【问题讨论】:

    标签: image python-2.7 tkinter refresh


    【解决方案1】:

    这是一个使用 Tkinter 的 Tk.after 函数的解决方案,该函数安排未来对函数的调用。如果您将 fetch_image 定义之后的所有内容替换为下面的片段,您将获得您所描述的行为:

    root = Tkinter.Tk()
    label = Tkinter.Label(root)
    label.pack()
    img = None
    tkimg = [None]  # This, or something like it, is necessary because if you do not keep a reference to PhotoImage instances, they get garbage collected.
    
    delay = 500   # in milliseconds
    def loopCapture():
        print "capturing"
    #    img = fetch_image(URL,USERNAME,PASSWORD)
        img = Image.new('1', (100, 100), 0)
        tkimg[0] = ImageTk.PhotoImage(img)
        label.config(image=tkimg[0])
        root.update_idletasks()
        root.after(delay, loopCapture)
    
    loopCapture()
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 2020-04-14
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2017-04-24
      相关资源
      最近更新 更多