2015-06-11 29 views
4

在文檔wx.SliderwxPython for py2,wxPython for py3,wxWidgets)中,列出了一個名爲wx.SL_SELRANGE的窗口小部件控件,其定義爲允許「用戶選擇滑塊上的範圍(僅限MSW)」。對我來說,這是爲了定義一個低/高範圍,在同一軸上說雙控制,兩個滑塊。我無法讓它顯示兩個控件。如何在SELRANGE中使用wx.Slider?

讓它開始的基本代碼。我甚至不擔心方法,事件或此刻的事情,只是爲了展示一些東西。

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     # ... sizers and other stuff 
     self.myslider = wx.Slider(self.notebook_1_pane_2, wx.ID_ANY, 0, -100, 100, style=wx.SL_SELRANGE) 
     # ... 
     self.myslider.SetSelection(10, 90) 

有了這一切,我已經能夠得到它顯示最多的是一條藍線跨越約在那裏我會想到事情會。

enter image description here

的wxPython的文檔都在談論它,但怎麼會是用戶應該能夠「選擇滑塊上的一系列」一樣,這裏顯示(從shiny拍攝)?

enter image description here

我缺少什麼?有沒有任何合理的公共示例wxPython wx.Slider在這個功能野外?

PS:

  • 一頁我發現只有講的WinXP,但是因爲該頁面尚未七年更新,我不認爲這是權威的版本限制。
  • 我一直在使用wxGlade進行GUI佈局,但是我肯定願意/能夠在導出和解決問題後進入代碼。

系統:win81_64,蟒蛇-2.7.10,wxPython的-3.0.2.0

+0

嗨,你有沒有想過呢?有同樣的問題,並沒有在網上找到任何東西。 –

+0

沒有找到,儘管我最近沒有看過。我應該檢查包是否有相關的更新。 – r2evans

+0

不是。我做了一個自定義實現,我將其作爲答案發布。 –

回答

0

我已經爲這個自定義實現,部分原因是使用代碼this question。左鍵單擊滑塊區域設置範圍的左邊框,右鍵單擊設置右邊框。拖動滑塊可移動選區。 left_gapright_gap指示小部件的邊緣與繪製的滑塊的實際開始之間的空白空間是什麼。就像來源一樣,這些必須通過實驗找出來。

class RangeSlider(wx.Slider): 
def __init__(self, left_gap, right_gap, *args, **kwargs): 
    wx.Slider.__init__(self, *args, **kwargs) 
    self.left_gap = left_gap 
    self.right_gap = right_gap 
    self.Bind(wx.EVT_LEFT_UP, self.on_left_click) 
    self.Bind(wx.EVT_RIGHT_UP, self.on_right_click) 
    self.Bind(wx.EVT_SCROLL_PAGEUP, self.on_pageup) 
    self.Bind(wx.EVT_SCROLL_PAGEDOWN, self.on_pagedown) 
    self.Bind(wx.EVT_SCROLL_THUMBTRACK, self.on_slide) 

    self.slider_value=self.Value 
    self.is_dragging=False 

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

# if left click set the start of selection 
def on_left_click(self, e): 

    if not self.is_dragging: #if this wasn't a dragging operation 
     position = self.get_position(e) 
     if position <= self.SelEnd: 
      self.SetSelection(position, self.SelEnd) 
     else: 
      self.SetSelection(self.SelEnd, position) 
    else: 
     self.is_dragging = False 
    e.Skip() 

# if right click set the end of selection 
def on_right_click(self, e): 
    position = self.get_position(e) 
    if position >= self.SelStart: 
     self.SetSelection(self.SelStart, position) 
    else: 
     self.SetSelection(position, self.SelStart) 
    e.Skip() 

# drag the selection along when sliding 
def on_slide(self, e): 
    self.is_dragging=True 
    delta_distance=self.Value-self.slider_value 
    self.SetSelection(self.SelStart+delta_distance, self.SelEnd+delta_distance) 
    self.slider_value=self.Value 

# disable pageup and pagedown using following functions 
def on_pageup(self, e): 
    self.SetValue(self.Value+self.PageSize) 

def on_pagedown(self, e): 
    self.SetValue(self.Value-self.PageSize) 

# get click position on the slider scale 
def get_position(self, e): 
    click_min = self.left_gap #standard size 9 
    click_max = self.GetSize()[0] - self.right_gap #standard size 55 
    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 

    return result