#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. По тому, как вы написали хороший вопрос и хороший код, я знал, что вы поймете этот простой код ^^