学习wxpython控件wx.Slider的地址:https://docs.wxpython.org/wx.Slider.html?highlight=wx%20slider#wx.Slider
1. 将滑块slider竖放,满足越往上拉动滑块显示的数值越大,反之越小
使用wxFormBuilder工具搭建基础的界面,滑块slider常用的两种放置方式:横放(默认的),竖放。
在工具栏选择常用控件Common的滑块slider控件后,wxFormBuilder工具默认滑块slider控件放置方式是”横放“。
修改滑块slider属性的style选择“wxSL_VERTICAL",将滑块slider的放置方式改为”竖放“。但竖着放置后滑块slider属性显示的maxValue在底部,minValue在顶部,意味着越往上拉动滑块显示的数值越小,越往下拉动滑块显示的数值越大,从感官上不是很理想,需要调整成越往上拉动滑块显示的数值越大,反之越小。
查看滑块slider的其他style,看是否有个style能够使滑块slider的最大值在顶部,最小值在底部。
发现配置wx.SL_INVERSE这个style可以满足需求。可以在wxFormBuilder工具属性界面增加滑块slider的style为wx.SL_INVERSE。
或者也可以直接修改生成的python代码,修改滑块slider的style:
self.m_slider1 = wx.Slider(sbSizer1.GetStaticBox(), wx.ID_ANY, 100, 0, 100, wx.DefaultPosition,
wx.Size(-1, 300), wx.SL_VERTICAL | wx.SL_MIN_MAX_LABELS | wx.SL_INVERSE)
2. 滑块slider的常用方法
2.1 GetValue()获取滑块的当前数值
GetValue()方法的适用场景:期望实现功能是拉动滑块的数值实时显示在文本框。
假设定义了10个滑块,每个滑块配置一个文本框用于显示滑块实时拉动的数值。
def set_slider_dict(self, idx):
slider_dict = {
0: self.m_slider1,
1: self.m_slider2,
2: self.m_slider3,
3: self.m_slider4,
4: self.m_slider5,
5: self.m_slider6,
6: self.m_slider7,
7: self.m_slider8,
8: self.m_slider9,
9: self.m_slider10
}
return slider_dict[idx]
def set_itemtextctrl_dict(self, idx):
textctrl_dict = {
0: self.m_textCtrl2,
1: self.m_textCtrl3,
2: self.m_textCtrl4,
3: self.m_textCtrl5,
4: self.m_textCtrl6,
5: self.m_textCtrl7,
6: self.m_textCtrl8,
7: self.m_textCtrl9,
8: self.m_textCtrl10,
9: self.m_textCtrl11
}
return textctrl_dict[idx]
给滑块对应的10个对象设置文本框显示滑块数值的功能,代码如下:
# 获取滑块的初始值
for i in range(len(item_list)):
value = self.set_slider_dict(i).GetValue()
self.set_itemtextctrl_dict(i).SetValue(str(value))
2.2 SetValue()设置滑块的当前数值
SetValue()方法的适用场景:期望实现功能是在文本框中键入数值按下”ENTER"建后,对应滑块自动跳到文本框输入的数值位置。
# 设置文本框键入数值事件,设置文本框的enter事件
self.m_textCtrl2.Bind(wx.EVT_TEXT_ENTER, self.change_slide_value_1)
def change_slide_value_1(self, event):
curr_value = int(self.m_textCtrl2.GetValue())
self.m_slider1.SetValue(curr_value)
注意:要实现文本框的”ENTER"建入事件,需要先设置文本框的style为wx.TE_PROCESS_ENTER。
对应python代码:
self.m_textCtrl2 = wx.TextCtrl(sbSizer1.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition,
wx.Size(80, -1), wx.TE_PROCESS_ENTER)
2.3 GetRange()获取滑块的取值范围
GetRange()方法的适用场景:期望实现功能是限制文本框输入数值范围,文本框的输入数值有效范围应该是对应滑块的取值范围。
使用滑块的GetRange()方法返回是元组形式存储的数值范围:
功能实现代码如下:
def change_slide_value_1(self, event):
slider_value_range = self.m_slider1.GetRange()
if int(self.m_textCtrl2.GetValue()) < slider_value_range[0]:
self.m_textCtrl2.SetValue(str(slider_value_range[0]))
elif int(self.m_textCtrl2.GetValue()) > slider_value_range[1]:
self.m_textCtrl2.SetValue(str(slider_value_range[1]))
curr_value = int(self.m_textCtrl2.GetValue())
self.m_slider1.SetValue(curr_value)
2.4 SetLineSize()设置滑块拉动的步长
wxFormBuilder工具生成滑块,默认滑块的拉动步长为1。
2.5 SetMax设置滑块的最大值,SetMin设置滑块的最小值
滑块的最大值和最小值可以在初始化框架界面的时候设置:
对应python代码:
self.m_slider1 = wx.Slider(sbSizer1.GetStaticBox(), wx.ID_ANY, 100, 0, 100, wx.DefaultPosition,
wx.Size(-1, 300), wx.SL_INVERSE | wx.SL_VERTICAL)
也可以根据滑块对应对象数据类型取值范围的需要,在不改变wxFormBuilder工具初始最大值和最小值设置的提前下,使用SetMax()和SetMin()方法自行修改设置。
例如:
self.SetSizer(bSizer1)
self.Layout()
self.Centre(wx.BOTH)
##************************************##
# slider基础设置
self.m_slider1.SetMax(100)
self.m_slider2.SetMax(99)
self.m_slider3.SetMax(100)
self.m_slider4.SetMax(99)