2012-04-01 4 views
3

슬라이더 위젯의 아무 곳이나 클릭하면 비디오가 해당 위치로 건너 뜁니다. 마우스 클릭 아래에서 슬라이더의 값을 가져오고 그 값을 어떻게 설정할 수 있습니까? 기본적으로 슬라이더를 클릭하면 한 번에 한 페이지 씩 스크롤되며 클릭 한 위치로 스크롤하지 않습니다.마우스 클릭시 wxpython 슬라이더 값 가져 오기

감사합니다.

+0

적어도 마우스 클릭 위치를 얻을 수 있습니까? – jdi

답변

0

슬라이더에서 상속을 통해 새 컨트롤을 만듭니다. 기본 슬라이더 컨트롤의 유일한 변경 사항은 마우스 클릭 이벤트를 처리하는 메서드를 재정의한다는 것입니다. 메서드는 두 가지 작업을 수행해야합니다. '마우스 클릭으로 비디오 건너 뛰기'에 사용하는 루틴 호출 및 기본 슬라이더 컨트롤 호출 마우스 클릭 핸들러를 사용하여 시각적 피드백 세부 사항을 살펴볼 수 있습니다.

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'을 따로 지정해야했다. –