KivyMD: как изменить активный элемент MDSegmentedControlPython

Программы на Python
Ответить
Anonymous
 KivyMD: как изменить активный элемент MDSegmentedControl

Сообщение Anonymous »

Я не знаю, как изменить активный (выделенный) сегмент MDSegmentedControl в KivyMD, не касаясь его (например, после загрузки данных из базы данных и открытия экрана). Я могу установить для свойства current_active_segment один из MDSegmentedControlItem, но это не повлияет на пользовательский интерфейс. Пример кода ниже:
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.metrics import dp
from kivy.input.providers.mouse import MouseMotionEvent
from kivy.clock import Clock

kvFloatLayout = """
MDScreen:
id: mdscr

MDBoxLayout:
orientation: "vertical"
adaptive_height: True
pos_hint: {"top": 1}
spacing: "12dp"

MDTopAppBar:
id: top_app_bar
pos_hint: {"top": 1}
title: "Test App"
elevation: 4

MDBoxLayout:
orientation: "vertical"
adaptive_height: True
pos_hint: {"top": 1}
padding: "12dp", "0dp", "12dp", "12dp"
spacing: "12dp"

MDRaisedButton:
id: btn_resize
text: "Resize"
on_release: app.seg_resize()

MDRaisedButton
id: btn_change
text: "Change selection"
on_release: app.seg_change_selection()

MDSegmentedControl:
id: seg_options
MDSegmentedControlItem:
id: sci_option1
text: "Option left"
MDSegmentedControlItem:
id: sci_option2
text: "Option right"

"""

class TestApp(MDApp):

def build(self):
return Builder.load_string(kvFloatLayout)

def seg_resize(self):
#Workaround from stackoverflow (size not working in .kv - https://stackoverflow.com/questions/749 ... ntrol-size)
self.root.ids.seg_options.ids.segment_panel.width = (Window.width - dp(24))

def seg_change_selection(self):
sc = self.root.ids.seg_options
print("---sc:")
print(sc)
sci = self.root.ids.sci_option2
print("---sci:")
print(sci)
print("---sc.current_active_segment before:")
print(sc.current_active_segment)
sc.current_active_segment = sci
print("---sc.current_actilve_segment after:")
print(sc.current_active_segment.text)
#A poor workaround with mouse click:
#Clock.schedule_once(self.simulate_mouse_click, 1)

def simulate_mouse_click(self, *args):
x = 0.75*Window.width
y = Window.height - \
self.root.ids.top_app_bar.height - \
self.root.ids.btn_resize.height - \
self.root.ids.btn_change.height - \
dp(12) * 3 - 40
touch = MouseMotionEvent(None, 0, (x,y)) # args are device, id, spos
touch.button = 'left'
touch.pos = (x,y)
touch.x = touch.px = touch.ox = x
touch.y = touch.py = touch.oy = y
print("---touch")
print(str(touch))
Window.dispatch('on_touch_down', touch)
#1/0

TestApp().run()


Есть идеи или обходные пути?
Единственный способ заставить это работать — запланировать щелчок мышью по нужному элементу сегмента, но, конечно, это далеко не хорошее и надежное решение. Вот эта часть кода:
#Clock.schedule_once(self.simulate_mouse_click, 1)


Подробнее здесь: https://stackoverflow.com/questions/778 ... tedcontrol
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»