2012-04-01 41 views
3

我希望模擬或大多數媒體播放器的滑塊 - 點擊滑塊小部件上的任意位置可將視頻跳到該位置。如何在鼠標點擊下獲得滑塊的值並將其設置爲該值? 默認情況下,當單擊滑塊時,它一次只滾動頁面大小,而不滾動到用戶單擊的位置。在鼠標點擊下獲取wxpython滑塊的值

謝謝!

+0

您是否至少能夠獲得鼠標點擊位置? – jdi 2012-04-01 03:13:33

回答

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'。 – 2016-02-02 15:16:50