2012-04-01 10 views
3

ほとんどのメディアプレーヤーのスライダをエミュレートしたいと思います。スライダウィジェットの任意の場所をクリックすると、ビデオはその位置にスキップされます。マウスのクリックの下でスライダの値を取得し、その値を設定するにはどうすればよいですか? デフォルトでは、スライダをクリックすると、一度にページサイズごとにスクロールし、クリックした位置にはスクロールしません。マウスのクリックでwxpythonスライダの値を取得する

ありがとうございます!

+0

あなたは少なくともマウスのクリック位置を取得できますか? – jdi

答えて

0

スライダからの継承によって新しいコントロールを作成します。ベーススライダコントロールからの唯一の変更は、マウスクリックイベントを処理するメソッドをオーバーライドすることです。メソッドは2つのことを行う必要があります: 'ビデオをマウスクリックにスキップする'ルーチンを呼び出し、マウスクリックハンドラを使用して、視覚的なフィードバックの詳細を調べることができます。

4

次のコードはWindows XPで動作しますが、実験以外の方法でGAPの定数を取得する方法はわかりません。 GAPの値は、ウィジェットの端と描画されたスライダの実際の開始点との間の空きスペースを示します。

import wx 

GAP = 12 

class VideoSlider(wx.Slider): 
    def __init__(self, gap, *args, **kwargs): 
     wx.Slider.__init__(self, *args, **kwargs) 
     self.gap = gap 
     self.Bind(wx.EVT_LEFT_DOWN, self.OnClick) 

    def linapp(self, x1, x2, y1, y2, x): 
     return (float(x - x1)/(x2 - x1)) * (y2 - y1) + y1 

    def OnClick(self, e): 
     click_min = self.gap 
     click_max = self.GetSize()[0] - self.gap 
     click_position = e.GetX() 
     result_min = self.GetMin() 
     result_max = self.GetMax() 
     if click_position > click_min and click_position < click_max: 
      result = self.linapp(click_min, click_max, 
           result_min, result_max, 
           click_position) 
     elif click_position <= click_min: 
      result = result_min 
     else: 
      result = result_max 
     self.SetValue(result) 
     e.Skip() 

class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = wx.Panel(self) 
     self.slider = VideoSlider(parent=self.panel, size=(300, -1), gap=GAP) 
     self.slider.Bind(wx.EVT_SLIDER, self.OnSlider) 

     self.sizer = wx.BoxSizer() 
     self.sizer.Add(self.slider) 

     self.panel.SetSizerAndFit(self.sizer) 
     self.Show()  

    def OnSlider(self, e): 
     print(self.slider.GetValue())  

app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 
+0

ありがとう、私はこのコードを使用し、それを修正して(Windows 7)、左右のギャップが同じではないので、LEFT_GAPとRIGHT_GAPを別々に指定しなければなりませんでした。 –

関連する問題