首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxPython获取远程映像和线程

wxPython获取远程映像和线程
EN

Stack Overflow用户
提问于 2016-12-19 08:00:58
回答 1查看 344关注 0票数 0

我正试图用wxPython编写一个应用程序来显示亚马逊商店中的一些商品(目前仅以JPG的形式提供书籍封面)。我正在使用urllib2,并将它们显示在位图按钮上,并列出它们以供进一步操作,但在编写代码之后,主窗口/应用程序似乎只有在所有urls/图像都是fetched..upon之后才会加载--我知道,在应用程序主要代码运行时,我们必须使用线程来中断操作,但这是我第一次尝试使用wxpython,而我读到的所有示例更使我感到困惑。

我在下面提到了我正在为任何专家工作的代码,这些专家可以给我一些想法,如何确保每个URL在读取时被获取和显示.下面的代码融合了这里和网络上的各种例子,所以请原谅我缺乏技能。

代码语言:javascript
复制
import wx
import os
import sys
import urllib2
import cStringIO

urls = ['https://images-na.ssl-images-amazon.com/images/I/51-u3J3mtTL._AC_US100_.jpg',
        'https://images-na.ssl-images-amazon.com/images/I/51cRqX8DTgL._AC_US100_.jpg',
        'https://images-na.ssl-images-amazon.com/images/I/515iBchIIzL._AC_US100_.jpg',
        'https://images-na.ssl-images-amazon.com/images/I/511MaP7GeJL._AC_US100_.jpg',
        'https://images-na.ssl-images-amazon.com/images/I/51jizRmRYYL._AC_US160_.jpg']

class Example(wx.Frame):

    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
        self.InitUI()
        self.Ctrls()
        self.makeButtons()

    def makeButtons(self):

        i = 0

        for url in urls:

            f = urllib2.urlopen(url)
            data = f.read()

            i += 1
            print " url = ",url, "  ",i
            stream = cStringIO.StringIO(data)
            bmp = wx.BitmapFromImage( wx.ImageFromStream( stream ) )
            button = wx.Button(self.panel, -1, "Book cover", style=wx.ALIGN_CENTER, size=wx.Size(100,100))
            button.SetToolTipString("wx.Button can how have an icon on the left, right,\n"
                           "above or below the label.")
            button.SetBitmap(bmp,
                    wx.LEFT    # Left is the default, the image can be on the other sides too
                    #wx.RIGHT
                    #wx.TOP
                    #wx.BOTTOM
                    )
            button.SetBitmapMargins((4,4)) 
            button.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False))
            self.wrapSizer.Add(button, 1, wx.EXPAND)
        self.Show(True)
        self.panel.Layout()

    def InitUI(self):
        self.SetSize((800, 400))
        self.SetTitle('Dynamically Flow Buttons to Next Row on Window-Resize')
        self.Centre()


    def Sizers(self):
        self.wrapSizer = wx.WrapSizer()
        self.panel.SetSizer(self.wrapSizer)

    def Ctrls(self):
        self.panel = wx.Panel(parent=self,pos=wx.Point(0,0), size=wx.Size(750,550), style=wx.TAB_TRAVERSAL)
        self.Sizers()

def main():

    ex = wx.App()
    Example(None)
    ex.MainLoop()

if __name__ == '__main__':
    main()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-19 16:43:55

您应该使用线程进行url获取,然后使用wx.CallAfter返回主线程以显示数据.下面是如何更改您的代码

代码语言:javascript
复制
import threading

def makeButtons(self):


    def _update_data(data):

        stream = cStringIO.StringIO(data)
        bmp = wx.BitmapFromImage( wx.ImageFromStream( stream ) )
        button = wx.Button(self.panel, -1, "Book cover", style=wx.ALIGN_CENTER, size=wx.Size(100,100))
        button.SetToolTipString("wx.Button can how have an icon on the left, right,\n"
                       "above or below the label.")
        button.SetBitmap(bmp,
                wx.LEFT    # Left is the default, the image can be on the other sides too
                #wx.RIGHT
                #wx.TOP
                #wx.BOTTOM
                )
        button.SetBitmapMargins((4,4)) 
        button.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False))
        self.wrapSizer.Add(button, 1, wx.EXPAND)
        self.Show(True)
        self.panel.Layout()

    def f():
        f = urllib2.urlopen(url)
        data = f.read()
        wx.CallAfter(_update_data, data)

    for url in urls:
        threading.Thread(target=f).start()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41218148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档