在 wxPython 大小的面板中创建滑块会错误地显示标签,如下所示:
以下是我可以编写的用于演示该问题的最小程序。
from typing import cast
from wx import App
from wx import DEFAULT_FRAME_STYLE
from wx import FRAME_FLOAT_ON_PARENT
from wx import ID_ANY
from wx import SL_AUTOTICKS
from wx import SL_HORIZONTAL
from wx import SL_LABELS
from wx import Slider
from wx.lib.sized_controls import SizedFrame
from wx.lib.sized_controls import SizedPanel
WINDOW_WIDTH: int = 400
WINDOW_HEIGHT: int = 200
class SliderBugApp(App):
def __init__(self):
super().__init__()
self._frameTop: SizedFrame = cast(SizedFrame, None)
def OnInit(self) -> bool:
title: str = 'Demo Buggy Slider'
frameStyle: int = DEFAULT_FRAME_STYLE | FRAME_FLOAT_ON_PARENT
self._frameTop = SizedFrame(parent=None, id=ID_ANY, size=(WINDOW_WIDTH, WINDOW_HEIGHT), style=frameStyle, title=title)
sizedPanel: SizedPanel = self._frameTop.GetContentsPane()
slideStyle: int = SL_HORIZONTAL | SL_AUTOTICKS | SL_LABELS
Slider(sizedPanel, id=ID_ANY, value=100, minValue=25, maxValue=100, style=slideStyle)
self._frameTop.Show(True)
return True
testApp = SliderBugApp()
testApp.MainLoop()
有人有什么想法吗?
我在wxPython社区站点问了上述问题;奇怪的是,上面的代码可以在非 macOS 环境下运行。
那里的一位绅士顽强地调查了这一点,并想出了一个解决方法
本质上,它涉及将滑块组件包装在非“大小”面板中,并将该面板嵌入“大小”组件中。
我在这里发布解决方法。
from typing import cast
from wx import App
from wx import BoxSizer
from wx import DEFAULT_FRAME_STYLE
from wx import EXPAND
from wx import FRAME_FLOAT_ON_PARENT
from wx import VERTICAL
from wx import ID_ANY
from wx import SL_AUTOTICKS
from wx import SL_HORIZONTAL
from wx import SL_LABELS
from wx import Slider
from wx import Panel
from wx.lib.sized_controls import SizedFrame
from wx.lib.sized_controls import SizedPanel
WINDOW_WIDTH: int = 400
WINDOW_HEIGHT: int = 200
class SliderBugApp(App):
def __init__(self):
super().__init__()
self._frameTop: SizedFrame = cast(SizedFrame, None)
def OnInit(self) -> bool:
title: str = 'Demo Buggy Workaround Slider'
frameStyle: int = DEFAULT_FRAME_STYLE | FRAME_FLOAT_ON_PARENT
self._frameTop = SizedFrame(parent=None, id=ID_ANY, size=(WINDOW_WIDTH, WINDOW_HEIGHT), style=frameStyle, title=title)
sizedPanel: SizedPanel = self._frameTop.GetContentsPane()
sliderPanel: Panel = Panel(sizedPanel)
sizer: BoxSizer = BoxSizer(VERTICAL)
sliderStyle: int = SL_HORIZONTAL | SL_AUTOTICKS | SL_LABELS
slider: Slider = Slider(sliderPanel, id=ID_ANY, value=100, minValue=25, maxValue=100, style= sliderStyle)
sizer.Add(slider, 1, EXPAND, 0)
sliderPanel.SetSizer(sizer)
self._frameTop.Show(True)
return True
testApp = SliderBugApp()
testApp.MainLoop()