Есть ли в wxPython аналог tk.IntVar()?

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам