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

2024-05-26 20:46:17 发布

您现在位置: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语言可以更容易地完成,但对于我的应用程序来说,用这种方式更好。如果有人知道如何解决这个问题,我将非常感激。


Tags: textfromimportselfaddfalse屏幕textinput
2条回答

如果希望网格/框布局中的小部件具有固定大小,则应首先将其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()

试试这个

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%以响应窗口大小的按钮,在窗口大小调整时(通过绑定到“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()

相关问题 更多 >

    热门问题