You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Kivy中通过弹出滑块修改RSTDocument的基础字体大小?

如何通过Kivy Slider动态修改RstDocument的base_font_size?

我看了你的代码,问题主要出在没有建立Slider和RstDocument之间的双向绑定关系,而且Popup的调用逻辑也需要调整才能让数值同步。咱们来一步步修改:

核心修改思路

  1. 给主界面RST_GUI添加一个可绑定的数值属性,用来存储当前字体大小;
  2. RstDocumentbase_font_size绑定到这个属性,实现实时同步;
  3. 在Popup的Slider上设置事件,让滑块值变化时更新主界面的字体大小属性;
  4. 同时让Slider的初始值和主界面属性保持一致,避免每次打开Popup都重置。

修改后的完整代码

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.properties import NumericProperty  # 新增:导入数值属性

Builder.load_string('''
<RST_GUI>:
    padding: 5
    spacing: 2
    orientation: 'vertical'
    BoxLayout:
        size_hint: (.5, .1)
        pos_hint: {'center_x': .5, 'center_y': 0.5}
        Button:
            text: 'Font Size'
            on_press: root.font_size()
    BoxLayout:
        TextInput:
            id: textinput
            tab_width: 5
        Splitter:
            sizeable_from: 'right'
            min_size: '5'
            RstDocument:
                show_errors: True
                base_font_size: root.base_font_size  # 修改:绑定到主界面的属性
                text: textinput.text

<font_size>:
    size_hint: (.5, .3)
    pos_hint: {'center_x': .5, 'center_y': 0.5}
    title: "Font size: " + str(int(self.ids.slider_id.value))  # 动态显示当前值
    Slider:
        min: 20
        max: 50
        value: app.root.base_font_size  # 修改:初始值同步主界面的字体大小
        step: 1
        id: slider_id
        on_value: app.root.base_font_size = self.value  # 修改:滑块值变化时更新主界面属性
''')

class RST_GUI(BoxLayout):
    # 新增:定义可绑定的字体大小属性,初始值31
    base_font_size = NumericProperty(31)

    def font_size(self):
        # 打开Popup,每次打开都会同步当前字体大小
        font_size().open()

class font_size(Popup):
    pass

class RST(App):
    def build(self):
        return RST_GUI()

if __name__ == '__main__':
    RST().run()

关键修改点说明

  • 添加NumericPropertyRST_GUI里的base_font_size是Kivy的可绑定属性,当它的值变化时,所有绑定它的控件都会自动更新;
  • 绑定RstDocument的字体大小:把RstDocumentbase_font_size直接绑定到root.base_font_size,这样主界面属性变了,文档字体就跟着变;
  • Slider的双向同步:Slider的初始值设为app.root.base_font_size,打开Popup时直接显示当前字体大小;同时通过on_value事件,把滑块的新值同步回主界面的属性;
  • 动态更新Popup标题:标题里用self.ids.slider_id.value实时显示当前滑块值,用户体验更好。

这样调整后,拖动Slider就能实时修改RstDocument的字体大小了,试试吧!

内容的提问来源于stack exchange,提问作者user8694101

火山引擎 最新活动