簡體   English   中英

Kivy 中的滾動視圖,不使用 kv 文件

[英]Scrollview in Kivy without using kv file

我需要在我的 Kivy 應用程序中創建滾動視圖功能,但不使用 kv 文件。

下面我的代碼不起作用。 我想我走錯路了。 請幫我。 我需要在 window 中間創建框架,並且應該只看到 2 個按鈕,並且用戶只能向下循環滾動按鈕列表。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.config import Config
from kivy.uix.scrollview import ScrollView
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')


class MyApp(App):
    def build(self):
        self.create_scrollview()
        Window.size = (900, 600)
        self.window = GridLayout()
        self.window.cols = 1
        self.window.size_hint = (0.2, 0.6)
        self.window.pos_hint = {"center_x": 0.5, "center_y": 0.6}

        self.some_words = Label(font_size='16', text='Win or Lose', color='white', halign='center')
        self.window.add_widget(self.some_words)

        self.button_1 = Button(text='1st button', background_color='#04D0F9')
        self.button_1.size_hint = (0.2, 0.2)
        self.button_1.pos_hint = {"center_x": 0.5, "center_y": 0.5}
        self.button_1.bind(on_press=self.ask1)
        self.window.add_widget(self.button_1)

        self.button_2 = Button(text='2nd button', background_color='#04D0F9')
        self.button_2.size_hint = (0.2, 0.2)
        self.button_2.pos_hint = {"center_x": 0.5, "center_y": 0.5}
        self.button_2.bind(on_press=self.ask2)
        self.window.add_widget(self.button_2)

        self.button_3 = Button(text='3rd button', background_color='#04D0F9')
        self.button_3.size_hint = (0.2, 0.2)
        self.button_3.pos_hint = {"center_x": 0.5, "center_y": 0.5}
        self.button_3.bind(on_press=self.ask3)
        self.window.add_widget(self.button_3)

        self.button_4 = Button(text='4th button', background_color='#04D0F9')
        self.button_4.size_hint = (0.2, 0.2)
        self.button_4.pos_hint = {"center_x": 0.5, "center_y": 0.5}
        self.button_4.bind(on_press=self.ask4)
        self.window.add_widget(self.button_4)

        self.button_5 = Button(text='5th button', background_color='#04D0F9')
        self.button_5.size_hint = (0.2, 0.2)
        self.button_5.pos_hint = {"center_x": 0.5, "center_y": 0.5}
        self.button_5.bind(on_press=self.ask5)
        self.window.add_widget(self.button_5)

        self.button_6 = Button(text='6th button', background_color='#04D0F9')
        self.button_6.size_hint = (0.2, 0.2)
        self.button_6.pos_hint = {"center_x": 0.5, "center_y": 0.5}
        self.button_6.bind(on_press=self.ask6)
        self.window.add_widget(self.button_6)

        return self.window

    def ask1(self, instance):
        self.some_words.text = 'Test 1'

    def ask2(self, instance):
        self.some_words.text = 'Test 2'

    def ask3(self, instance):
        self.some_words.text = 'Test 3'

    def ask4(self, instance):
        self.some_words.text = 'Test 4'

    def ask5(self, instance):
        self.some_words.text = 'Test 5'

    def ask6(self, instance):
        self.some_words.text = 'Test 6'

    def create_scrollview(self):
        base = (self.button_1, self.button_2, self.button_3, self.button_4, self.button_5, self.button_6)
        layout = GridLayout(cols=1)
        layout.bind(minimum_height=layout.setter("height"))

        for element in base:
            button = Button(text=str(element), size_hint=(1, 0.1))
            layout.add_widget(button)
        scrollview = ScrollView(size=(Window.width, Window.height))
        scrollview.add_widget(layout)
        self.window.add_widget(scrollview)

if __name__ == "__main__":
    MyApp().run()

你只是錯過了一些小東西:

  1. 您將創建的每個按鈕添加到self.window ,然后將相同的按鈕添加到 SrollView,因此您得到了重復的小部件。 刪除每個按鈕的這一行: self.window.add_widget(self.button_6)

  2. 當您運行 kivy 應用程序時,首先它會加載.kv文件(在這種情況下沒有此文件),然后運行App.build()方法。 與 python 中的任何其他函數一樣, build()是同步 function 所以你要做的第一件事就是調用self.create_scrollview()方法,它需要所有按鈕才能工作......問題是按鈕沒有在這一點上創建,所以你會得到一個錯誤。 解決方案是在 function build()返回之前移動self.create_scrollview() ) 。

  3. 為了能夠滾動,您必須停用子項的至少一個 size_hint 指令(x 或 y)以啟用滾動。 所以你所有的按鈕和包含按鈕的網格布局必須有size_hint=(1,None)size_hint_y=None 所以:

def create_scrollview(self):
        base = (self.button_1, self.button_2, self.button_3, self.button_4, self.button_5, self.button_6)
        layout = GridLayout(cols=1, size_hint_y=None)
        layout.bind(minimum_height=layout.setter("height"))

        for element in base:
            button = Button(text=str(element), size_hint=(1, None))
            layout.add_widget(button)
        scrollview = ScrollView(size=(Window.width, Window.height))
        scrollview.add_widget(layout)
        self.window.add_widget(scrollview)

如您所見,我剛剛修改了一些小東西,但這將修復您的代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM