kivy
スクリーンマネージャの使用
サーチ…
備考
円形輸入
これは、Kivy、Python、および多くのプログラミング言語の大きな問題です
2つのファイルで1つのリソースが必要な場合は、このリソースを最も使用するファイルに配置するのが普通です。しかし、これが2つのリソースで発生し、それらが反対のファイルになった場合、両方をPythonにインポートすると、循環インポートが行われます。
Pythonは最初のファイルをインポートしますが、このファイルは2番目のファイルをインポートします。 2番目の方法では、最初のファイルをインポートし、2番目のファイルをインポートします。 PythonがエラーをスローするImportError : cannot import name <classname>
これは、3番目のファイルを使用し、この3番目のファイルを最初の2個にインポートすることで解決できます。これは、2番目の例のresources.py
です。
シンプルな画面マネージャの使用法
# A line used mostly as the first one, imports App class
# that is used to get a window and launch the application
from kivy.app import App
# Casual Kivy widgets that reside in kivy.uix
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.screenmanager import SlideTransition
# Inherit Screen class and make it look like
# a simple page with navigation
class CustomScreen(Screen):
# It's necessary to initialize a widget the class inherits
# from to access its methods such as 'add_widget' with 'super()'
def __init__(self, **kwargs):
# Py2/Py3 note: although in Py3 'super()' is simplified
# it's a good practice to use Py2 syntax, so that the
# code is compatibile in both versions
super(CustomScreen, self).__init__(**kwargs)
# Put a layout in the Screen which will take
# Screen's size and pos.
# The 'orientation' represents a direction
# in which the widgets are added into the
# BoxLayout - 'horizontal' is the default
layout = BoxLayout(orientation='vertical')
# Add a Label with the name of Screen
# and set its size to 50px
layout.add_widget(Label(text=self.name, font_size=50))
# Add another layout to handle the navigation
# and set the height of navigation to 20%
# of the CustomScreen
navig = BoxLayout(size_hint_y=0.2)
# Create buttons with a custom text
prev = Button(text='Previous')
next = Button(text='Next')
# Bind to 'on_release' events of Buttons
prev.bind(on_release=self.switch_prev)
next.bind(on_release=self.switch_next)
# Add buttons to navigation
# and the navigation to layout
navig.add_widget(prev)
navig.add_widget(next)
layout.add_widget(navig)
# And add the layout to the Screen
self.add_widget(layout)
# *args is used to catch arguments that are returned
# when 'on_release' event is dispatched
def switch_prev(self, *args):
# 'self.manager' holds a reference to ScreenManager object
# and 'ScreenManager.current' is a name of a visible Screen
# Methods 'ScreenManager.previous()' and 'ScreenManager.next()'
# return a string of a previous/next Screen's name
self.manager.transition = SlideTransition(direction="right")
self.manager.current = self.manager.previous()
def switch_next(self, *args):
self.manager.transition = SlideTransition(direction="right")
self.manager.current = self.manager.next()
class ScreenManagerApp(App):
# 'build' is a method of App used in the framework it's
# expected that the method returns an object of a Kivy widget
def build(self):
# Get an object of some widget that will be the core
# of the application - in this case ScreenManager
root = ScreenManager()
# Add 4 CustomScreens with name 'Screen <order>`
for x in range(4):
root.add_widget(CustomScreen(name='Screen %d' % x))
# Return the object
return root
# This is only a protection, so that if the file
# is imported it won't try to launch another App
if __name__ == '__main__':
# And run the App with its method 'run'
ScreenManagerApp().run()
スクリーンマネージャー
次の例では、SettingsScreenとMenuScreenの2つの画面があります。
最初のボタンを使用して、現在の画面では、画面を他の画面に変更します。
ここにコードです:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
# Create both screens. Please note the root.manager.current: this is how
# you can control the ScreenManager from kv. Each screen has by default a
# property manager that gives you the instance of the ScreenManager used.
Builder.load_string("""
<MenuScreen>:
BoxLayout:
Button:
text: 'First Button on Menu'
on_press: root.manager.current = 'settings'
Button:
text: 'Second Button on Menu'
<SettingsScreen>:
BoxLayout:
Button:
text: 'First Button on Settings'
on_press: root.manager.current = 'menu'
Button:
text: 'Second Button on Settings'
""")
# Declare both screens
class MenuScreen(Screen):
pass
class SettingsScreen(Screen):
pass
# Create the screen manager
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))
class TestApp(App):
def build(self):
return sm
if __name__ == '__main__':
TestApp().run()
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow