【问题标题】:Kivy - Adding Buttons To Screen Through PythonKivy - 通过 Python 在屏幕上添加按钮
【发布时间】:2018-03-23 17:55:45
【问题描述】:

我正在尝试使用按钮制作屏幕视图。问题是每次需要的按钮数量都会改变,因此我无法使用 kv 文件来制作这些按钮。我无法通过普通的 python 代码添加按钮。任何帮助表示赞赏。

import kivy
import webbrowser
import MSQLHandler
kivy.require('1.10.0')


from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Label
from kivy.uix.widget import Widget
from kivy.uix.listview import ListItemButton
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition, CardTransition,  SwapTransition, FadeTransition, WipeTransition, FallOutTransition, RiseInTransition, NoTransition
from kivy.lang import Builder
from kivy.uix.button import Button

class Login_Failed(Screen):

    def changeScreen(self, next_screen):
        self.manager.current = next_screen



class Loged_In(Screen):

    def changeScreen(self, next_screen):
        self.manager.current = next_screen


class Registers(Screen):

    def changeScreen(self, next_screen):
        self.manager.current = next_screen


class Login_Screen(Screen):

    teacher_connect_image = ObjectProperty()

    username_text_input = ObjectProperty()
    password_text_input = ObjectProperty()
    teacherid_text_input = ObjectProperty()

    def LoginButton(self):

        if self.teacherid_text_input.text == "":
            Number = 0
        else:
            Number = int(self.teacherid_text_input.text)

        MSQLHandler.LoginSystem(self.username_text_input.text, self.password_text_input.text, Number)

        def changeScreen(self, next_screen):
            self.manager.current = next_screen

        if MSQLHandler.LoginSystem(self.username_text_input.text, self.password_text_input.text, Number) is True:
            print("Returns True")
            changeScreen(self, "Loged_In")
        elif MSQLHandler.LoginSystem(self.username_text_input.text, self.password_text_input.text, Number) is False:
            print("Returns False")
            changeScreen(self, "Login_Failed")
        else:
            print("Null")




class ScreenManagerr(ScreenManager):
    pass


class MainKivyFrameApp(App):

    def build(self):

        Registers().add_widget(Button(text="Helpp"))

        return ScreenManagerr()

mainFrame = MainKivyFrameApp()
mainFrame.run()

如果您查看应用程序的构建位置,您会看到:Registers().add_widget(Button(text="Helpp"))

这是我尝试在寄存器屏幕上添加一个按钮的地方。这不会给我任何错误,但它仍然没有显示按钮。

【问题讨论】:

    标签: python python-3.x python-2.7 kivy kivy-language


    【解决方案1】:

    解决方案

    在kv文件中,在每个屏幕中添加一个事件(on_enteron_pre_enter)并绑定到回调方法,如下面的 sn-ps 和示例所示。请记住通过添加事件(on_leaveon_pre_leave 来移除在离开当前屏幕之前动态添加的小部件>)。

    片段

    <Registers>:
        on_pre_enter: self.add_buttons(n)
        on_leave: self.remove_buttons()
    

    示例

    main.py

    ​​>
    from kivy.app import App
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.uix.button import Button
    from kivy.core.window import Window
    from kivy.properties import ObjectProperty, NumericProperty
    
    
    class MyScreenManager(ScreenManager):
        total_button = NumericProperty(2)
    
    
    class Login(Screen):
        login = ObjectProperty(None)
    
        def on_pre_enter(self):
            Window.size = (400, 300)
    
        def check_password(self, instance, password):
            if password == "pwd":
                instance.current = "registers"
    
    
    class Registers(Screen):
        container = ObjectProperty(None)
    
        def on_pre_enter(self):
            Window.size = (800, 600)
    
        def add_buttons(self, n):
            print("Registers: n={}".format(n))
            for i in range(n):
                self.container.add_widget(Button(text="Button #{}".format(i), id=str(i)))
    
        def remove_buttons(self, *args):
            for child in [child for child in self.container.children]:
                self.container.remove_widget(child)
    
    
    class Welcome(Screen):
        pass
    
    
    class TestApp(App):
        title = "ScreenManager - Add Widgets Dynamically"
    
        def build(self):
            return MyScreenManager()
    
    
    if __name__ == "__main__":
        TestApp().run()
    

    test.kv

    #:kivy 1.10.0
    #:import SwapTransition kivy.uix.screenmanager.SwapTransition
    
    <MyScreenManager>:
        transition: SwapTransition()
        Login:
        Registers:
            on_pre_enter:
                self.add_buttons(app.root.total_button)
            on_leave:
                self.remove_buttons()
        Welcome:
    
    <Login>:
        id: login
        name: "login"
        login: login
        GridLayout:
            size_hint: (0.5, 0.5)
            pos_hint: {"center_x": 0.5, "center_y": 0.6}
            rows: 3
            padding: 20
    
            Label:
                size_hint: (0.2, 0.2)
                text:"Password:"
                font_size: 30
                halign: "center"
                valign: "middle"
    
            TextInput:
                id: password
                size_hint: (0.2, 0.06)
                cursor_blink: True
                font_size: 20
                multiline: False
                password: True
    
            Button:
                text: "Continue"
                size_hint: (0.2, 0.08)
                on_release:
                    root.login.check_password(root.manager, password.text)
    
    <Registers>:
        name:'registers'
        container: container
        BoxLayout:
            orientation: 'vertical'
            Button:
                text: 'Return to Login'
                on_press: root.manager.current = 'login'
            Button:
                text: 'Next Screen'
                on_press: root.manager.current = 'welcome'
            BoxLayout:
                id: container
                orientation: 'vertical'
    
    <Welcome>:
        name:'welcome'
        BoxLayout:
            Label:
                text: 'Welcome!'
            Button:
                text: 'Return to Registers'
                on_press:
                    app.root.total_button = 5
                    root.manager.current = 'registers'
    

    输出

    【讨论】:

    • 非常感谢!这就像一个魅力。我终于可以重新开始做这个项目了! :)
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多