【问题标题】:How can I remove widgets in my main.kv file?如何删除 main.kv 文件中的小部件?
【发布时间】:2021-09-08 07:24:19
【问题描述】:

我环顾四周,但未能找到解决问题的方法。在我的 main.kv 文件中,我有持续显示的“home_screen”和“settings_screen”小部件按钮(无论用户在哪个屏幕上)。

问题在于,当用户未登录并在“login_screen”上时,这两个按钮在那里并保持活动状态,允许用户在登录前简单地访问“home_screen”或“settings_screen”。

我正在尝试做的是每当用户在登录屏幕上时从屏幕上删除这两个小部件。我觉得我走在正确的轨道上,但可能没有正确引用小部件。不会出现错误,它根本不做任何事情。

我已经尝试在change_screen() 函数中运行我的“if”语句及其所有必要的组件,并且还尝试赋予它自己的功能(如我的示例所示)。我已经用while 语句尝试过它(除非我把它放在一个线程中,否则它似乎会阻塞应用程序)。我尝试了几种不同的方法来引用小部件和编写remove_widget() 行的方法。

我已经包含了最基本的功能示例,以便有人可以尝试自己运行它。请帮忙。

main.py

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

class HomeScreen(Screen):
    pass
class LoginScreen(Screen):
    pass

GUI = Builder.load_file("main.kv")
class TestApp(App):
    def build(self):
        return GUI

    def change_screen(self, screen_name):
        screen_manager = self.root.ids['screen_manager']
        screen_manager.current = screen_name
        self.home_setting_widgets(screen_name)

    def home_setting_widgets(self, screen_name):
        home_button = self.root.ids["home_button"]
        settings_button = self.root.ids["settings_button"]
        if screen_name == "login_screen":                  # if i'm on the login screen
            self.root.remove_widget(home_button)           # remove widgets
            self.root.remove_widget(settings_button)

TestApp().run()

main.kv

#:include kv/loginscreen.kv
#:include kv/homescreen.kv
GridLayout:
    cols: 1
    FloatLayout:
        GridLayout:
            rows: 1
            pos_hint: {"top": 1, "left": 1}
            size_hint: 1, .05
            Button:
                id: home_button
                text: "home"
            Button:
                id: settings_button
                text: "settings"
        ScreenManager:
            size_hint: 1, .95
            pos_hint: {"top": .95, "left": 1}
            id: screen_manager
            LoginScreen:
                name: "login_screen"
                id: login_screen
            HomeScreen:
                name: "home_screen"
                id: home_screen

loginscreen.kv

<LoginScreen>:
    FloatLayout:
        TextInput:
            size_hint: .7, .08
            pos_hint: {"top": .8, "center_x": .5}
        TextInput:
            size_hint: .7, .08
            pos_hint: {"top": .7, "center_x": .5}
        Button:
            text: "login"
            pos_hint:  {"top": .2, "center_x": .5}
            size_hint: .5, .08
            on_release:
                app.change_screen("home_screen")

homescreen.kv

<HomeScreen>:
    Button:
        text: "back"
        pos_hint:  {"top": .2, "center_x": .5}
        size_hint: .5, .08
        on_release:
            app.change_screen("login_screen")

这是一个基本布局,但仍可重现。谢谢你:)

【问题讨论】:

    标签: python function while-loop kivy widget


    【解决方案1】:
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.screenmanager import Screen
    
    class HomeScreen(Screen):
        pass
    class LoginScreen(Screen):
        pass
    
    GUI = Builder.load_file("main.kv")
    class TestApp(App):
        def build(self):
            return GUI
    
        def change_screen(self, screen_name):
            screen_manager = self.root.ids['screen_manager']
            screen_manager.current = screen_name
            self.home_setting_widgets(screen_name)
    
        def home_setting_widgets(self, screen_name):
            home_button = self.root.ids["home_button"]
            settings_button = self.root.ids["settings_button"]
            grid_layout = self.root.children[0].children[1]
            print("I remove from my widget, not from my root", grid_layout)
            if screen_name == "login_screen":  # if i'm on the login screen
                grid_layout.remove_widget(home_button)  # remove widgets
                grid_layout.remove_widget(settings_button)
    
    
    TestApp().run()
    

    我同意应该有错误消息/警告。

    【讨论】:

    • 非常感谢,这立即解决了我的问题。
    • 顺便说一句,你写了一个好问题和一个好代码,我就知道你会理解这个简单的代码^^
    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2011-08-19
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多