Как разграничить два виджета в Python Kivy?
Используется два виджета часов, хотел расположить их один над другим, но в результате один всегда наплывает на другой, хотя использую для их копановки BoxLayout
import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.label import Label
from datetime import date
from datetime import time
from datetime import datetime
from kivy.uix.widget import Widget
from kivy.graphics import Color, Line
from kivy.uix.floatlayout import FloatLayout
from math import cos, sin, pi
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import NumericProperty
import time
import datetime
kv = '''
#:import math math
[ClockNumber@Label]:
text: str(ctx.i)
pos_hint: {"center_x": 0.5+0.42*math.sin(math.pi/6*(ctx.i-12)), "center_y": 0.5+0.42*math.cos(math.pi/6*(ctx.i-12))}
font_size: self.height/16
<MyClockWidget>:
face: face
ticks: ticks
FloatLayout:
id: face
size_hint: None, None
pos_hint: {"center_x":0.5, "center_y":0.5}
size: 0.9*min(root.size), 0.9*min(root.size)
canvas:
Color:
rgb: 0.1, 0.1, 0.1
Ellipse:
size: self.size
pos: self.pos
ClockNumber:
i: 1
ClockNumber:
i: 2
ClockNumber:
i: 3
ClockNumber:
i: 4
ClockNumber:
i: 5
ClockNumber:
i: 6
ClockNumber:
i: 7
ClockNumber:
i: 8
ClockNumber:
i: 9
ClockNumber:
i: 10
ClockNumber:
i: 11
ClockNumber:
i: 12
Ticks:
id: ticks
r: min(root.size)*0.9/2
'''
Builder.load_string(kv)
class MyClockWidget(FloatLayout):
pass
class IncrediblyCrudeClock(Label):
def update(self, *args):
self.text = time.asctime()
class Ticks(Widget):
def __init__(self, **kwargs):
super(Ticks, self).__init__(**kwargs)
self.bind(pos=self.update_clock)
self.bind(size=self.update_clock)
def update_clock(self, *args):
self.canvas.clear()
with self.canvas:
time = datetime.datetime.now()
Color(0.2, 0.5, 0.2)
Line(points=[self.center_x, self.center_y, self.center_x+0.8*self.r*sin(pi/30*time.second), self.center_y+0.8*self.r*cos(pi/30*time.second)], width=1, cap="round")
Color(0.3, 0.6, 0.3)
Line(points=[self.center_x, self.center_y, self.center_x+0.7*self.r*sin(pi/30*time.minute), self.center_y+0.7*self.r*cos(pi/30*time.minute)], width=2, cap="round")
Color(0.4, 0.7, 0.4)
th = time.hour*60 + time.minute
Line(points=[self.center_x, self.center_y, self.center_x+0.5*self.r*sin(pi/360*th), self.center_y+0.5*self.r*cos(pi/360*th)], width=3, cap="round")
class TestApp(App):
def build(self):
Full_BL=BoxLayout(orientation='vertical')
clock = MyClockWidget()
Clock.schedule_interval(clock.ticks.update_clock, 1)
Clock_FloatLayOut=FloatLayout()
Clock_BoxLayOut=BoxLayout()
crudeclock = IncrediblyCrudeClock()
crudeclock_LayOut=BoxLayout()
Clock.schedule_interval(crudeclock.update, 1)
Clock_FloatLayOut.add_widget(clock)
Clock_BoxLayOut.add_widget(Clock_FloatLayOut)
crudeclock_LayOut.add_widget(crudeclock)
Full_BL.add_widget(Clock_BoxLayOut)
Full_BL.add_widget(crudeclock_LayOut)
return Full_BL
if __name__ == '__main__':
TestApp().run()
Ответы (1 шт):
Автор решения: xXZyzzXx
→ Ссылка
'''<MyClockWidget>:
Ticks:
pos_hint: {"center_x":0.5, "center_y":0.5}
id: ticks
r: min(root.size)*0.9/2
'''
Builder.load_string(kv)
class TestApp(App):
def build(self):
Full_BL = BoxLayout(orientation='vertical', size_hint=(.5, .5), pos_hint=({'center_x': .5, 'center_y': .5}))
clock = MyClockWidget(size_hint_y=.9)
Clock.schedule_interval(clock.ticks.update_clock, 1)
crudeclock = IncrediblyCrudeClock(size_hint_y=.1)
Clock.schedule_interval(crudeclock.update, 1)
Full_BL.add_widget(crudeclock)
Full_BL.add_widget(clock)
return Full_BL
if __name__ == '__main__':
TestApp().run()
