【发布时间】:2020-05-10 16:55:42
【问题描述】:
我想构建一个屏幕,顶部有 6 个标签,顶部标签下方有 6 个输入,然后在输入下方生成无限数量的标签。 标签/输入的列+行应该相互对齐。
调整窗口大小时,每个的 X 应该会改变,但 Y 应该保持不变(为底部的其他标签留出空白空间)。为了更清楚,我模仿了 Excel 中的情况:
Window before resizing // Window after resizing
我尝试了网格布局(X 和 Y 总是随窗口调整大小 -> 不适用于我的想法)和浮动布局(定位所有内容(尤其是生成的标签)不可能是最好的解决方案。
我不是寻找生成以下标签的逻辑。只是 .kv 中的布局。
更新:
在试验了@MisterNox 的代码后,我将它实现到我的测试项目中。当我单击“+”按钮添加行时,我遇到了两个顶行被推得更远导致第一行不可读的问题。
我的代码如下所示,应该是可重现的:
test_main.py:
import kivy
from kivy import Config
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.graphics import Rectangle
from kivy.graphics import Color
from kivy.graphics import Line
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, TransitionBase, ShaderTransition, FadeTransition
from kivy.uix.popup import Popup
from kivy.clock import Clock
from kivy.core.window import Window
from kivy.animation import Animation
import time
import csv
Config.set('graphics', 'width', '1024')
Config.set('graphics', 'height', '768')
class WindowManager(ScreenManager):
pass
class MyWindow(Screen):
def __init__(self, **kwargs):
super(MyWindow, self).__init__(**kwargs)
Window.bind(width=self.on_window_width)
def on_window_width(self, instance, value):
self.ids.stock_list_layout.width = value
for obj in self.ids.my_window.children:
if isinstance(obj, Label):
obj.width = value/6
def do_something(self):
print("HEL")
self.ids.my_window.add_widget(Label(text="TEST", size_hint=(None, None), size=(Window.width/6, 35)))
self.ids.my_window.add_widget(Label(text="TEST", size_hint=(None, None), size=(Window.width / 6, 35)))
self.ids.my_window.add_widget(Label(text="TEST", size_hint=(None, None), size=(Window.width / 6, 35)))
self.ids.my_window.add_widget(Label(text="TEST", size_hint=(None, None), size=(Window.width / 6, 35)))
self.ids.my_window.add_widget(Label(text="TEST", size_hint=(None, None), size=(Window.width / 6, 35)))
self.ids.my_window.add_widget(Label(text="TEST", size_hint=(None, None), size=(Window.width / 6, 35)))
class MainApp(App):
def build(self):
return kv
kv = Builder.load_file("testing.kv")
if __name__ == "__main__":
MainApp().run()
testing.kv:
#:import Window kivy.core.window.Window
WindowManager:
MyWindow:
<MyWindow>:
GridLayout:
id: my_window
cols:6
size_hint_y: None
size_hint_x: None
pos_hint:{"left":1,"top":1}
width: Window.width
Label:
text:"LABEL"
height: 35
#size_hint:(0.16666,None)
Label:
height: 35
#size_hint:(0.16666,None)
text:"LABEL"
Label:
height: 35
#size_hint:(0.16666,None)
text:"LABEL"
Label:
height: 35
#size_hint:(0.16666,None)
text:"LABEL"
Label:
text:"LABEL"
height: 35
#size_hint:(0.16666,None)
Label:
text:"LABEL"
height: 35
#size_hint:(0.16666,None)
TextInput:
height: 35
size_hint:(1,None)
TextInput:
height: 35
size_hint:(1,None)
TextInput:
height: 35
size_hint:(1,None)
TextInput:
height: 35
size_hint:(1,None)
Button:
text:"+"
on_release:
root.do_something()
【问题讨论】:
标签: python python-3.x kivy kivy-language