Looking to minimize changes to your code, I created a dummy screen as the first screen. This forces a transition that makes the on_enter event fire when the screen is changed to ‘ScreenOne’. I also set the initial size of the ellipse to 0,0
I recommend you change the button to a BoxLayout with ButtonBehavior. The Button uses images that are a little smaller than the enclosing layout (a size effect of the subtle 3d button size). Use the canvas to draw the desired background color. This will provide a full size background button.
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.screenmanager import Screen, ScreenManager
Builder.load_string(
"""
<ButtonBubble>:
left_button: left_button
right_button: right_button
Widget: # a widget not a relative layout
)
class ButtonBubble(RelativeLayout):
bubble_size = ListProperty([0, 0])
bubble_position = ListProperty([0, 0])
def get_pos(self):
side = min(self.left_button.width, self.left_button.height)
print(f'Side: {side}')
self.bubble_size = (side, side)
pos_x = (self.left_button.width - side) / 2 + self.left_button.pos[0]
pos_y = (self.left_button.height - side) / 2 + self.left_button.pos[1]
self.bubble_position = (pos_x, pos_y)
print(f'Pos: {self.left_button.pos}')
class DummyScreen(Screen):
pass
class ScreenOne(Screen):
# def on_size(self, *args):
# print('ScreenOne.on_size')
# self.btns.get_pos()
# def on_pre_enter(self, *args):
# print('ScreenOne.on_pre_enter')
# self.btns.get_pos()
def on_enter(self, *args):
print('ScreenOne.on_enter')
self.btns.get_pos()
# def on_kv_post(self, base_widget):
# print('ScreenOne.on_kv_post')
# self.btns.get_pos()
class ScreenTwo(Screen):
# def on_size(self, *args):
# print('ScreenTwo.on_size')
# self.btns.get_pos()
# def on_pre_enter(self, *args):
# print('ScreenTwo.on_pre_enter')
# self.btns.get_pos()
def on_enter(self, *args):
print('ScreenTwo.on_enter')
self.btns.get_pos()
#
# def on_kv_post(self, base_widget):
# print('ScreenTwo.on_kv_post')
# self.btns.get_pos()
class MyApp(App):
sm = None
def build(self):
self
.sm = ScreenManager()
self.sm.add_widget(DummyScreen(name='dummy'))
self.sm.add_widget(ScreenOne(name='ScreenOne'))
self.sm.add_widget(ScreenTwo(name='ScreenTwo'))
self.sm.current = 'ScreenOne'
return self.sm
--
You received this message because you are subscribed to the Google Groups "Kivy users support" group.
To unsubscribe from this group and stop receiving emails from it, send an email to kivy-users+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/kivy-users/9e581d8f-340e-491f-81d0-5a9cecab3a4en%40googlegroups.com.
On Sep 24, 2022, at 8:39 PM, Barbarur <alvaro.a...@gmail.com> wrote:
To view this discussion on the web visit https://groups.google.com/d/msgid/kivy-users/0fe0f7d1-7d35-4234-a139-d046f870b839n%40googlegroups.com.
Here is a reorganization of widgets that draws the ball. The ball is now it’s own widget. This will simplify animating the Ball.
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen
from kivy.uix.widget import Widget
kv = """
<Ball>:
size_hint: None, None
canvas:
Color:
rgba: 1, 0, 0, 1
Ellipse:
size: self.size
pos: self.pos
<ButtonBubble>:
orientation: 'horizontal'
spacing: self.width * .1
padding: self.width * .1
Button:
id: left_button
background_color: 0, 1, 0, .5
on_press:
Button:
id: right_button
background_color: 0, 1, 0, .5
on_press: app.root.current = 'ScreenTwo'
<BScreen>:
ButtonBubble:
id: btns
Ball:
size: self.set_size(btns.ids.left_button.width, btns.ids.left_button.height)
pos: self.set_pos(btns.ids.left_button.size, btns.ids.left_button.pos)
ScreenManager:
BScreen:
name: 'ScreenOne'
BScreen:
name: 'ScreenTwo'
"""
class Ball(Widget):
def set_size(self, w, h):
return min(w, h), min(w, h)
def set_pos(self, b_size, b_pos): # button size and pos
x = (b_size[0] - self.height) / 2 + b_pos[0]
y = (b_size[1] - self.height) / 2 + b_pos[1]
return x, y
class ButtonBubble(BoxLayout):
pass
class BScreen(Screen):
pass
class MyApp(App):
def build(self):
return Builder.load_string(kv)
To view this discussion on the web visit https://groups.google.com/d/msgid/kivy-users/9F8E43B6-0E4A-4996-8679-C3ECFE74459A%40cox.net.