wxPython 滑块无法正确显示尺寸面板

问题描述 投票:0回答:1

在 wxPython 大小的面板中创建滑块会错误地显示标签,如下所示:

enter image description here

以下是我可以编写的用于演示该问题的最小程序。

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()

有人有什么想法吗?

python wxpython
1个回答
0
投票

我在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()
© www.soinside.com 2019 - 2024. All rights reserved.