[英]How to change size_hint dynamically in Kivy
我正在使用 Python 中的 Kivy 制作 GUI。
我使用下面的代碼動態添加了一個按鈕。
recycleViewTest1.py
#-*- coding: utf-8 -*-
from kivy.config import Config
from kivy.uix.button import Button
Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)
Config.set('input', 'mouse', 'mouse,multitouch_on_demand') # eliminate annoying circle drawing on right click
from kivy.lang import Builder
Builder.load_string("""
<AddItemWidget>:
BoxLayout:
size: root.size
orientation: 'vertical'
RecycleView:
size_hint: 1.0,1.0
BoxLayout:
id: box
size_hint_y: 1.0
orientation: 'vertical'
Button:
size_hint_y: 1.0
id: addButton
text: "Add Item"
on_press: root.buttonClicked()
""")
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.properties import StringProperty
class AddItemWidget(Widget):
def __init__(self, **kwargs):
super(AddItemWidget, self).__init__(**kwargs)
self.count = 0
def buttonClicked(self):
self.count += 1
newButt = Button(text='Button'+ str(self.count),size_hint_y=1.0)
self.ids.box.add_widget(newButt, index=1)
self.ids.box.size_hint_y = 1.0 + 1.0 * self.count
class TestApp(App):
def __init__(self, **kwargs):
super(TestApp, self).__init__(**kwargs)
def build(self):
return AddItemWidget()
if __name__ == '__main__':
TestApp().run()
當實際執行 recycleViewTest1.py 時,它的行為如下圖所示。
當我按下“添加項目”按鈕時,按鈕被動態添加,size_hint_y被分割。
但我不想拆分 size_hint_y。
添加按鈕后,我想使用 RecycleView 使其可滾動,如下圖所示。我想保持按鈕大小不變。
我使用 recycleViewTest2.py 創建了上面的圖像。
recycleViewTest2.py
#-*- coding: utf-8 -*-
from kivy.config import Config
from kivy.uix.button import Button
Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)
Config.set('input', 'mouse', 'mouse,multitouch_on_demand') # eliminate annoying circle drawing on right click
from kivy.lang import Builder
Builder.load_string("""
<AddItemWidget>:
BoxLayout:
size: root.size
orientation: 'vertical'
RecycleView:
size_hint: 1.0,1.0
BoxLayout:
id: box
size_hint_y: 2.0
orientation: 'vertical'
Button:
size_hint_y: 1.0
text: "Button1"
Button:
size_hint_y: 1.0
id: addButton
text: "Add Item"
on_press: root.buttonClicked()
""")
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.properties import StringProperty
class AddItemWidget(Widget):
def __init__(self, **kwargs):
super(AddItemWidget, self).__init__(**kwargs)
self.count = 0
def buttonClicked(self):
self.count += 1
newButt = Button(text='Button'+ str(self.count),size_hint_y=1.0)
self.ids.box.add_widget(newButt, index=1)
class TestApp(App):
def __init__(self, **kwargs):
super(TestApp, self).__init__(**kwargs)
def build(self):
return AddItemWidget()
if __name__ == '__main__':
TestApp().run()
recycleViewTest2.py 接近理想狀態,但我想添加一個元素,在按下“添加項目”按鈕時保持按鈕大小不變。
當我按下 recycleViewTest2.py 中的 Add Item 按鈕時,按鈕大小會減小。
如何在使 recycleViewTest1.py 像 recycleViewTest2.py 一樣工作時修復按鈕大小?
我寫了recycleViewTest3.py。
recycleViewTest3.py
#-*- coding: utf-8 -*-
from kivy.config import Config
from kivy.uix.button import Button
Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)
Config.set('input', 'mouse', 'mouse,multitouch_on_demand') # eliminate annoying circle drawing on right click
from kivy.lang import Builder
Builder.load_string("""
<AddItemWidget>:
BoxLayout:
size: root.size
orientation: 'vertical'
RecycleView:
size_hint: 1.0,1.0
BoxLayout:
id: box
size_hint_y: 1.01
orientation: 'vertical'
Button:
size_hint_y: 0.5
text: "Button1"
Button:
size_hint_y: 0.5
id: addButton
text: "Add Item"
on_press: root.buttonClicked()
Label:
size_hint_y: 0.01
text: ""
""")
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.properties import StringProperty
class AddItemWidget(Widget):
def __init__(self, **kwargs):
super(AddItemWidget, self).__init__(**kwargs)
self.count = 0
def buttonClicked(self):
self.count += 1
self.ids.box.size_hint_y = self.ids.box.size_hint_y + 0.5
newButt = Button(text='Button'+ str(self.count),size_hint_y=0.5)
self.ids.box.add_widget(newButt, index=1)
class TestApp(App):
def __init__(self, **kwargs):
super(TestApp, self).__init__(**kwargs)
def build(self):
return AddItemWidget()
if __name__ == '__main__':
TestApp().run()
recycleViewTest3.py 將 boxLayout 的 size_hint_y 增加按鈕的數量,這應該是它的樣子。
但是,在按下“添加項目”按鈕后,按鈕的大小立即變得不正常。 滾動鼠標將固定按鈕大小。
我想知道是否有辦法添加這樣的按鈕並立即更新 size_hint_y。
為了防止按鈕自動改變大小,您必須手動為它們提供一個。
Builder.load_string("""
<AddItemWidget>:
BoxLayout:
size: root.size
orientation: 'vertical'
RecycleView:
size_hint: 1.0,1.0
BoxLayout:
id: box
size_hint_y: None
height: self.minimum_height # use this to keep its size relative to its children
orientation: 'vertical'
Widget: # bonus: use this to keep the buttons to the bottom
size_hint_y: None
height: root.height - ((len(box.children) - 1) * dp(60))
Button:
text: "Button0"
size_hint_y: None
height: dp(60)
Button:
size_hint_y: None
height: dp(60)
id: addButton
text: "Add Item"
on_press: root.buttonClicked()
""")
class AddItemWidget(Widget):
def __init__(self, **kwargs):
super(AddItemWidget, self).__init__(**kwargs)
self.count = 0
def buttonClicked(self):
self.count += 1
newButt = Button(text='Button'+ str(self.count),size_hint_y=None, height=dp(60))
self.ids.box.add_widget(newButt, index=1)
class TestApp(App):
def __init__(self, **kwargs):
super(TestApp, self).__init__(**kwargs)
def build(self):
return AddItemWidget()
if __name__ == '__main__':
TestApp().run()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.