[英]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.