我正在尝试构建一个显示停车位的应用程序。
我正在使用.kv文件来构建GUI,但我不知道如何将图像放在我想要的列和行中。 你能帮我解决这个布局问题吗?
main.py
# File name: main.py
import kivy
from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
# Version of kivy
kivy.require('1.10.0')
class Main(AnchorLayout):
parking_space_available = ''
parking_space_busy = ''
def update(self):
app = App.get_running_app()
class MainApp(App):
def build(self):
return Main()
if __name__ == '__main__':
MainApp().run()
main.kv
# File name: main.kv
<Label>:
font_size: 20
<Main>:
BoxLayout:
id: main_layout
orientation: 'vertical'
Label:
id: label_total
text: 'Parking spaces total: '
pos_hint: {'x': 0, 'top':1}
Label:
id: label_available
text: 'Parking spaces available: '
pos_hint: {'x': 0, 'top':.3}
GridLayout:
cols: 3
rows: 6
BoxLayout:
orientation: 'horizontal'
size_hint: 0.15, 0.2
Image:
source: root.parking_space_available
Image:
source: root.parking_space_available
Image:
source: root.parking_space_available
Button:
text: 'Update'
font_size: 20
on_press: root.update()
答案 0 :(得分:0)
Kivy的GridLayout与许多其他GUI框架不同,不允许您选择要将子项放入哪个特定行/列。而是在开始下一行之前填充一行。
但是,您可以使用ID创建自己的自定义GridLayout。
例如
class CustomRow(FloatLayout):
pass
class CustomGrid(FloatLayout):
pass
<CustomRow>:
FloatLayout:
id: 0
FloatLayout:
id: 1
# etc, creating as many FloatLayouts as many number of columns you want.
<CustomGrid>:
CustomRow:
id: 0
CustomRow:
id: 1
然后在CustomGrid的py文件中
class CustomGrid(FloatLayout):
def add_child_to_specific(self, row, col, widget):
self.ids[row].ids[col].add_widget(widget)
答案 1 :(得分:0)
代码示例:
class Grid(GridLayout):
def __init__(self):
GridLayout.__init__(self, rows = 3, cols = 3);
self.Images_list = list();
for i in range(self.rows):
dummy = list();
for j in range(self.cols):
dummy.append(Image());
self.add_widget(dummy[-1]);
self.Images_list.append(dummy);
print(self.Images_list);
你可以试试这个。我的想法是:如果GridLayout
的大小是3 x 3,那么当您将第二个小部件添加到GridLayout
时,它将位于第1行和第2列。因此,{{1移动&#39;移动&#39;向右移动。知道了这个模式,您可以先创建GridLayout
对象Image
的空图像列表。 self.Images_list
是网格第1行 - 第1列的图像,self.Images_list[0][0]
是网格第1行 - 第2列的图像,依此类推。
self.Images_list[0][1]
是第i + 1行的图像 - 网格的第j + 1列。
因此,如果您想更改第2行第3列的图片,则可以访问self.Images_list[i][j]
。
希望这有帮助。
答案 2 :(得分:0)
如果要使用2列1行的网格:
Grid = GridLayout(cols=2, row=1)
如果不提供row参数,它将根据其子级自动添加行。