0

次のようなフォームに複数のウィジェットがあります。

    self.sl_qZone1 = wx.Slider(self, -1, 50, integer=True, 0, 100, size=(sliderWidthHeight), style=wx.SL_HORIZONTAL)
    self.tc_qZone1 = wx.TextCtrl(panel, -1, 50, (0,0), style=wx.TE_CENTER)

私はいくつかのイベントをそのように十数個のスライダー/テキストコントロールにバインドしています:

        wx.FindWindowByName(mvName['sl0']).Bind(wx.EVT_SLIDER, lambda event: self.sliderUpdate(event, wx.FindWindowByName(mvName['sl0']), wx.FindWindowByName(mvName['tc0']),), wx.FindWindowByName(mvName['sl0']))
        wx.FindWindowByName(mvName['tc0']).Bind(wx.EVT_CHAR, lambda event: self.tcVolUpdate(event, wx.FindWindowByName(mvName['sl0']), wx.FindWindowByName(mvName['tc0']),), wx.FindWindowByName(mvName['tc0']))

そして、私はこれらの機能を持っています:

    def sliderUpdate(self, event, slider, textctrl):
        textctrl.SetValue(str(slider.GetValue()))

    def tcVolUpdate(self, event, slider, textctrl):
        slider.SetValue(int(textctrl.GetValue()))    

スライダーを変更するとうまく機能します - textctrl を適切な値で更新します。しかし、textctrl を編集しようとすると、テキストを選択できますが、実際には編集できません。私wx.EVT_TEXT_ENTERも運が悪かったので試してみました。

テキスト ctrl を更新可能にして、スライダーの値を更新するにはどうすればよいですか?

4

1 に答える 1

1

wx.TE_PROCESS_ENTER を含むように textctrl のスタイルを設定すると、バインドで EVT_TEXT_ENTER を使用できます。

#!/usr/bin/python  
import wx

class ex2(wx.Dialog):
    def __init__(self, parent, id, title):
        wx.Dialog.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(400, 420))

        panel = wx.Panel(self, -1)
        vbox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_qZone1 = wx.Slider(panel, -1, 50, 0, 100, size=(20,200), style=wx.SL_HORIZONTAL)
        self.tc_qZone1 = wx.TextCtrl(panel, -1, value="", style=wx.TE_CENTER|wx.TE_PROCESS_ENTER)

        self.sl_qZone1.Bind(wx.EVT_SLIDER, lambda event: self.sliderUpdate(event, self.sl_qZone1,self.tc_qZone1))
        self.tc_qZone1.Bind(wx.EVT_TEXT_ENTER, lambda event: self.tcVolUpdate(event, self.sl_qZone1,self.tc_qZone1))

        vbox.Add(self.sl_qZone1, 1, wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT | wx.BOTTOM, 15)
        vbox.Add(self.tc_qZone1, 1, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 20)
        panel.SetSizer(vbox)
        self.Centre()

    def sliderUpdate(self, event, slider, textctrl):
        textctrl.SetValue(str(slider.GetValue()))

    def tcVolUpdate(self, event, slider, textctrl):
        slider.SetValue(int(textctrl.GetValue()))    


class MyApp(wx.App):
    def OnInit(self):
        frame = ex2(None, -1, 'Example 2')
        frame.ShowModal()
        frame.Destroy()
        return True
于 2016-05-09T10:15:03.523 に答える