gpt4 book ai didi

python - (Kivy Python) 在 .py 文件内按按钮切换屏幕

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:40 24 4
gpt4 key购买 nike

我知道使用 on_release 在 .kv 文件中切换屏幕相对容易。但是,我想保留在 .py 文件中创建的按钮,因此我不想使用此方法。我已执行以下操作来添加按下第 14 个按钮时发生的功能。当程序中按下按钮时,什么也不会发生。尝试使用 sm.current 的其他屏幕名称来引发错误:“kivy.uix.screenmanager.ScreenManagerException:按下第 14 个按钮时,没有名称为“InputScreen”的屏幕。”

# Kivy Formatting
kv_text='''\

<MyScreenManager>:
LandingScreen:
InputScreen:

<InputScreen@Screen>:
name: 'input_sc'
AnchorLayout:
id: anchor_1

<LandingScreen@Screen>:
name: 'landing_sc'
GridLayout:
id: grid_1
cols: 5
height: 480
width: 800
spacing: 25, 20
padding: 25,25

'''
# Screen Manager
class MyScreenManager(ScreenManager):
pass

# Main screen with button layout
class LandingScreen(Screen):
def __init__(self, **kwargs):
super(LandingScreen, self).__init__(**kwargs)
self.buttons = [] # add references to all buttons here
Clock.schedule_once(self._finish_init)

# IDs have to be used here because they cannot be applied until widget initialized
def _finish_init(self, dt):
self.ids.grid_1.cols = 5

# Loop to make 15 different buttons on screen
for x in range(15):
self.buttons.append(Button(text='button {}'.format(x)))
self.ids.grid_1.add_widget(self.buttons[x])
self.buttons[x].background_normal = 'YOUTUBE.png'

def SwitchScreen(self,*args):
sm.current = 'input_sc'

sm = ScreenManager()
sm.add_widget(InputScreen(name='input_sc'))
sm.add_widget(LandingScreen(name='landing'))
self.buttons[14].bind(on_release=SwitchScreen)


# Input screen
class InputScreen(Screen):
pass

class MySubApp(App):
def build(self):
return MyScreenManager()

def main():
Builder.load_string(kv_text)
app = MySubApp()
app.run()

if __name__ == '__main__':
main()

如果有人可以帮助我理解我当前逻辑中的漏洞,我将不胜感激。谢谢。

最佳答案

每个屏幕都有一个 manager属性,为您提供所使用的 ScreenManager 实例。您只需使用它来引用 ScreemManager 实例并使用其 current 方法即可:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.clock import Clock


# Kivy Formatting
kv_text='''\

<MyScreenManager>:
LandingScreen:
InputScreen:

<InputScreen@Screen>:
name: 'input_sc'
AnchorLayout:
id: anchor_1
Button:
text: 'Hello'

<LandingScreen@Screen>:
name: 'landing_sc'
GridLayout:
id: grid_1
cols: 5
height: 480
width: 800
spacing: 25, 20
padding: 25,25

'''
# Screen Manager
class MyScreenManager(ScreenManager):
pass

# Main screen with button layout
class LandingScreen(Screen):
def __init__(self, **kwargs):
super(LandingScreen, self).__init__(**kwargs)
self.buttons = [] # add references to all buttons here
Clock.schedule_once(self._finish_init)

# IDs have to be used here because they cannot be applied until widget initialized
def _finish_init(self, dt):
self.ids.grid_1.cols = 5

# Loop to make 15 different buttons on screen
for x in range(15):
self.buttons.append(Button(text='button {}'.format(x)))
self.ids.grid_1.add_widget(self.buttons[x])
self.buttons[x].background_normal = 'YOUTUBE.png'

self.buttons[14].bind(on_release=self.switch_screen)

def switch_screen(self, *args):
self.manager.current = 'input_sc'

# Input screen
class InputScreen(Screen):
pass

class MySubApp(App):
def build(self):
return MyScreenManager()

def main():
Builder.load_string(kv_text)
app = MySubApp()
app.run()

if __name__ == '__main__':
main()

关于python - (Kivy Python) 在 .py 文件内按按钮切换屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44857167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com