2014-10-29 2 views
0

Я конвертирую старую программу tkinter в wxPython. Одна из вещей, которые я использовал либерально, была tk.IntVar() и тому подобное. Есть ли что-нибудь в wx, которое обеспечивает аналогичную функциональность?Есть ли аналог tk.IntVar() в wxPython?

В частности, я хотел бы иметь возможность определять переменные уровня модуля, такие как myvar = tk.StringVar(). Затем, когда эти переменные обновляется, имеет более один или элементы пользовательского интерфейса обновления на основе нового переменного значения, как и то, что случилось бы с:

self.score = tk.Entry(self, textvariable=myvar.get()) 
+0

no theres нет ... но его не нужно ... просто обработайте свой виджет, как ваш stringvar или что-то вроде 'my_text.SetValue (« asdasdad »)' –

+0

Хорошо, но если виджет находится глубоко внутри иерархии фрейма/панели, не будет ли пространство пространства имен болью? Как 'MainFrame.Panel1.Panel2.SubPanel.my_text.SetValue (" asasdasd ")'? – dthor

+0

Хотя я догадываюсь, что могу установить 'my_subpanel = MainFrame.Panel1.Panel2.SubPanel', а затем сделать' my_subpanel.my_text.SetValue («asasdasd») ' – dthor

ответ

2

вот как вы обычно организовать приложение .... Глобал, как правило, плохая идея

class MyNestedPanel(wx.Panel): 
    def __init__(self,*a,**kw): 
     ... 
     self.user = wx.TextCtrl(self,-1) 
     def SetUser(self,username): 
     self.user.SetValue(username) 

class MyMainPanel(wx.Panel): 
     def __init__(self,*a,**kw): 
      ... 
      self.userpanel = MyNestedPanel(self,...) 
     def SetUsername(self,username): 
      self.userpanel.SetUser(username) 

class MainFrame(wx.Frame): 
     def __init__(self,*a,**kw): 
      ... 
      self.mainpanel = MyMainPanel(self,...) 
     def SetUsername(self,username): 
      self.mainpanel.SetUsername(username) 

a = wx.App() 
f = MainFrame(...) 
f.Show() 
a.MainLoop() 

хотя вы можете сделать вспомогательные функции

def set_widget_value(widget,value): 
    if hasattr(widget,"SetWidgetValue"): 
     return widget.SetWidgetValue(value) 
    if isinstance(widget,wx.Choice): 
     return widget.SetStringSelection(value) 
    if hasattr(widget,"SetValue"): 
     return widget.SetValue(value) 
    if hasattr(widget,"SetLabel"): 
     return widget.SetLabel(value) 
    else: 
     raise Exception("Unknown Widget Type : %r"%widget) 

def get_widget_value(widget): 
    if hasattr(widget,"GetWidgetValue"): 
     return widget.GetWidgetValue() 
    if isinstance(widget,wx.Choice): 
     return widget.GetStringSelection() 
    if hasattr(widget,"GetValue"): 
     return widget.GetValue() 
    if hasattr(widget,"GetLabel"): 
     return widget.GetLabel() 
    else: 
     raise Exception("Unknown Widget Type : %r"%widget) 

class WidgetManager(wx.Panel): 
     def __init__(self,parent): 
     self._parent = parent 
     wx.Panel.__init__(self,parent,-1) 
     self.CreateWidgets() 
     def CreateWidgets(self): 
     #create all your widgets here 
     self.widgets = {} 
     def SetWidgetValue(self,value): 
     if isinstance(value,dict): 
      for k,v in value.items(): 
       set_widget_value(self.widgets.get(k),v) 
     else: 
      raise Exception("Expected a dictionary but got %r"%value) 
     def GetWidgetValue(self): 
      return dict([(k,get_widget_value(v))for k,v in self.widgets]) 

, а затем использовать их, как это https://gist.github.com/joranbeasley/37becd81ff2285fcc933

+0

Спасибо, это похоже на то, что я хочу. Однако после дополнительных исследований я решил пойти с шаблоном проектирования Publisher/Subscriber (в частности, из PyPubSub http://pubsub.sourceforge.net/), у них есть примеры специально для wx, так что это было легко). – dthor

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