Anonymous
Минимальная_высота Kivy ScrollView больше не является динамической с вложенными макетами в Python
Сообщение
Anonymous » 10 янв 2025, 03:17
В настоящее время я борюсь с вложенным макетом Kivy и представлением scorll.
Я динамически добавляю или удаляю таблицу с помощью некоторых кнопок.
По мере роста страницы я ожидаю, что self.minimum_height родительского макета CreatePly изменится, но это не так.
Есть ли аккуратный способ динамически изменить высоту моего просмотра прокрутки, или мне придется сделать это в стиле Caveman и увеличить ее вручную после создание каждого виджета?
Код Python:
Код: Выделить всё
#This file contains the graphical user interface logic of the DIS creator
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.metrics import dp
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.togglebutton import ToggleButton
class DIS3(App):
pass
class CreatePly(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
#Dimensional control
self.spacing = dp(2)
self.padding = dp(10)
self.cols = 1
self.size_hint = (1, None)
self.height = self.minimum_height #I expect this to dynamically change with the nested layouts. It does not.
#Varibales
self.constituent_name = []
self.constituent_areaweight = []
self.structural_toggle = []
#Add and remove consituents
#Header
self.add_remove_header = BoxLayout()
self.add_remove_header.size_hint = (1, None)
self.add_remove_header.height = dp(40)
label = Label(text="Add constituents to create a ply")
self.add_remove_header.add_widget(label)
self.add_widget(self.add_remove_header)
#Add remove buttons
self.add_remove_buttons = GridLayout()
self.add_remove_buttons.cols = 4
self.add_remove_buttons.size_hint = (1, None)
self.add_remove_buttons.height = dp(40)
self.add_remove_buttons.add_widget(Widget())
button = Button(text="+", size_hint=(None, None), width=dp(40), height=dp(40))
button.bind(on_press = lambda x: self.add_constituent_press())
self.add_remove_buttons.add_widget(button)
button = Button(text="-", size_hint=(None, None), width=dp(40), height=dp(40))
button.bind(on_press = lambda x: self.remove_constituent_press())
self.add_remove_buttons.add_widget(button)
self.add_remove_buttons.add_widget(Widget())
self.add_widget(self.add_remove_buttons)
#Constituent table
self.constituent_table = GridLayout()
self.constituent_table.cols = 3
label = Label(text="Consituent name", size_hint=(0.55, None), height=dp(20))
self.constituent_table.add_widget(label)
label = Label(text="Areal weight (g/m2)", size_hint=(0.3, None), height=dp(20))
self.constituent_table.add_widget(label)
label = Label(text="Structural?", size_hint=(0.15, None), height=dp(20))
self.constituent_table.add_widget(label)
textinput = TextInput(size_hint=(0.55, None), height=dp(40))
self.constituent_name.append(textinput)
self.constituent_table.add_widget(textinput)
textinput = TextInput(size_hint=(0.3, None), height=dp(40))
self.constituent_areaweight.append(textinput)
self.constituent_table.add_widget(textinput)
toggle = ToggleButton(text="No", size_hint=(0.15, None), height=(dp(40)))
toggle.bind(state=(lambda self, x: CreatePly.structural_constituent_toggle(self, toggle)))
self.structural_toggle.append(toggle)
self.constituent_table.add_widget(toggle)
self.add_widget(self.constituent_table)
#Build ply button
self.footer = GridLayout()
self.footer.cols = 3
self.footer.size_hint = (1, None)
self.footer.height = dp(40)
self.footer.add_widget(Widget())
button = Button(text="Create ply", size_hint=(None, None), width=dp(120), height=dp(40))
button.bind(on_press = lambda x: self.create_ply())
self.footer.add_widget(button)
self.footer.add_widget(Widget())
self.add_widget(self.footer)
#Functions
def structural_constituent_toggle(self, toggle):
if toggle.state == "normal":
toggle.text = "No"
else:
toggle.text = "Yes"
def add_constituent_press(self):
textinput = TextInput(size_hint=(0.55, None), height=(dp(40)))
self.constituent_name.append(textinput)
self.constituent_table.add_widget(textinput)
textinput = TextInput(size_hint=(0.3, None), height=(dp(40)))
self.constituent_areaweight.append(textinput)
self.constituent_table.add_widget(textinput)
toggle = ToggleButton(text="No", size_hint=(0.15, None), height=(dp(40)))
toggle.bind(state=(lambda self, x: CreatePly.structural_constituent_toggle(self, toggle)))
self.structural_toggle.append(toggle)
self.constituent_table.add_widget(toggle)
def remove_constituent_press(self):
if len(self.constituent_name) == 1:
pass
else:
self.constituent_table.remove_widget(self.constituent_name[-1])
del self.constituent_name[-1]
self.constituent_table.remove_widget(self.constituent_areaweight[-1])
del self.constituent_areaweight[-1]
self.constituent_table.remove_widget(self.structural_toggle[-1])
del self.structural_toggle[-1]
def create_ply(self):
pass
#Run loop
DIS3().run()
Код файла KV:
Код: Выделить всё
#This file contains the graphical user interface elements of the DIS creator app
#This is the layout of the entire screen
MainLayout:
:
#Background colour
canvas.before:
Color:
rgba:(.3,.3,.3,1)
Rectangle:
pos: self.pos
size: self.size
padding: '10dp'
spacing: '10dp'
MenuLayout:
FocusFrame:
#This is the layout for the menu
:
#Background colour
canvas.before:
Color:
rgba:(0,0,0,1)
Rectangle:
pos: self.pos
size: self.size
#Dimension control
size_hint: None, 1
width: "160dp"
spacing: "2dp"
padding: "10dp"
Button:
text: "Database"
size_hint: 1, None
height: "40dp"
Button:
text: "Create ply"
size_hint: 1, None
height: "40dp"
Button:
text: "Create preform"
size_hint: 1, None
height: "40dp"
Button:
text: "Plan infusion"
size_hint: 1, None
height: "40dp"
Button:
text: "Write DIS"
size_hint: 1, None
height: "40dp"
Button:
text: "Review DIS"
size_hint: 1, None
height: "40dp"
#This is the layout for the scrollable focus frame
:
canvas.before:
Color:
rgba:(0,0,0,1)
Rectangle:
pos: self.pos
size: self.size
CreatePly:
Заранее спасибо!
Подробнее здесь:
https://stackoverflow.com/questions/793 ... -in-python
1736468257
Anonymous
В настоящее время я борюсь с вложенным макетом Kivy и представлением scorll. Я динамически добавляю или удаляю таблицу с помощью некоторых кнопок. По мере роста страницы я ожидаю, что self.minimum_height родительского макета CreatePly изменится, но это не так. Есть ли аккуратный способ динамически изменить высоту моего просмотра прокрутки, или мне придется сделать это в стиле Caveman и увеличить ее вручную после создание каждого виджета? Код Python: [code]#This file contains the graphical user interface logic of the DIS creator from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.boxlayout import BoxLayout from kivy.metrics import dp from kivy.uix.widget import Widget from kivy.uix.button import Button from kivy.uix.label import Label from kivy.uix.textinput import TextInput from kivy.uix.togglebutton import ToggleButton class DIS3(App): pass class CreatePly(GridLayout): def __init__(self, **kwargs): super().__init__(**kwargs) #Dimensional control self.spacing = dp(2) self.padding = dp(10) self.cols = 1 self.size_hint = (1, None) self.height = self.minimum_height #I expect this to dynamically change with the nested layouts. It does not. #Varibales self.constituent_name = [] self.constituent_areaweight = [] self.structural_toggle = [] #Add and remove consituents #Header self.add_remove_header = BoxLayout() self.add_remove_header.size_hint = (1, None) self.add_remove_header.height = dp(40) label = Label(text="Add constituents to create a ply") self.add_remove_header.add_widget(label) self.add_widget(self.add_remove_header) #Add remove buttons self.add_remove_buttons = GridLayout() self.add_remove_buttons.cols = 4 self.add_remove_buttons.size_hint = (1, None) self.add_remove_buttons.height = dp(40) self.add_remove_buttons.add_widget(Widget()) button = Button(text="+", size_hint=(None, None), width=dp(40), height=dp(40)) button.bind(on_press = lambda x: self.add_constituent_press()) self.add_remove_buttons.add_widget(button) button = Button(text="-", size_hint=(None, None), width=dp(40), height=dp(40)) button.bind(on_press = lambda x: self.remove_constituent_press()) self.add_remove_buttons.add_widget(button) self.add_remove_buttons.add_widget(Widget()) self.add_widget(self.add_remove_buttons) #Constituent table self.constituent_table = GridLayout() self.constituent_table.cols = 3 label = Label(text="Consituent name", size_hint=(0.55, None), height=dp(20)) self.constituent_table.add_widget(label) label = Label(text="Areal weight (g/m2)", size_hint=(0.3, None), height=dp(20)) self.constituent_table.add_widget(label) label = Label(text="Structural?", size_hint=(0.15, None), height=dp(20)) self.constituent_table.add_widget(label) textinput = TextInput(size_hint=(0.55, None), height=dp(40)) self.constituent_name.append(textinput) self.constituent_table.add_widget(textinput) textinput = TextInput(size_hint=(0.3, None), height=dp(40)) self.constituent_areaweight.append(textinput) self.constituent_table.add_widget(textinput) toggle = ToggleButton(text="No", size_hint=(0.15, None), height=(dp(40))) toggle.bind(state=(lambda self, x: CreatePly.structural_constituent_toggle(self, toggle))) self.structural_toggle.append(toggle) self.constituent_table.add_widget(toggle) self.add_widget(self.constituent_table) #Build ply button self.footer = GridLayout() self.footer.cols = 3 self.footer.size_hint = (1, None) self.footer.height = dp(40) self.footer.add_widget(Widget()) button = Button(text="Create ply", size_hint=(None, None), width=dp(120), height=dp(40)) button.bind(on_press = lambda x: self.create_ply()) self.footer.add_widget(button) self.footer.add_widget(Widget()) self.add_widget(self.footer) #Functions def structural_constituent_toggle(self, toggle): if toggle.state == "normal": toggle.text = "No" else: toggle.text = "Yes" def add_constituent_press(self): textinput = TextInput(size_hint=(0.55, None), height=(dp(40))) self.constituent_name.append(textinput) self.constituent_table.add_widget(textinput) textinput = TextInput(size_hint=(0.3, None), height=(dp(40))) self.constituent_areaweight.append(textinput) self.constituent_table.add_widget(textinput) toggle = ToggleButton(text="No", size_hint=(0.15, None), height=(dp(40))) toggle.bind(state=(lambda self, x: CreatePly.structural_constituent_toggle(self, toggle))) self.structural_toggle.append(toggle) self.constituent_table.add_widget(toggle) def remove_constituent_press(self): if len(self.constituent_name) == 1: pass else: self.constituent_table.remove_widget(self.constituent_name[-1]) del self.constituent_name[-1] self.constituent_table.remove_widget(self.constituent_areaweight[-1]) del self.constituent_areaweight[-1] self.constituent_table.remove_widget(self.structural_toggle[-1]) del self.structural_toggle[-1] def create_ply(self): pass #Run loop DIS3().run() [/code] Код файла KV: [code]#This file contains the graphical user interface elements of the DIS creator app #This is the layout of the entire screen MainLayout: : #Background colour canvas.before: Color: rgba:(.3,.3,.3,1) Rectangle: pos: self.pos size: self.size padding: '10dp' spacing: '10dp' MenuLayout: FocusFrame: #This is the layout for the menu : #Background colour canvas.before: Color: rgba:(0,0,0,1) Rectangle: pos: self.pos size: self.size #Dimension control size_hint: None, 1 width: "160dp" spacing: "2dp" padding: "10dp" Button: text: "Database" size_hint: 1, None height: "40dp" Button: text: "Create ply" size_hint: 1, None height: "40dp" Button: text: "Create preform" size_hint: 1, None height: "40dp" Button: text: "Plan infusion" size_hint: 1, None height: "40dp" Button: text: "Write DIS" size_hint: 1, None height: "40dp" Button: text: "Review DIS" size_hint: 1, None height: "40dp" #This is the layout for the scrollable focus frame : canvas.before: Color: rgba:(0,0,0,1) Rectangle: pos: self.pos size: self.size CreatePly: [/code] Заранее спасибо! Подробнее здесь: [url]https://stackoverflow.com/questions/79343462/kivy-scrollview-minimum-height-no-longer-dynamic-with-nested-layouts-in-python[/url]