如何删除 main.kv 文件中的小部件?
How can I remove widgets in my main.kv file?
我环顾四周,但未能找到解决问题的方法。在我的 main.kv 文件中,我有不断显示的“home_screen”和“settings_screen”小部件按钮(无论用户在哪个屏幕上)。
问题是,当用户未登录并在“login_screen”时,这两个按钮在那里并保持活动状态,允许用户简单地访问“[=43=” ]”或“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")
这是一个基本布局,但仍可重现。谢谢:)
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()
我同意应该有错误message/warning。
我环顾四周,但未能找到解决问题的方法。在我的 main.kv 文件中,我有不断显示的“home_screen”和“settings_screen”小部件按钮(无论用户在哪个屏幕上)。
问题是,当用户未登录并在“login_screen”时,这两个按钮在那里并保持活动状态,允许用户简单地访问“[=43=” ]”或“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")
这是一个基本布局,但仍可重现。谢谢:)
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()
我同意应该有错误message/warning。