Как я могу удалить виджеты из моего основного файла.kv?

#python #function #while-loop #kivy #widget

Вопрос:

Я прилично осмотрелся и не смог найти решение своей проблемы. В моем основном файле.kv у меня есть кнопки виджетов «home_screen» и «settings_screen», которые отображаются постоянно (независимо от того, на каком экране находится пользователь).

Проблема в том, что, когда пользователь не вошел в систему и находится на «экране входа», эти две кнопки находятся там и остаются активными, позволяя пользователю просто получить доступ к «домашнему экрану» или «экрану настроек» перед входом в систему.

Что я пытаюсь сделать, так это удалить эти два виджета с экрана всякий раз, когда пользователь находится на экране входа в систему. Я чувствую, что нахожусь на правильном пути, но, возможно, неправильно ссылаюсь на виджеты. Ошибок не возникает, он просто ничего не делает.

Я попытался запустить свой оператор «если» и все его необходимые компоненты в change_screen() функции, а также попытался предоставить ему собственную функцию (показано в моем примере). Я попробовал это с 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>:
    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>:
    Button:
        text: "back"
        pos_hint:  {"top": .2, "center_x": .5}
        size_hint: .5, .08
        on_release:
            app.change_screen("login_screen")
 

Это базовая компоновка, но она все еще воспроизводима. Спасибо вам 🙂

Ответ №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()
 

Я согласен, что должно быть сообщение об ошибке/предупреждение.

Комментарии:

1. Большое вам спасибо, это сразу решило мою проблему.

2. По тому, как вы написали хороший вопрос и хороший код, я знал, что вы поймете этот простой код ^^