2017-07-17 67 views
1

我是非常新的kivy和工作在一個簡單的應用程序使用python。我想在kivy中創建一個應用程序,它包含左窗格上的常量菜單項和右窗格或屏幕上各自的屏幕。但我無法在kivy示例中找到解決方案,也無法在youtube視頻教程中和google中找到解決方案。請檢查我的簡單代碼並參考一些解決方案。Kivy:多屏幕和菜單項不實施

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.base import runTouchApp 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.button import Button 
from kivy.properties import NumericProperty 

#Code Starts here 
Builder.load_string(""" 
#:import random random.random 
#:import NoTransition kivy.uix.screenmanager.NoTransition 


<MenuScreen>: 
    hue: random() 
    canvas: 
     Color: 
      hsv: self.hue, .5, .12 
     Rectangle: 
      size: self.size 
    Button: 
     text: 'Home' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.95} 
     size: 150, 50 
     on_release: root.manager.current = 'home' 
     on_release: root.manager.transition = NoTransition(duration=0) 
    Button: 
     text: 'Login History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.88} 
     size: 150, 50 
     on_release: root.manager.current = 'loginhistory' 
     on_release: root.manager.transition = NoTransition(duration=0) 
    Button: 
     text: 'Alarm History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.81} 
     size: 150, 50 
     on_release: root.manager.current = 'alarmhistory' 
     on_release: root.manager.transition = NoTransition(duration=0) 
    Button: 
     text: 'User Management' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.74} 
     size: 150, 50 
     on_release: root.manager.current = 'usermanagement' 
     on_release: root.manager.transition = NoTransition(duration=0) 
    Button: 
     text: 'Call SoS' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.67} 
     size: 150, 50 
     on_release: root.manager.current = 'callsos' 
     on_release: root.manager.transition = NoTransition(duration=0) 
    Button: 
     text: 'Settings' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.60} 
     size: 150, 50 
     on_release: root.manager.current = 'settings' 
     on_release: root.manager.transition = NoTransition(duration=0) 
    Button: 
     text: 'Call RealTec' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.53} 
     size: 150, 50 
     on_release: root.manager.current = 'callrealtec' 
     on_release: root.manager.transition = NoTransition(duration=0) 
    BoxLayout: 
     size_hint: .5, None 
     height: 250 
     pos_hint: {'center_x': .5} 
     orientation: 'vertical' 


<HomeScreen>: 
    hue: random() 
    canvas: 
     Color: 
      hsv: self.hue, .5, .2 
     Rectangle: 
      size: self.size 
    Button: 
     background_color: [1, 2, 1, 2] 
     text: 'Home' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.95} 
     size: 150, 50 
    Button: 
     text: 'Login History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.88} 
     size: 150, 50 
     on_release: root.manager.current = 'loginhistory' 
    Button: 
     text: 'Alarm History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.81} 
     size: 150, 50 
     on_release: root.manager.current = 'alarmhistory' 
    Button: 
     text: 'User Management' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.74} 
     size: 150, 50 
     on_release: root.manager.current = 'usermanagement' 
    Button: 
     text: 'Call SoS' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.67} 
     size: 150, 50 
     on_release: root.manager.current = 'callsos' 
    Button: 
     text: 'Settings' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.60} 
     size: 150, 50 
     on_release: root.manager.current = 'settings' 
    Button: 
     text: 'Call RealTec' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.53} 
     size: 150, 50 
     on_release: root.manager.current = 'callrealtec' 
    Button: 
     text: 'Main Menu' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.46} 
     size: 150, 50 
     on_release: root.manager.current = 'menu' 
    BoxLayout: 
     size_hint: .5, None 
     height: 250 
     pos_hint: {'center_x': .5} 
     orientation: 'vertical' 

<LoginHistoryScreen>: 
    hue: random() 
    canvas: 
     Color: 
      hsv: self.hue, .5, .9 
     Rectangle: 
      size: self.size 
    Button: 
     text: 'Home' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.95} 
     size: 150, 50 
     on_release: root.manager.current = 'home' 
    Button: 
     text: 'Login History' 
     background_color: [1, 2, 1, 2] 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.88} 
     size: 150, 50 
    Button: 
     text: 'Alarm History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.81} 
     size: 150, 50 
     on_release: root.manager.current = 'alarmhistory' 
    Button: 
     text: 'User Management' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.74} 
     size: 150, 50 
     on_release: root.manager.current = 'usermanagement' 
    Button: 
     text: 'Call SoS' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.67} 
     size: 150, 50 
     on_release: root.manager.current = 'callsos' 
    Button: 
     text: 'Settings' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.60} 
     size: 150, 50 
     on_release: root.manager.current = 'settings' 
    Button: 
     text: 'Call RealTec' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.53} 
     size: 150, 50 
     on_release: root.manager.current = 'callrealtec' 
    Button: 
     text: 'Main Menu' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.46} 
     size: 150, 50 
     on_release: root.manager.current = 'menu' 
    BoxLayout: 
     size_hint: .5, None 
     height: 250 
     pos_hint: {'center_x': .5} 
     orientation: 'vertical' 


<AlarmHistoryScreen>: 
    hue: random() 
    canvas: 
     Color: 
      hsv: self.hue, .5, .6 
     Rectangle: 
      size: self.size 
    Button: 
     text: 'Home' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.95} 
     size: 150, 50 
     on_release: root.manager.current = 'home' 
    Button: 
     text: 'Login History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.88} 
     size: 150, 50 
     on_release: root.manager.current = 'loginhistory' 
    Button: 
     text: 'Alarm History' 
     background_color: [1, 2, 1, 2] 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.81} 
     size: 150, 50 
    Button: 
     text: 'User Management' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.74} 
     size: 150, 50 
     on_release: root.manager.current = 'usermanagement' 
    Button: 
     text: 'Call SoS' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.67} 
     size: 150, 50 
     on_release: root.manager.current = 'callsos' 
    Button: 
     text: 'Settings' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.60} 
     size: 150, 50 
     on_release: root.manager.current = 'settings' 
    Button: 
     text: 'Call RealTec' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.53} 
     size: 150, 50 
     on_release: root.manager.current = 'callrealtec' 
    Button: 
     text: 'Main Menu' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.46} 
     size: 150, 50 
     on_release: root.manager.current = 'menu' 
    BoxLayout: 
     size_hint: .5, None 
     height: 250 
     pos_hint: {'center_x': .5} 
     orientation: 'vertical' 

<UserManagementScreen>: 
    hue: random() 
    canvas: 
     Color: 
      hsv: self.hue, .5, .8 
     Rectangle: 
      size: self.size 
    Button: 
     text: 'Home' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.95} 
     size: 150, 50 
     on_release: root.manager.current = 'home' 
    Button: 
     text: 'Login History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.88} 
     size: 150, 50 
     on_release: root.manager.current = 'loginhistory' 
    Button: 
     text: 'Alarm History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.81} 
     size: 150, 50 
     on_release: root.manager.current = 'alarmhistory' 
    Button: 
     text: 'User Management' 
     background_color: [1, 2, 1, 2] 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.74} 
     size: 150, 50 
    Button: 
     text: 'Call SoS' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.67} 
     size: 150, 50 
     on_release: root.manager.current = 'callsos' 
    Button: 
     text: 'Settings' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.60} 
     size: 150, 50 
     on_release: root.manager.current = 'settings' 
    Button: 
     text: 'Call RealTec' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.53} 
     size: 150, 50 
     on_release: root.manager.current = 'callrealtec' 
    Button: 
     text: 'Main Menu' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.46} 
     size: 150, 50 
     on_release: root.manager.current = 'menu' 
    BoxLayout: 
     size_hint: .5, None 
     height: 250 
     pos_hint: {'center_x': .5} 
     orientation: 'vertical' 

<CallSoSScreen>: 
    hue: random() 
    canvas: 
     Color: 
      hsv: self.hue, .5, .7 
     Rectangle: 
      size: self.size 
    Button: 
     text: 'Home' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.95} 
     size: 150, 50 
     on_release: root.manager.current = 'home' 
    Button: 
     text: 'Login History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.88} 
     size: 150, 50 
     on_release: root.manager.current = 'loginhistory' 
    Button: 
     text: 'Alarm History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.81} 
     size: 150, 50 
     on_release: root.manager.current = 'alarmhistory' 
    Button: 
     text: 'User Management' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.74} 
     size: 150, 50 
     on_release: root.manager.current = 'usermanagement' 
    Button: 
     text: 'Call SoS' 
     background_color: [1, 2, 1, 2] 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.67} 
     size: 150, 50 
    Button: 
     text: 'Settings' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.60} 
     size: 150, 50 
     on_release: root.manager.current = 'settings' 
    Button: 
     text: 'Call RealTec' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.53} 
     size: 150, 50 
     on_release: root.manager.current = 'callrealtec' 
    Button: 
     text: 'Main Menu' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.46} 
     size: 150, 50 
     on_release: root.manager.current = 'menu' 
    BoxLayout: 
     size_hint: .5, None 
     height: 250 
     pos_hint: {'center_x': .5} 
     orientation: 'vertical' 

<SettingsScreen>: 
    hue: random() 
    canvas: 
     Color: 
      hsv: self.hue, .5, .5 
     Rectangle: 
      size: self.size 
    Button: 
     text: 'Home' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.95} 
     size: 150, 50 
     on_release: root.manager.current = 'home' 
    Button: 
     text: 'Login History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.88} 
     size: 150, 50 
     on_release: root.manager.current = 'loginhistory' 
    Button: 
     text: 'Alarm History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.81} 
     size: 150, 50 
     on_release: root.manager.current = 'alarmhistory' 
    Button: 
     text: 'User Management' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.74} 
     size: 150, 50 
     on_release: root.manager.current = 'usermanagement' 
    Button: 
     text: 'Call SoS' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.67} 
     size: 150, 50 
     on_release: root.manager.current = 'callsos' 
    Button: 
     text: 'Settings' 
     background_color: [1, 2, 1, 2] 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.60} 
     size: 150, 50 
    Button: 
     text: 'Call RealTec' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.53} 
     size: 150, 50 
     on_release: root.manager.current = 'callrealtec' 
    Button: 
     text: 'Main Menu' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.46} 
     size: 150, 50 
     on_release: root.manager.current = 'menu' 
    BoxLayout: 
     size_hint: .5, None 
     height: 250 
     pos_hint: {'center_x': .5} 
     orientation: 'vertical' 

<CallRealTecScreen>: 
    hue: random() 
    canvas: 
     Color: 
      hsv: self.hue, .5, .4 
     Rectangle: 
      size: self.size 
    Button: 
     text: 'Home' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.95} 
     size: 150, 50 
     on_release: root.manager.current = 'home' 
    Button: 
     text: 'Login History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.88} 
     size: 150, 50 
     on_release: root.manager.current = 'loginhistory' 
    Button: 
     text: 'Alarm History' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.81} 
     size: 150, 50 
     on_release: root.manager.current = 'alarmhistory' 
    Button: 
     text: 'User Management' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.74} 
     size: 150, 50 
     on_release: root.manager.current = 'usermanagement' 
    Button: 
     text: 'Call SoS' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.67} 
     size: 150, 50 
     on_release: root.manager.current = 'callsos' 
    Button: 
     text: 'Settings' 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.60} 
     size: 150, 50 
     on_release: root.manager.current = 'settings' 
    Button: 
     text: 'Call RealTec' 
     background_color: [1, 2, 1, 2] 
     size_hint: None, None 
     pos_hint: {'center_x':.05, 'center_y':.53} 
     size: 150, 50 
    Button: 
     text: 'Main Menu' 
     size_hint: None, None 
     pos_hint: {'center_x':0.05, 'center_y':0.46} 
     size: 150, 50 
     on_release: root.manager.current = 'menu' 
    BoxLayout: 
     size_hint: .5, None 
     height: 250 
     pos_hint: {'center_x': .5} 
     orientation: 'vertical' 


""") 

# Declare both screens 
class MenuScreen(Screen): 
    hue = NumericProperty(0) 
    pass 

class HomeScreen(Screen): 
    hue = NumericProperty(0) 
    pass 

class LoginHistoryScreen(Screen): 
    hue = NumericProperty(0) 
    pass 

class AlarmHistoryScreen(Screen): 
    hue = NumericProperty(0) 
    pass 

class UserManagementScreen(Screen): 
    hue = NumericProperty(0) 
    pass 

class CallSosScreen(Screen): 
    hue = NumericProperty(0) 
    pass 

class SettingsScreen(Screen): 
    hue = NumericProperty(0) 
    pass 

class CallRealTecScreen(Screen): 
    hue = NumericProperty(0) 
    pass 


sm = ScreenManager() 
sm.add_widget(MenuScreen(name='menu')) 
sm.add_widget(HomeScreen(name='home')) 
sm.add_widget(LoginHistoryScreen(name='loginhistory')) 
sm.add_widget(AlarmHistoryScreen(name='alarmhistory')) 
sm.add_widget(UserManagementScreen(name='usermanagement')) 
sm.add_widget(CallSosScreen(name='callsos')) 
sm.add_widget(CallRealTecScreen(name='callrealtec')) 
sm.add_widget(SettingsScreen(name='settings')) 

class TestApp(App): 

    def build(self): 
     return sm 

if __name__ == '__main__': 
    TestApp().run() 
+1

請閱讀我們的[問]部分。代碼或代碼檢查的一攬子請求通常在這裏脫離主題。 – gung

回答

0

我沒有通讀您的代碼。你應該提供一個Minimal, Complete, and Verifiable example。這就是說這裏有一個你可以建立的簡短例子。主要的例子是,您不必將ScreenManager添加爲頂級窗口小部件。

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 
from kivy.uix.label import Label 


class Manager(ScreenManager): 

    def __init__(self, *args, **kwargs): 
     super(Manager, self).__init__(*args, **kwargs) 

     for i in range(4): 
      txt = 'Screen {}'.format(i) 
      lbl = Label(text=txt) 
      screen = Screen(name=txt) 
      screen.add_widget(lbl) 
      self.add_widget(screen) 


class Nav(GridLayout): 

    def __init__(self, sm=None, *args, **kwargs): 
     super(Nav, self).__init__(*args, **kwargs) 
     self.sm = sm 
     self.rows = 4 
     self.size_hint = (.2, 1) 
     for i in range(4): 
      self.add_widget(Button(text="Screen {}".format(i), on_release=self.change)) 

    def change(self, btn): 
     self.sm.current = btn.text 


class Root(BoxLayout): 

    def __init__(self, *args, **kwargs): 
     super(Root, self).__init__(*args, **kwargs) 
     self.orientation = "horizontal" 
     sm = Manager() 

     self.add_widget(Nav(sm=sm)) 
     self.add_widget(sm) 


class TestApp(App): 

    def build(App): 
     return Root() 


if __name__ == '__main__': 
    TestApp().run() 
+0

感謝您的幫助。它的工作原理,但我怎麼能在不同的屏幕上工作(如其他屏幕切換到前面的文本框,圖標等)。如果我在screen1上工作,它能顯示一些對象,而screen2顯示其他對象等等,你能幫助我嗎? – SufAB

+0

您將希望基於'screen'創建一個新類,然後實例化每個屏幕,以便您可以添加/訪問該對象的屬性和值。試一試,看看你能想出什麼。之後,如果您需要幫助,最好發佈一個新問題。 [這](https://pythonprogramming.net/kivy-screen-manager-tutorial/)是一個體面的教程。 – Mox

+0

如果這回答了您的問題,請接受我的回答。謝謝! – Mox