2

wxPython イベント ハンドラ関数内から関数を使用する方法を見つけるのに苦労しています。クリックすると、イベント ハンドラーを使用して OnRun という関数を実行するボタンがあるとします。ただし、ユーザーは OnRun ボタンの前に RadionButton をクリックするのを忘れていたので、ステップを忘れたことを知らせる MessageDialog をポップアップ表示したいと考えています。この MessageDialog を数回再利用するので、同じコードをコピーして貼り付けるのではなく、この MessageDialog を関数に入れ、ユーザーが RadioButton をチェックするのを忘れた場合にこの MessageDialog 関数を呼び出したいと考えています。

これがイベント ハンドラーで使用される関数ではない場合、関数を引数として単純に配置できることはわかっていますが、これらを使用してこれを行う方法がわかりません。ここで何か助けていただければ幸いです。

4

3 に答える 3

1

答えが直接的すぎるように見えても、私はこれを突き刺します。ラジオ ボタンがクリックされたかどうかを示す囲みフレームにプロパティを設定します。次に、OnRun呼び出されたときにそのプロパティを確認します。間違った状態にある場合は、MessageDialog を呼び出して、OnRun.

編集これが私が言いたいことです.2つのボタンを持つ簡単な例であり、ユーザーの同意がクリックされない限り、どちらのボタンもそれ以上のアクションにつながりません.

import wx

class ButtonFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Button Example', 
                          size=(300, 100))
        panel = wx.Panel(self, -1)
        self.radio = wx.RadioButton(panel, -1, "Accept user agreement", pos=(50, 10))
        self.button = wx.Button(panel, -1, "Run", pos=(50, 30))
        self.Bind(wx.EVT_BUTTON, self.OnRun, self.button)
        self.button.SetDefault()
        self.btn2 = wx.Button(panel, -1, "Walk", pos=(150, 30))
        self.Bind(wx.EVT_BUTTON, self.OnWalk, self.btn2)

    def OnRun(self, event):
        if not self.CheckRadio():
            return
        self.button.SetLabel("Running")

    def OnWalk(self, event):
        if not self.CheckRadio():
            return
        self.btn2.SetLabel("Walking")

    def CheckRadio(self):
        accepted = self.radio.GetValue()
        if not accepted:
            dlg = wx.MessageDialog(None, 'First accept the user agreement',
                                  'MessageDialog', wx.OK | wx.ICON_QUESTION)
            result = dlg.ShowModal() # result not used in this demo
            dlg.Destroy()
            return False
        else:
            return True

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = ButtonFrame()
    frame.Show()
    app.MainLoop()

コードはwxPython in Actionの Listing 7.11 から改作されています。経過した時間でこれをまだ解決していない場合は、これが役立つことを願っています。

于 2012-05-12T22:23:19.400 に答える
1

次のコードは、カスタム ダイアログを表示するために再利用できる小さなメソッドを作成する方法を示し、契約に同意する必要があることをユーザーに伝えます。もちろん、条件を変更して、必要なことを行うことができます。また、「showMsg」メソッドを変更して、少し調整するだけでアイコンも変更できます。

import wx

########################################################################
class TestFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Test")

        panel = wx.Panel(self)
        self.radios = wx.RadioBox(panel, label="Choices",
                                  choices = ["None", "Accept", "Reject"])

        button = wx.Button(panel, label="Run")
        button.Bind(wx.EVT_BUTTON, self.onBtn)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.radios, 0, wx.ALL, 5)
        sizer.Add(button, 0, wx.ALL, 5)
        panel.SetSizer(sizer)

    #----------------------------------------------------------------------
    def onBtn(self, event):
        """"""
        btn = event.GetEventObject()
        btn.SetLabel("Running")
        radio_value = self.radios.GetStringSelection()
        if radio_value == "None":
            self.showMsg("Error", "Please Choose 'Accept' or 'Reject'!")
        elif radio_value == "Accept":
            self.showMsg("Message", "Thank you for accepting!")
        else:
            self.showMsg("Message", "We're sorry, but you cannot continue the install")

    #----------------------------------------------------------------------
    def showMsg(self, title, msg):
        """"""
        dlg = wx.MessageDialog(None, msg, title, wx.OK | wx.ICON_QUESTION)
        dlg.ShowModal()
        dlg.Destroy()



if __name__ == "__main__":
    app = wx.App(False)
    frame = TestFrame()
    frame.Show()
    app.MainLoop()
于 2012-05-14T14:34:24.657 に答える
0

独自の MessageDialog (継承) を作成するか、functools.partial /lambda を使用して追加の引数をイベント ハンドラーに渡すことができます。

self.Bind(wx.MY_EVENT, lambda evt: self.OnEventX(evt, handler=foo), id=12)
于 2012-05-12T22:21:30.767 に答える