2015-01-08 3 views
-2

Я пытался сделать приложение с помощью wxpython. Мне нужно было составить список для моего графического интерфейса (загрузка в facebook). Поэтому я выбираю ObjectListview. К сожалению, это очень тяжелая работа и отсутствие информации для начинающих. Я тестировал «SimpleExamples». Он отлично работает. но мне нужно изменить изображение. Несмотря на все мои попытки разобраться в себе, я не мог. С некоторыми усилиями я узнал, что файл изображений является кодом python. Но я не знаю, как конвертировать изображения в виде кода python.Как преобразовать изображения как код python

Можете ли вы мне помочь ??? Ваш ответ может быть моим лучшим ответом.

исходный код из https://github.com/adrianer/ObjectListView

Здесь находится SimpleExample2.py от ObjectListview

# -*- coding: utf-8 -*- 
#!/usr/bin/env python 

import datetime 
import wx 

# Where can we find the ObjectListView module? 
import sys 
sys.path.append("..") 

from ObjectListView import ObjectListView, ColumnDefn 

import ExampleModel 
import ExampleImages ******# We store our images as python code**Look at here please~**** 

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 
     self.Init() 

    def Init(self): 
     self.InitModel() 
     self.InitWidgets() 
     self.InitObjectListView() 

    def InitModel(self): 
     self.songs = ExampleModel.GetTracks() 

    def InitWidgets(self): 
     panel = wx.Panel(self, -1) 
     sizer_1 = wx.BoxSizer(wx.VERTICAL) 
     sizer_1.Add(panel, 1, wx.ALL|wx.EXPAND) 
     self.SetSizer(sizer_1) 

     self.myOlv = ObjectListView(panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
     sizer_2 = wx.BoxSizer(wx.VERTICAL) 
     sizer_2.Add(self.myOlv, 1, wx.ALL|wx.EXPAND, 4) 
     panel.SetSizer(sizer_2) 

     self.Layout() 

    def InitObjectListView(self): 
     groupImage = self.myOlv.AddImages(ExampleImages.getGroup16Bitmap(), ExampleImages.getGroup32Bitmap()) 
     userImage = self.myOlv.AddImages(ExampleImages.getUser16Bitmap(), ExampleImages.getUser32Bitmap()) 
     musicImage = self.myOlv.AddImages(ExampleImages.getMusic16Bitmap(), ExampleImages.getMusic32Bitmap()) 

     soloArtists = ["Nelly Furtado", "Missy Higgins", "Moby", "Natalie Imbruglia", 
         "Dido", "Paul Simon", "Bruce Cockburn"] 
     def artistImageGetter(track): 
      if track.artist in soloArtists: 
       return userImage 
      else: 
       return groupImage 

     def sizeToNiceString(byteCount): 
      """ 
      Convert the given byteCount into a string like: 9.9bytes/KB/MB/GB 
      """ 
      for (cutoff, label) in [(1024*1024*1024, "GB"), (1024*1024, "MB"), (1024, "KB")]: 
       if byteCount >= cutoff: 
        return "%.1f %s" % (byteCount * 1.0/cutoff, label) 

      if byteCount == 1: 
       return "1 byte" 
      else: 
       return "%d bytes" % byteCount 

     self.myOlv.SetColumns([ 
      ColumnDefn("Title", "left", 120, "title", imageGetter=musicImage), 
      ColumnDefn("Artist", "left", 120, "artist", imageGetter=artistImageGetter), 
      ColumnDefn("Size", "center", 100, "sizeInBytes", stringConverter=sizeToNiceString), 
      ColumnDefn("Last Played", "left", 100, "lastPlayed", stringConverter="%d-%m-%Y"), 
      ColumnDefn("Rating", "center", 100, "rating") 
     ]) 
     self.myOlv.SetObjects(self.songs) 

if __name__ == '__main__': 
    app = wx.PySimpleApp(1) 
    wx.InitAllImageHandlers() 
    frame_1 = MyFrame(None, -1, "ObjectListView Simple Example 2") 
    app.SetTopWindow(frame_1) 
    frame_1.Show() 
    app.MainLoop() 

И есть код ExampleImages.py Я никогда не видел тех кода (x00 \ x10 \ x08). Я думаю, что если я хочу использовать изображение в Objectlistview, мне нужно изменить код примерно так (x00 \ x10 \ x08).

from wx import ImageFromStream, BitmapFromImage, EmptyIcon 
import cStringIO, zlib 


def getGroup16Data(): 
    return zlib.decompress(
'x\xda\x017\x01\xc8\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\ 
\x00\x00\x00\x10\x08\x02\x00\x00\x00\x90\x91h6\x00\x00\x00\x03sBIT\x08\x08\ 
\x08\xdb\xe1O\xe0\x00\x00\x00\xefIDAT(\x91\x85\x92\xc1u\xc30\x0cC\x117Sh\rt\ 
\r\xadA\xceD\xcc\x9150G\xc7P\x0f\xb2]5\xcf\xcf\xc1I\x96\xf8\x01\x89\xe6c\x8c\ 
\[email protected]\x92m\x00U\x85{\x8d1\xaaj\x8c1\xc6\x88\x88\x88\x18\x87\xaaj\xfd\x9c\xda\ 
&v&\x9c\x92\x14\x11$3s\xdd\xdfl\x03\x94\x9c\x99+2y\x92oF_\x00z\x8f\xde{kA\ 
\xf6\xd6\xba\x94\xad5+\x7f\xd0^\xafWk\xad\xf7\xfe\x97p\xaeH\x90\x98vRV\x85\ 
\x95\xb0\xc2\xca\xfc>\xcb\x9ek\xdc\x12n\xd8U\x01\x00\x16\xe4k\xe0]\xd6d\xff=\ 
\xba\xaa\xa4\xa5\x0fRD\xdc\x98l\x87\xd7\xbc\xbb\xbd\x1b\xf2\x03\xb0c$\x08I+`\ 
\x03\x8ck`)\xf2^\xea\xd9:K\x9aG\xb7\x8f\x9eW\xf3n\x91\x99$\x8f\xd1\xb0>\x90G\ 
\xf2\x13\xc7\x84f\xa6$\x92\xf6\xc5D\xecy\xe4c\x8e\xf7\xd49gUe[\xca\xfd_2H\ 
\xcev\xff\x02\x0b[\xa5cP|\xd5p\x00\x00\x00\x00IEND\xaeB`\x82\xf3\x99\x84Y') 

def getGroup16Bitmap(): 
    return BitmapFromImage(getGroup16Image()) 

def getGroup16Image(): 
    stream = cStringIO.StringIO(getGroup16Data()) 
    return ImageFromStream(stream) 

#---------------------------------------------------------------------- 

Я неправильно понял ??? Есть ли другой способ изменить изображение. (Мне нужно изменить размер изображения, положение, шрифты и размер текста и т. Д., Но сначала я хочу изменить изображения)

+0

_ «Я узнал, что файл изображений как код питона». _ Что это значит? Единственный смысл «файла» как глагола, который я знаю, это «организовать в кабинете подачи», и это, по-видимому, не имеет смысла в контексте здесь. – Kevin

+0

@Kevin: Я имею в виду, что для изменения изображения на код python что-то вроде этого (x \ xda \ x017 \ x01 \ xc8 \ xfe \ x). Из этого кода (для использования SimpleExamples) мне нужно изменить изображение как код на Python – LEELOLEE

+0

@Kevin: (где ваш комментарий? ... Он был здесь ... в любом случае, из вашего отсутствующего комментария) Я заменил некоторые, подобные этому , но ... Это не сработает. Можете ли вы дать мне несколько советов по этому поводу? ЬиЕ = открыт ("1.png", "RB"). Чтения() # ЬиЕ = get_image_data() SBUF = StringIO.StringIO (ssbut) musicImage = self.myOlv.AddImages (ImageFromStre1am (SBUF)) – LEELOLEE

ответ

-1

Я, наконец, обнаружил ^^ Он работает. но Objectlistview нелегко вообще ... Мне нужно найти, чтобы изменить фонды и размер все больше и больше. в любом случае здесь код

# -*- coding: utf-8 -*- 
    #!/usr/bin/env python 

    import datetime 
    import wx 
    import cStringIO 
    from PIL import Image 

    #from wx import ImageFromStream, BitmapFromImage, EmptyIcon 

    # Where can we find the ObjectListView module? 
    import sys 
    sys.path.append("..") 

    from ObjectListView import ObjectListView, ColumnDefn 

    import ExampleModel 
    import ExampleImages # We store our images as python code 

    class MyFrame(wx.Frame): 
     def __init__(self, *args, **kwds): 
      wx.Frame.__init__(self, *args, **kwds) 
      self.Init() 

     def Init(self): 
      self.InitModel() 
      self.InitWidgets() 
      self.InitObjectListView() 

     def InitModel(self): 
      self.songs = ExampleModel.GetTracks() 

     def InitWidgets(self): 
      panel = wx.Panel(self, -1) 
      sizer_1 = wx.BoxSizer(wx.VERTICAL) 
      sizer_1.Add(panel, 1, wx.ALL|wx.EXPAND) 
      self.SetSizer(sizer_1) 

      self.myOlv = ObjectListView(panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
      sizer_2 = wx.BoxSizer(wx.VERTICAL) 
      sizer_2.Add(self.myOlv, 1, wx.ALL|wx.EXPAND, 4) 
      panel.SetSizer(sizer_2) 

      self.Layout() 

     def InitObjectListView(self): 
      groupImage = self.myOlv.AddImages(ExampleImages.getGroup16Bitmap(), ExampleImages.getGroup32Bitmap()) 
      userImage = self.myOlv.AddImages(ExampleImages.getUser16Bitmap(), ExampleImages.getUser32Bitmap()) 
    ######################################################################3333 
      #open the image file 
      imageFile = '111.png' 
      data = open(imageFile, "rb").read() 
      # convert to a data stream 
      stream = cStringIO.StringIO(data) 
      # convert to a bitmap 
      bmp = wx.BitmapFromImage(wx.ImageFromStream(stream)) 
      musicImage = self.myOlv.AddImages(bmp) 
    ################################################################### 
    ######### changed code ########################################## 

      soloArtists = ["Nelly Furtado", "Missy Higgins", "Moby", "Natalie Imbruglia", 
          "Dido", "Paul Simon", "Bruce Cockburn"] 

      def artistImageGetter(track): 
       if track.artist in soloArtists: 
        return userImage 
       else: 
        return groupImage 

      def sizeToNiceString(byteCount): 
       """ 
       Convert the given byteCount into a string like: 9.9bytes/KB/MB/GB 
       """ 
       for (cutoff, label) in [(1024*1024*1024, "GB"), (1024*1024, "MB"), (1024, "KB")]: 
        if byteCount >= cutoff: 
         return "%.1f %s" % (byteCount * 1.0/cutoff, label) 

       if byteCount == 1: 
        return "1 byte" 
       else: 
        return "%d bytes" % byteCount 

      self.myOlv.SetColumns([ 
       ColumnDefn("Title", "left", 120, "title", imageGetter=musicImage), 
       ColumnDefn("Artist", "left", 120, "artist", imageGetter=artistImageGetter), 
       ColumnDefn("Size", "center", 100, "sizeInBytes", stringConverter=sizeToNiceString), 
       ColumnDefn("Last Played", "left", 100, "lastPlayed", stringConverter="%d-%m-%Y"), 
       ColumnDefn("Rating", "center", 100, "rating") 
      ]) 
      self.myOlv.SetObjects(self.songs) 

    if __name__ == '__main__': 
     app = wx.PySimpleApp(1) 
     wx.InitAllImageHandlers() 
     frame_1 = MyFrame(None, -1, "ObjectListView Simple Example 2") 
     app.SetTopWindow(frame_1) 
     frame_1.Show() 
     app.MainLoop() 
+0

Полезно объяснить **, что вы изменили ** и, если это вообще возможно, ** почему **. – jonrsharpe

0

Стандартный подход к встраиванию и изображение в файле с питона WxPython является использование img2py. Here's сообщение в блоге, которое использует его (см. Примерно половину пути вниз).

0

Вот решение:

from wx import BitmapFromImage, ImageFromStream 
from cStringIO import StringIO 

def getGroup16Data(): 
    return \ 
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\ 
\x00\x00\x00\x10\x08\x02\x00\x00\x00\x90\x91h6\x00\x00\x00\x03sBIT\x08\x08\ 
\x08\xdb\xe1O\xe0\x00\x00\x00\xefIDAT(\x91\x85\x92\xc1u\xc30\x0cC\x117Sh\rt\ 
\r\xadA\xceD\xcc\x9150G\xc7P\x0f\xb2]5\xcf\xcf\xc1I\x96\xf8\x01\x89\xe6c\x8c\ 
\[email protected]\x92m\x00U\x85{\x8d1\xaaj\x8c1\xc6\x88\x88\x88\x18\x87\xaaj\xfd\x9c\xda\ 
&v&\x9c\x92\x14\x11$3s\xdd\xdfl\x03\x94\x9c\x99+2y\x92oF_\x00z\x8f\xde{kA\ 
\xf6\xd6\xba\x94\xad5+\x7f\xd0^\xafWk\xad\xf7\xfe\x97p\xaeH\x90\x98vRV\x85\ 
\x95\xb0\xc2\xca\xfc>\xcb\x9ek\xdc\x12n\xd8U\x01\x00\x16\xe4k\xe0]\xd6d\xff=\ 
\xba\xaa\xa4\xa5\x0fRD\xdc\x98l\x87\xd7\xbc\xbb\xbd\x1b\xf2\x03\xb0c$\x08I+`\ 
\x03\x8ck`)\xf2^\xea\xd9:K\x9aG\xb7\x8f\x9eW\xf3n\x91\x99$\x8f\xd1\xb0>\x90G\ 
\xf2\x13\xc7\x84f\xa6$\x92\xf6\xc5D\xecy\xe4c\x8e\xf7\xd49gUe[\xca\xfd_2H\ 
\xcev\xff\x02\x0b[\xa5cP|\xd5p\x00\x00\x00\x00IEND\xaeB`\x82\xf3\x99\x84Y' 

def getGroup16Bitmap(): 
    return BitmapFromImage(ImageFromStream(StringIO(getGroup16Data()))) 

Чтобы преобразовать изображение использовать код из: Create text file of hexadecimal from binary Пожалуйста, убедитесь, что я оставил пусковую часть вашей шестнадцатеричной строки оставляя часть из '\x89PNG...'.

Смежные вопросы