python tkinter刷新界面_在Tkinter窗口中刷新图像

1586010002-jmsa.png

I am building an application to continuously display an image fetched from an IP camera. I have figured out how to fetch the image, and how to also display the image using Tkinter. But I cannot get it to continuously refresh the image. Using Python 2.7+.

Here is the code I have so far.

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()

How should I edit the code so that the fetch_image is called repeatedly and its output updated in the Tkinter window?

Note that I am not using any button-events to trigger the image refresh, rather it should be refreshed automatically, say, every 1 second.

解决方案

Here is a solution that uses Tkinter's Tk.after function, which schedules future calls to functions. If you replace everything after your fetch_image definition with the snipped below, you'll get the behavior you described:

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值