I do not understand kivy at all. I’ve watched so many tutorials and examples and for the life of me I still can’t accomplish the simple task of drawing a rectangle on my kv screen. I’ve been trying to keep to the “do all graphics in kv lang and logic in python” approach that the kivy docs recommended.
Anyway I just want to draw a green rectangle over my existing screen to use as a progress bar – so ideally my python app will control the width of the rectangle so represent progress of an event. But I’ve been stuck here forever. Whatever I do, I just get a green square on the bottom left of the screen, I can’t seem to move it or change its size no matter what I put. And I definitely can’t control the size from the python code at the moment.
Can someone please help my understand how I could add a rectangle to my float layout screen (and have its width be modifiable from the python code)? Thanks a bunch for any advice
Relevant (heavily trimmed down) code below:
KV Code:
<RS_Dock_Screen>:
name: 'rs_dock'
FloatLayout:
id:dock_layout
Image:
source: f'{root.mimic_directory}/Mimic/Pi/imgs/russian/ROSdockBackground.png'
fit_mode: "fill"
Label:
id: ros_mode
pos_hint: {"center_x": 0.33, "center_y": 0.73}
text: '-'
font_size: 16
text_size: 300,None
halign: 'left'
markup: True
color: root.signalcolor
Widget:
id: docking_bar
#size_hint: 0.5,0.5
#pos_hint: {'center_x':0.6,'center_y':0.6}
#pos: 800 * 0.53, 600 * 0.205
#size: 800 * 0.325, 600 * 0.04
pos: 400,400
size: 600,10
canvas.after:
Color:
rgba: 0, 1, 0, 0.5
Rectangle:
pos: self.pos
size: self.size
Python Code:
from kivy.app import App
from kivy.lang import Builder
from kivy.network.urlrequest import UrlRequest #using this to request webpages
from kivy.clock import Clock
from kivy.event import EventDispatcher
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen, SwapTransition, NoTransition
from kivy.uix.popup import Popup
from kivy.uix.label import Label
mimic_data_directory = Path.home() / '.mimic_data'
mimic_directory = op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
class MainScreen(Screen):
mimic_directory = op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
class RS_Dock_Screen(Screen, EventDispatcher):
mimic_directory = op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
signalcolor = ObjectProperty([1, 1, 1])
class MainScreenManager(ScreenManager):
mimic_directory = op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
class MainApp(App):
mimic_directory = op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
ros_data = []
def build(self):
global startup, ScreenList, stopAnimation
self.main_screen = MainScreen(name = 'main')
self.rs_dock = RS_Dock_Screen(name='rs_dock')
self.rs_eva = EVA_RS_Screen(name='rs_eva')
self.rs_screen = RS_Screen(name='rs')
root = MainScreenManager(transition=NoTransition())
root.add_widget(self.main_screen)
root.add_widget(self.rs_dock)
root.add_widget(self.rs_eva)
root.add_widget(self.rs_screen)
root.current = 'main' #change this back to main when done with eva setup
return root
def update_labels(self, dt):
value = 1
#self.rs_dock.update_progress(value)
print(self.rs_dock.ids.dock_layout.width)
#self.rs_dock.ids.docking_bar.size = (self.rs_dock.ids.dock_layout.width * value * 0.325, self.rs_dock.ids.dock_layout.height * 0.04)
#All GUI Screens are on separate kv files
Builder.load_file(mimic_directory + '/Mimic/Pi/Screens/MainScreen.kv')
Builder.load_file(mimic_directory + '/Mimic/Pi/Screens/RS_Dock_Screen.kv')
Builder.load_string('''
#:kivy 1.8
#:import kivy kivy
#:import win kivy.core.window
ScreenManager:
MainScreen:
RS_Dock_Screen:
''')
if __name__ == '__main__':
MainApp().run()