Ich schreibe eine GUI, um ein paar Bilder (Buchumschläge von Amazon) aus einer definierten Liste von URLs anzuzeigen, ich konnte sie in einem Panel erfolgreich, aber trotzdem laden Mit Hilfe von Threads scheint die GUI zu warten, bis die Schleife vorbei ist und dann alle Bilder auf einmal angezeigt werden. Wie kann ich die GUI erreichen, um jedes Bild anzuzeigen, wie es abgerufen wird? Die GUI ist im Wesentlichen eingefroren bis die Bilder werden geholt ... Danke!wxpython Threading Bilder anzeigen, wie sie geladen werden
die Frage wieder, die mir jedes Bild erhalten, um sicherzustellen, auf der GUI angezeigt werden, da sie nicht alle auf einmal gezogen werden ...
import wx
import os
import sys
import urllib2
import cStringIO
import threading
import time
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',
'https://images-na.ssl-images-amazon.com/images/I/51jizRmRYYL._AC_US160_.jpg',
'https://images-na.ssl-images-amazon.com/images/I/31Pw7voGDFL._AC_US160_.jpg',
'https://images-na.ssl-images-amazon.com/images/I/51g30m1xpPL._AC_US160_.jpg',
'https://images-na.ssl-images-amazon.com/images/I/51qx+6aQUnL._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):
def _update_data(data):
time.sleep(2)
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()
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()
Oh danke dafür, ich lerne viel. Dies ist das Ergebnis, nach dem ich gesucht habe, da ich die Sortierung nach dem Holen erledigen lassen werde. –
Ich dachte an Queue zusammen mit Threading, in der Hoffnung, dass es mehrere Threads spawnen wird und dann Queue wird sich um die Reihenfolge kümmern? Nicht sicher, ob dies herauskommt, entspricht der ersten Antwort, die von Ihnen gepostet wird. –
Der Code wurde geändert, um zu zeigen, wie die Schaltflächen zuerst generiert werden und die Bitmap später angewendet wird. '' Queue'' wird Ihnen nicht helfen, denn wie im ersten Beispiel werden die Threads nacheinander und nicht gleichzeitig verarbeitet. – nepix32