Je ne pouvais pas comprendre pleinement le comportement de pythonista3, j'ai donc essayé divers attributs flex de ui.View pour approfondir ma compréhension.
Faire glisser les quatre coins de l'écran modifie la taille, de sorte que vous pouvez vérifier visuellement les changements dans chaque mouvement.
ui_flex01.py
import ui
class ResizableView(ui.View):
STA_IDLE = 1 #Attendre
STA_MOVE_LT = 2 #Déplacer vers le coin supérieur gauche
STA_MOVE_LB = 3 #Déplacer vers le bas à gauche
STA_MOVE_RT = 4 #Déplacer vers le coin supérieur droit
STA_MOVE_RB = 5
STA_MOVE = 6
def __init__(self):
self.m_state = self.STA_IDLE
def touch_began(self, touch):
l = self.width * 0.1
r = self.width * 0.9
t = self.height * 0.1
b = self.height * 0.9
self.m_state = self.STA_IDLE
if touch.location.x < l:
if touch.location.y < t:
self.m_state = self.STA_MOVE_LT
if touch.location.y >= b:
self.m_state = self.STA_MOVE_LB
if touch.location.x >= r:
if touch.location.y < t:
self.m_state = self.STA_MOVE_RT
if touch.location.y >= b:
self.m_state = self.STA_MOVE_RB
if self.m_state == self.STA_IDLE:
self.m_state = self.STA_MOVE
def touch_moved(self, touch):
s = self.m_state
vx = touch.location.x - touch.prev_location.x
vy = touch.location.y - touch.prev_location.y
if s == self.STA_IDLE:
pass
elif s == self.STA_MOVE_LT:
self.x += vx
self.y += vy
self.width -= vx
self.height -= vy
elif s == self.STA_MOVE_RT:
self.width += vx
self.y += vy
self.height -= vy
elif s == self.STA_MOVE_LB:
self.x += vx
self.width -= vx
self.height += vy
elif s == self.STA_MOVE_RB:
self.width += vx
self.height += vy
elif s == self.STA_MOVE:
self.x += vx
self.y += vy
def touch_ended(self, touch):
self.m_state = self.STA_IDLE
datas = (
('RB',0,0,30,30),
('LB',270,0,30,30),
('RT',0,370,30,30),
('LT',270,370,30,30),
('W',50,40,200,50),
('H',50,100,50,250),
('R',100,100,100,50),
('L',100,100,100,50),
('LR',100,100,100,50),
('RW',100,160,100,50),
('LW',100,220,100,50),
('RTW',110,300,50,50),
('LTH',200,300,50,50),
('',150,220,100,50),
('RW',100,280,30,50),
('RW',150,280,30,50),
('RW',200,280,30,50),
('RLW',100,340,30,50),
('RLW',150,340,30,50),
('RLW',200,340,30,50),
)
p = ui.View()
v = ResizableView()
v.width = 300
v.height = 400
v.background_color = '#808080'
p.add_subview(v)
for d in datas:
l = ui.Label()
l.border_width = 2
l.alignment = ui.ALIGN_CENTER
l.text = l.flex = d[0]
l.frame = (d[1],d[2],d[3],d[4])
v.add_subview(l)
p.present('fullscreen')
v.width = p.width
v.height = p.height
Vous pouvez définir flex pour changer automatiquement votre position (x, y) et votre taille (largeur, hauteur) lorsque la vue parent se redimensionne.
Les caractères R, B, L, T, W et H peuvent être spécifiés et plusieurs combinaisons peuvent être spécifiées.
Si vous spécifiez un caractère vide pour flex, x, y, largeur et hauteur ne sont pas affectés par le redimensionnement de la vue parent. C'est le même comportement que lorsque «R» ou «RB» est spécifié.
Spécifier «L» pour flex donne une marge gauche flexible. Traduit littéralement, la marge gauche change de manière flexible. Si vous le traduisez librement, il restera à l'extrémité droite de la vue parent.
Cela signifie que cette vue restera à droite lorsque la taille de la vue parent change.
Comme «L»
«R» est attaché au bord gauche de la vue parent «B» est attaché en haut de la vue parent. (Comportement par défaut) «T» est attaché au bord inférieur de la vue parent
Ce sera.
Personnellement, le sens de LRBT est exactement le contraire, mais suis-je le seul à le penser?
Si vous spécifiez «W», la largeur changera en fonction du changement de taille du parent. Si vous spécifiez «H», la hauteur changera en fonction du changement de taille du parent.
Je souhaite organiser plusieurs boutons à intervalles égaux, même si la taille du parent change. Je vais l'utiliser à ce moment-là. Dans la plupart des cas, il est également nécessaire de changer la taille, donc je pense que «RLW» et «BTH» sont souvent utilisés en plus de WH.