[英]Trouble using ScreenManager to display two screens with Kivy & Python. Getting a black screen
请原谅凌乱的代码——这里是新手编码器。 我试图有两个屏幕:一个带有网格布局,另一个是空白的。 现在,gridlayout 屏幕上的每个按钮都应该将用户发送到空白屏幕。 最终,我希望每个按钮的 label 被用户替换为 screen2 上的输入字段。 我还在 python 文件中使用 for 循环来创建我的网格布局和 label 相应的按钮。
我的问题是当我运行它编译但给出黑屏的文件时。
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
class ScreenOne(Screen):
def makeGrid(self):
layout = GridLayout(cols = 12)
flipper = 6
m = 2
for r in range(1,17):
flipper = flipper * -1
subt = 6 + flipper
offset = m%2
for c in range(1,13):
cols = abs(c-subt) + offset
btn = Button(text=(str(r)+ '.'+ str(cols)))
layout.add_widget(btn)
m += 1
return layout
class ScreenTwo(Screen):
pass
class DraftBoardApp(App):
sm = ScreenManager()
def build(self):
DraftBoardApp.sm.add_widget(ScreenOne(name='screen_1'))
DraftBoardApp.sm.add_widget(ScreenTwo(name='screen_2'))
return DraftBoardApp.sm
if __name__ == '__main__':
DraftBoardApp().run()
My.kv 文件现在实际上是空的
<Screen_One>:
<Screen_Two>:
ScreenOne
尚未在您发布的代码中的任何地方 初始化(初始化) ,这就是您没有看到小部件的原因。 makeGrid
方法只是这个 class 中定义的常规方法。 为了使事情正常工作,您可以在默认的__init__
中定义所有内容(但不返回任何内容),或者在此处调用方法makeGrid
以添加返回的实例。
因此第一种方法是这样的,
class ScreenOne(Screen):
def __init__(self, **kwargs):
# Make sure you didn't override any
# superclass rule by calling super on this.
super().__init__(**kwargs)
# Define, add etc. whatever you need.
layout = GridLayout(cols = 12)
flipper = 6
m = 2
for r in range(1,17):
flipper = flipper * -1
subt = 6 + flipper
offset = m%2
for c in range(1,13):
cols = abs(c-subt) + offset
btn = Button(text=(str(r)+ '.'+ str(cols)))
layout.add_widget(btn)
m += 1
# Don't forget to add to this.
self.add_widget(layout)
作为旁注,在方法build
而不是直接访问 App 的子类(即这里DraftBoardApp
)中,您应该将其实例修改为,
self.sm.add_widget(ScreenOne(name='screen_1'))
代替
DraftBoardApp.sm.add_widget(ScreenOne(name='screen_1'))
等等
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.