#python #kivy
Вопрос:
Я все еще новичок в киви и, похоже, не могу найти свое дело в другом месте. Я хочу получить доступ к методу внутри класса экрана из основного класса приложения:
class MainGUI(Screen):
d_travelled = StringProperty()
def update_distance(self,dt):
self.d_travelled = dt
class SecondaryGUI(Screen):
pass
class GUIManager(ScreenManager):
pass
class WindowGUI(App):
def __init__(self):
super().__init__()
self.odrive = myDrive.Motors()
threading.Thread(target = self.RobotControl).start()
def build(self):
self.title = 'MyTitle'
kv = all_imports.Builder.load_file('kv_styles/robot_3.kv')# which instantiate the GUIs
return kv
def RobotControl(self):
while True:
self.root.update_distance(self.odrive.encoder_cal()) <-----Error
У меня есть инструкция по роботу, в WindowGUI
которой нужно работать с киви бок о бок. Для начала я хотел бы отобразить показания кодера на моем MainGUI. Но self.root
в RobotControl
относится к GUIManager
. Конечно, это приводит к ошибке. Как я могу ссылаться на MainGUI
in RobotControl
? Можно ли ввести def update_distance(self,dt)
GUIManager
и MainGUI
отобразить показания кодера? если да, то как?
Мой файл kv:
#:kivy 2.0
#:import utils kivy.utils
GUIManager:
MainGUI:
SecondaryGUI:
<MainGUI>:
name: "main"
BoxLayout:
orientation: "horizontal"
size: root.width, root.height #covers entire window
padding: 15
GridLayout:
cols: 1
spacing: 10
size_hint_x: 0.4
# padding_right: 50
BoxLayout:
orientation:"horizontal"
size_hint: 1,.4
Label:
text: "Drop Distance"
size_hint: .75,0.1
Button:
id: zero_drop
text: "Zero"
size_hint: .25,.1
on_press:app.odrive.zero_encoder_read()
BoxLayout:
orientation: "horizontal"
TextInput:
id: Encoder
multiline: False
readonly: True
text: root.d_travelled <-------I want to display it here
size_hint_x: 0.75
Ответ №1:
Кредиты el3phanten с канала kivy discord. Вот как я решил свою проблему:
from kivy.clock import mainthread
class MainGUI(Screen):
# Do something
class SecondaryGUI(Screen):
pass
class GUIManager(ScreenManager):
pass
class WindowGUI(App):
d_travelled = StringProperty()
def __init__(self):
super().__init__()
self.odrive = myDrive.Motors()
threading.Thread(target = self.RobotControl).start()
def build(self):
self.title = 'MyTitle'
kv = all_imports.Builder.load_file('kv_styles/robot_3.kv')
return kv
def RobotControl(self):
while True:
val = self.odrive.encoder_cal()
self.set_val(val)
@mainthread
def set_val(self, val) :
self.d_travelled = val
И кв:
BoxLayout:
orientation: "horizontal"
TextInput:
id: Encoder
multiline: False
readonly: True
text: app.d_travelled
size_hint_x: 0.75