如何在Kivy Python 中为GridLayout 的某些按钮设置高度?

How to set a height to some buttons of GridLayout in Kivy Python?

我正在使用 kivy 开发一个应用程序,我遇到了一个涉及 GridLayout 的问题。我有一个包含不同行的屏幕,我希望最后一行的按钮始终具有相同的 height(屏幕高度的 11.1%)。我试图修改按钮中的属性高度,但无法正常工作。使用 size_hint_y 可以正常工作,但事实是我想使用 height 因为屏幕不会始终具有相同的行数(是响应式的并且取决于先前屏幕的选择) .我在这里附上我用通过命令 Window.height/9:

计算的属性高度完成的代码
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.screenmanager import ScreenManager, Screen
from kivy.core.window import Window


class LoginScreen(GridLayout):
    def __init__(self,**kwargs):
        super(LoginScreen, self).__init__(**kwargs)
        self.cols=2
        self.add_widget(Label(text='Subject'))
        self.add_widget(Label(text=''))
        self.add_widget(Label(text='1'))
        self.add_widget(TextInput(multiline=False))
        self.add_widget(Label(text='2'))
        self.add_widget(TextInput(multiline=False))
        self.add_widget(Label(text='3'))
        self.add_widget(TextInput(multiline=False))
        self.add_widget(Label(text='4'))
        self.add_widget(TextInput(multiline=False))
        b1=Button(text='Exit',background_color=[0,1,0,1],height=int(Window.height)/9.0) #doesn't work properly 
        self.add_widget(b1)
        b2=Button(text='Run',background_color=[0,1,0,1],height=int(Window.height)/9.0) #doesn't work properly
        self.add_widget(b2)
        b1.bind(on_press=exit) 




class SimpleKivy(App):
    def build(self):
        return LoginScreen()


if __name__=='__main__':
    SimpleKivy().run()

我知道可以用 kivy 语言以更简单的方式完成,但对于我的应用来说,用这种方式更好。如果有人知道如何解决这个问题,我将不胜感激。

试试这个

class LoginScreen(GridLayout):
def __init__(self,**kwargs):
    super(LoginScreen, self).__init__(**kwargs)
    self.cols=2
    self.add_widget(Label(text='Subject'))
    self.add_widget(Label(text=''))
    self.add_widget(Label(text='1'))
    self.add_widget(TextInput(multiline=False))
    self.add_widget(Label(text='2'))
    self.add_widget(TextInput(multiline=False))
    self.add_widget(Label(text='3'))
    self.add_widget(TextInput(multiline=False))
    self.add_widget(Label(text='4'))
    self.add_widget(TextInput(multiline=False))
    b1=Button(text='Exit',background_color=[0,1,0,1],size_hint_y=None, height=int(Window.height)/8.9)  
    self.add_widget(b1)
    b2=Button(text='Run',background_color=[0,1,0,1],size_hint_y=None, height=int(Window.height)/8.9)
    self.add_widget(b2)
    b1.bind(on_press=exit) 

编辑后将其更改为 11%。

这里是将按钮保持在 11% 以响应 window 大小,只要 window 调整大小时(如绑定到 'on_resize').

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.screenmanager import ScreenManager, Screen
from kivy.core.window import Window
from kivy.uix.floatlayout import FloatLayout


class LoginScreen(GridLayout):


def __init__(self,**kwargs):
    super(LoginScreen, self).__init__(**kwargs)

    #init and add grid layer
    self.cols=2
    self.layout = GridLayout(cols=self.cols)
    self.add_widget(self.layout)
    #function to set the buttons based on the current window size
    self.set_content(Window.width, Window.height)
    #bind above function to get called whenever the window resizes
    Window.bind(on_resize=self.set_content)


def set_content(self, width, height, *args):
    #first remove the old sized grid layer
    self.remove_widget(self.layout)
    #now build a new grid layer with the current size
    self.layout =GridLayout(cols=self.cols)
    self.layout.add_widget(Label(text='Subject'))
    self.layout.add_widget(Label(text=''))
    self.layout.add_widget(Label(text='1'))
    self.layout.add_widget(TextInput(multiline=False))
    self.layout.add_widget(Label(text='2'))
    self.layout.add_widget(TextInput(multiline=False))
    self.layout.add_widget(Label(text='3'))
    self.layout.add_widget(TextInput(multiline=False))
    self.layout.add_widget(Label(text='4'))
    self.layout.add_widget(TextInput(multiline=False))
    b1=Button(text='Exit',background_color=[0,1,0,1],size_hint_y=None, height=int(Window.height)/8.9)  
    self.layout.add_widget(b1)
    b2=Button(text='Run',background_color=[0,1,0,1],size_hint_y=None, height=int(Window.height)/8.9)
    self.layout.add_widget(b2)
    b1.bind(on_press=exit) 
    #add the newly sized layer
    self.add_widget(self.layout)


class SimpleKivy(App):
def build(self):
    return LoginScreen()


if __name__=='__main__':
SimpleKivy().run()

如果您希望 grid/box 布局中的小部件具有固定大小,您应首先将其 size_hint 设置为 None。并始终在此类任务中使用 kivy lang - 无一例外。

from kivy.app import App
from kivy.uix.screenmanager import Screen

from kivy.lang import Builder

gui = '''
LoginScreen:

    GridLayout:
        cols: 2

        Label:
            text: 'Subject'

        Label:

        Label:
            text: '1'

        SingleLineTextInput:

        Label:
            text: '2'

        SingleLineTextInput:

        Label:
            text: '3'

        SingleLineTextInput:

        Label:
            text: '4'

        SingleLineTextInput:

        GreenButton:
            text: 'Exit'
            on_press: app.stop()

        GreenButton:
            text: 'Run'


<SingleLineTextInput@TextInput>:
    multiline: False


<GreenButton@Button>:
    background_color: 0, 1, 0, 1
    size_hint_y: None
    height: self.parent.height * 0.111
'''


class LoginScreen(Screen):
    pass


class SimpleKivy(App):

    def build(self):
        return Builder.load_string(gui)


if __name__ == '__main__':
    SimpleKivy().run()