Ответы wxPython isChecked () противоречивы - почему? - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть график с всплывающим меню, которое появляется, когда пользователь щелкает правой кнопкой мыши. Подопция A отмечена по умолчанию. Я хотел бы, чтобы пользователь мог переключать эту галочку для различных поведений. Таким образом, я хотел бы знать, если A уже проверен или нет, и я хотел бы, чтобы это обрабатывалось в его собственной функции. Давайте вызовем функцию, создающую меню showPopupMenu () и функцию, которая должна знать статус проверки A commandA ().

Прямо сейчас, если я проверю A по умолчанию и выведу состояние IsChecked () для A, в showPopupMenu () значение равно True, а в commandA () - false. Если A по умолчанию не отмечен, ответы инвертированы - showPopupMenu () показывает статус проверки как false, а commandA () показывает как true. Это создает впечатление, что состояние IsChecked () в commandA () просто противоположно состоянию IsChecked () в showPopupMenu (). Почему это?

import wxversion
wxversion.ensureMinimal('2.8')
from numpy import arange, sin, pi
import matplotlib
matplotlib.use('WX')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
from matplotlib.figure import Figure
import wx


class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self,None,-1,
                     'Example Frame',size=(550,350))

        self.SetBackgroundColour(wx.NamedColor("WHITE"))

        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        t = arange(0.0,3.0,0.01)
        s = sin(2*pi*t)

        self.axes.plot(t,s)
        self.canvas = FigureCanvas(self, -1, self.figure)
        self.canvas.Bind(wx.EVT_RIGHT_DOWN,
                   self.showPopupMenu)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()

    def showPopupMenu(self, event):
        if not hasattr(self, "popupTwo"):
            self.popupOne = wx.NewId()
            self.popupTwo = wx.NewId()
            self.popupThree = wx.NewId()
            self.popupA = wx.NewId()
            self.popupB = wx.NewId()

    self.popupOne = wx.Menu()
    my_a = self.popupOne.Append(self.popupA, "A", kind=wx.ITEM_CHECK)
    self.popupOne.Append(self.popupB, "B")
    self.popupOne.Check(self.popupA, True)
    #self.popupOne.Check(self.popupA, False)
    print "in showPopupMenu(): ",self.popupOne.IsChecked(self.popupA)
        self.Bind(wx.EVT_MENU, self.commandA, my_a) 

        menu = wx.Menu()
        menu.AppendMenu(-1, 'One', self.popupOne)
        menu.Append(self.popupTwo, "Two")
        menu.Append(self.popupThree, "Three")

        self.PopupMenu(menu)
        menu.Destroy()

    def commandA(self, event):
    print "in commandA(): ", self.popupOne.IsChecked(self.popupA)

# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

Вывод этого скрипта:

в showPopupMenu (): True

в команде A (): False

1 Ответ

0 голосов
/ 02 апреля 2011

Когда вы нажимаете A, флажок переключается с True на False, поэтому вы видите, что там выводится False.Однако вы каждый раз создаете и уничтожаете свое окно, поэтому никогда не видите, как оно меняет состояние проверки.

Вот пример того, как настроить меню, не создавая и не уничтожая его каждый раз:

import wx
import gui

class MainFrame(wx.Frame):
    def __init__( self, parent ):
        wx.Frame.__init__ (self, parent)

        # Layout my frame
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.panel = wx.Panel(self)
        self.panel.Layout()
        self.panel.Bind(wx.EVT_RIGHT_DOWN, self.showPopupMenu)
        sizer.Add( self.panel, 1, wx.EXPAND |wx.ALL, 0 )
        self.SetSizer( sizer )
        self.Layout()

        # Add the menu
        self.popupA = wx.NewId()
        self.popupOne = wx.Menu()

        my_a = self.popupOne.Append(self.popupA, "A", kind=wx.ITEM_CHECK)
        self.popupOne.Check(self.popupA, True)

        self.Bind(wx.EVT_MENU, self.commandA, my_a)

        self.menu = wx.Menu()
        self.menu.AppendMenu(-1, 'One', self.popupOne)

    def showPopupMenu(self, event):
        print "in showPopupMenu(): ",self.popupOne.IsChecked(self.popupA)
        self.PopupMenu(self.menu)

    def commandA(self, event):
        event.Skip()
        print "in commandA(): ", self.popupOne.IsChecked(self.popupA)

class app(wx.App):
    def OnInit(self):
        self.m_frame = MainFrame(None)
        self.m_frame.Show()
        self.SetTopWindow(self.m_frame)
        return True

app = app(0)
app.MainLoop()
...