python - 如何将 wx.Slider 与 SELRANGE 一起使用?

标签 python slider wxwidgets

wx.Slider(wxPython for py2wxPython for py3wxWidgets)的文档中,列出了一个名为wx.SL_SELRANGE的小部件控件,定义允许“用户在 slider 上选择一个范围(仅限 MSW)”。对我来说,这就是双控制,同一轴上的两个 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 文档都在谈论它,但是用户应该如何能够“选择 slider 上的范围”,如此处所示(取自 shiny)?

enter image description here

我错过了什么?是否有任何具有此功能的 wxPython wx.Slider 的合理公共(public)示例?

附言:

  • 我找到的一个页面只提到了 WinXP,但由于该页面已经七年没有更新,所以我认为它在版本限制方面不具有权威性。
  • 我一直在使用 wxGlade 进行 gui 布局,但我当然愿意/能够在导出后进入代码并进行处理。

系统:win81_64,python-2.7.10,wxPython-3.0.2.0

最佳答案

我为此做了一个自定义实现,部分使用了来自 this question 的代码。左键单击 slider 区域设置范围的左边界,右击设置范围的右边界。拖动 slider 移动选择。 left_gapright_gap 指示小部件边缘与绘制 slider 的实际开始之间的空白空间。与来源一样,这些必须通过实验找出。

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

关于python - 如何将 wx.Slider 与 SELRANGE 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30770011/

相关文章:

c++ - wxSpinCtrl 不生成事件

python - 来自 IP 跨网络的 MAC 地址

当在屏幕中添加外星人时,Python Pygame 船移动缓慢

php - 如何使表单提交按钮也重定向到页面中的特定 div?

css - 如何将自动播放(自动移动/自动滑动)添加到 csslider?

javascript - 尝试使用 id==valores0 注册小部件,但该 id 已注册

c++ - 如何在wxWIdgets中显示清晰的图标

python - 从大文件中提取特定行

python - Pygame 将 28x28 像素缩放到 420x420

linux - wxWidgets 链接问题