Kivy GridLayout警告:未设置cols/rows致布局失效,界面显示异常
解决Kivy GridLayout布局错乱与警告问题
首先看你收到的警告提示——这就是布局错乱的核心原因:你的外层Mylays(继承自GridLayout)没有设置cols或rows属性,Kivy不知道怎么排列它的子组件(也就是top_grid和按钮),所以直接跳过了布局计算,导致只有按钮能显示出来。另外你的嵌套top_grid也没明确设置列数,虽然代码里写了self.cols=2,但那是给外层Mylays设置的,不是给top_grid的,这也是个小错误。
下面是修复后的完整代码,我标注了关键修改点:
import kivy 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 class Mylays(GridLayout): def __init__(self,**kwargs): super(Mylays,self).__init__(**kwargs) # 修改1:给外层GridLayout设置列数为1,让子组件垂直排列 self.cols = 1 self.top_grid = GridLayout() # 修改2:给嵌套的top_grid设置列数为2,实现标签和输入框左右对齐 self.top_grid.cols = 2 self.top_grid.add_widget(Label(text="Name : ",font_size=20)) self.name = TextInput(multiline=False) self.top_grid.add_widget(self.name) self.top_grid.add_widget(Label(text="Class :", font_size=20)) self.hisclass = TextInput(multiline=False) self.top_grid.add_widget(self.hisclass) self.top_grid.add_widget(Label(text="Lang:", font_size=20)) self.lang = TextInput(multiline=False) self.top_grid.add_widget(self.lang) self.add_widget(self.top_grid) self.click = Button(text="Boom!",font_size=25) self.click.bind(on_press=self.buttonfunction) self.add_widget(self.click) def buttonfunction(self, instance): name = self.name.text CLASs = self.hisclass.text langu = self.lang.text x = "Hi {0}, I know you are from {1}. I also like {2} Language.".format(name,CLASs,langu) self.add_widget(Label(text=x, font_size=18)) self.name.text = "" self.hisclass.text = "" self.lang.text = "" class firstapp(App): def build(self): return Mylays() if __name__ == "__main__": firstapp().run()
关键修改说明:
- 外层
Mylays设置self.cols=1:这样它的子组件(top_grid和按钮)会按垂直方向排列,一行一个,解决了布局不触发的警告,同时让界面结构清晰。 - 嵌套
top_grid设置self.top_grid.cols=2:原来你写的self.cols=2是给外层布局设置的,现在修正为给top_grid设置,这样标签和输入框就能左右成对显示了。 - 额外调整了一些文本格式(比如Class的大小写、字体大小),让界面更美观,但这不是必须的。
现在运行代码,你会看到姓名、年级、语言的输入框和标签都正常排列,点击按钮后也会在下方显示问候语,布局完全正常,警告也会消失。
内容的提问来源于stack exchange,提问作者redtrib3
相关产品推荐
相关产品推荐

