2010-11-22 10 views
1

wxPyton kullanarak bir MVC uygulaması yapıyorum ve wx.lib.pubsub.Publisher ile ilgili bir sorun yaşıyorum.python - wx.lib.pubsub.Publisher düğmelerden arandığında çalışmıyor mu?

Denetleyicimi, Görünümüm'den mümkün olduğunca ayrı tutmak istiyorum. Örneğin, denetleyicimin görünümde kullanılan düğmelerin adlarını "bilmesini" istemiyorum. wxPython example'da, denetleyici onları tanımak zorundadır, bu yüzden bunlara eylemleri bağlayabilir.

from wx.lib.pubsub import Publisher as pub 

class Controller: 
... 
pub.subscribe(self.AddMoney, "MONEY ADDED") 
pub.subscribe(self.RemoveMoney, "MONEY REMOVED") 

görünümü sadece mesaj göndermek istiyorum bir eyleme kontrolleri bağlamak istiyorum:

class Controller: 
... 
self.view2.add.Bind(wx.EVT_BUTTON, self.AddMoney) 
self.view2.remove.Bind(wx.EVT_BUTTON, self.RemoveMoney) 

yerine wx.lib.pubsub.Publisher mesajlarını kullanarak, biraz daha 'nükleer ayırma' şeyleri düşündü.

Fakat alas, işe yaramıyor gibi görünüyor. Görünüm, olayları göndermeyi reddeder veya denetleyici, görünümden mesaj almayı reddeder. Emin değilim.

İşte

import wxversion 
wxversion.ensureMinimal('2.8') 
import wx 
from wx.lib.pubsub import Publisher as pub 

class View(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="Main View") 

     self.button = wx.Button(self, -1, "foo?") 
     self.button.Bind(wx.EVT_BUTTON, self.ChangeFoo) 

    def ChangeFoo(self, evt): 
     print('Binding works') 
     pub.sendMessage("FOO CHANGED") 

class Controller: 
    def __init__(self, app): 
     self.view = View() 

     pub.subscribe(self.FooChanged, "FOO CHANGED") 

     self.view.Show() 

    def FooChanged(self, message): 
     print('Messaging works') 


app = wx.App(False) 
Controller(app) 
app.MainLoop() 

uygulaması büyük bir düğme içeren bir pencere gösterir (Python 2.6.6 ve wxPython 2.8 ile test ettik) sorunumu gösteren küçük bir örnek uygulamadır.

Binding works 
Messaging works 

Ama bunun yerine alıyorum: bastıktan sonra beklenen çıkışı

Binding works 

herkes bu çözmek için biliyor mu?

cevap

4

Denetleyicinize bir referans kaydetmeniz gerekir, aksi halde nesne GC'd alır ve bu nedenle mesajın gönderildiği zaman mevcut olmaz. Sondan ikinci satıra değiştirin:

controller = Controller(app) 
+0

Güzel lekelenme! WxPython örneğini güncelledim, böylece aynı tuzağa düşmeyen başka kimse yok. Tüm tarihleriniz mutlu ve tüm yollarınız düz ve dürüst olsun. – kikito