2014-08-24 5 views
1

Я кодирую Python 2.7, и я пытаюсь изменить фоновое растровое изображение на основе выбора переключателя пользователя из выпадающего меню в другом окне. В прикрепленном коде изображение Bitmap0 является значением по умолчанию. Выбрав меню «Фото», затем пункт меню «Изменить фотографию» вызывает радиоканал. Я хочу иметь возможность выбрать Bitmap1 и изменить изображение растрового изображения на изображение Bitmap1.Пользовательское изменение растрового изображения

Я безуспешно пытался pubsub, и я никогда не был уверен в том, как модуль pubsub вписывается в Python. Разве это невозможно, если вы правильно доберетесь до правильных переменных?

Мой упрощенный код выглядит следующим образом:

import wx 

IPaa0 = 0 

bgphoto = "bitmap" + str(IPaa0) + ".bmp" 
print bgphoto 

_ID_Item0 = wx.NewId() 
_ID_Item1 = wx.NewId() 
_ID_Item2 = wx.NewId() 
_ID_Item3 = wx.NewId() 
_ID_Item4 = wx.NewId() 
_ID_Item5 = wx.NewId() 


class cPanel(wx.Panel): 

    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

    def TogFot(self, fotnum): 
     print "TogFot Entered" 


class aFotoDir(wx.App): 

    def OnInit(self): 
     iMainFrame = cMainFrame("Top Frame", (0, 0), (1200, 900)) 
     iMainFrame.Show() 
     self.SetTopWindow(iMainFrame) 
     return True 


class cMainFrame(wx.Frame): 

    def __init__(self, title, pos, size): 
     wx.Frame.__init__(self, None, -1, title, pos, size) 
     iPanel = cPanel(self) 


     MenuBar = wx.MenuBar() 

     mFile = wx.Menu() 
     MenuBar.Append(mFile, "File") 

     mFoto = wx.Menu() 
     MenuBar.Append(mFoto, "Photo") 

     self.SetMenuBar(MenuBar) 


     MenuItem0 = wx.Menu() 
     mFile.Append(_ID_Item0, "Open") 

     MenuItem1 = wx.Menu() 
     mFile.Append(_ID_Item1, "Save") 

     MenuItem2 = wx.Menu() 
     mFile.Append(_ID_Item2, "Save As") 

     MenuItem3 = wx.Menu() 
     mFile.Append(_ID_Item3, "Close") 

     MenuItem4 = wx.Menu() 
     mFile.Append(_ID_Item4, "Exit") 


     MenuItem5 = wx.Menu() 
     mFoto.Append(_ID_Item5, "Change Photo") 

     self.Bind(wx.EVT_MENU, self.ClickChFoto, id = _ID_Item5) 


     img0 = wx.Image(bgphoto, wx.BITMAP_TYPE_ANY) 
     img1 = wx.StaticBitmap(iPanel, -1, wx.BitmapFromImage(img0)) 


    def ClickChFoto(self, event): 

     iSecondFrame = cSecondFrame("Input", (50, 0), (400, 300)) 
     iSecondFrame.Show() 
     return True 


class cSecondFrame(cMainFrame): 

     def __init__(self, title, pos, size): 
      wx.Frame.__init__(self, None, -1, title, pos, size) 
      iSecondPanel = wx.Panel(self, -1) 

      iBut0 = wx.Button(iSecondPanel, -1,  "OK", pos = (75, 200)) 
      iBut1 = wx.Button(iSecondPanel, -1, "CANCEL", pos = (225, 200)) 

      Plist = ["Bitmap0", "Bitmap1"] 

      self.iWid0 = wx.RadioBox(iSecondPanel, -1, "Photo Selection", (50, 50), 
            (200, 100), Plist, 1, wx.RA_SPECIFY_COLS) 

      self.Bind(wx.EVT_BUTTON, self.ClickOK,  iBut0) 
      self.Bind(wx.EVT_BUTTON, self.ClickCANCEL, iBut1) 


     def ClickOK(self, event): 
      print "OK Clicked" 
      global IPaa0 
      IPaa0 = self.iWid0.GetSelection() 
      print IPaa0 
      global bgphoto 
      bgphoto = "bitmap" + str(IPaa0) + ".bmp" 
      print bgphoto 
      self.Close(True) 


     def ClickCANCEL(self, event): 
      print "CANCEL Clicked" 
      self.Close(True) 

#------------------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = aFotoDir(False) 
    app.MainLoop() 

Файлы изображений являются только два файла с названиями «Bitmap0» и «Bitmap1». Я не знал протокол для загрузки изображений, и они были размером более 6 МБ, поэтому я не загружал.

Буду признателен за любое руководство и инструкцию.

ответ

0

Необходимо указать ссылку cFrame на номер cSecondFrame в качестве параметра __init__ из cSecondFrame. Затем изнутри своего def ClickOK загрузите новое растровое изображение по-прежнему и установите его в img1 и вызовите функцию Layout()cFrame.

+0

Хммм. Спасибо пользователю 2963623. Вы обнаружили еще один пробел в моих знаниях, я не знаю, как это сделать. Я возвращаюсь к книге О'Рейли Лутца, чтобы заполнить пробел. Есть ли у вас другая рекомендация? –

+0

user2963623, так как вы единственный, кто пытается мне помочь, могу ли я попросить вас изменить мой код, чтобы реализовать ваше предложение. Мне непонятно, как ссылаться на cMainFrame в __init__ of cSecondFrame, а затем использовать его? Я получил сообщение об ошибке, в котором говорилось, что у меня слишком много аргументов, когда я добавляю cMainFrame в качестве аргумента для __init__ cSecondFrame. Заранее спасибо. –

+0

Я посмотрю. Дайте мне несколько дней – user2963623

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