2013-10-21 9 views
7

के साथ स्क्रीन मैनेजर में स्क्रीन बदलना मैं जानना चाहता हूं कि एक केवी फ़ाइल/केवी भाषा का उपयोग किये बिना, बटन पर बाध्य एक ऑन -प्रेस ईवेंट का उपयोग करके स्क्रीन कैसे बदलें।किवी: ऑन -प्रेस ईवेंट

मैंने किवी दस्तावेज के माध्यम से पढ़ा है, लेकिन केवल केवी फ़ाइल का उपयोग करके समाधान ढूंढने में सक्षम हैं।

उदाहरण:

screenmanager.current = 'screen2'

लेकिन मैं यह पता लगाने नहीं कर सकते हैं कि कैसे एक बटन का उपयोग कर एक ही प्राप्त करने के लिए:

on_press: root.manager.current = 'screen2'

मैं भी का उपयोग कर मुख्य अजगर फ़ाइल में स्क्रीन को बदल सकते हैं । यह पूरा करने के

उत्तर

6

एक सरल तरीका है अपने स्वयं के बटन उपवर्ग परिभाषित करने के लिए है:

class ScreenButton(Button): 
    screenmanager = ObjectProperty() 
    def on_press(self, *args): 
     super(ScreenButton, self).on_press(*args) 
     self.screenmanager.current = 'whatever' 

जब बटन दबाने on_press प्रक्रिया स्वतः ही कहा जाता है, तो screenmanager के current संपत्ति बदल जाएगा।

sm = ScreenManager() 

sc1 = Screen(name='firstscreen') 
sc1.add_widget(ScreenButton(screenmanager=sm)) 

sc2 = Screen(name='whatever') 
sc2.add_widget(Label(text='another screen')) 

sm.add_widget(sc1) 
sm.add_widget(sc2) 

बटन पर क्लिक करने के रूप में आवश्यक स्क्रीन स्विच करना चाहिए:

तो फिर तुम जैसे कोड कुछ हो सकता है।

एक और तरीका (जो संभवतया केवी भाषा वास्तव में करता है) मैन्युअल रूप से bind विधि का उपयोग करना होगा।

def switching_function(*args): 
    some_screen_manager.current = 'whatever' 

some_button.bind(on_press=switching_function) 

इसका मतलब यह होगा कि जब भी switching_functionsome_button दबाया जाता है कहा जाता है। निश्चित रूप से फ़ंक्शन को परिभाषित करने के तरीके के बारे में यहां बहुत लचीलापन है, इसलिए (उदाहरण के लिए) आप स्क्रीनमैंजर को फ़ंक्शन के पहले तर्क के रूप में पास करने जैसे कुछ सामान्य कर सकते हैं।

मैंने इस कोड का परीक्षण नहीं किया और यह एक पूर्ण ऐप नहीं है, लेकिन उम्मीद है कि इसका अर्थ स्पष्ट है। किसी भी विधि को ठीक काम करना चाहिए, आप जिस तरह से सबसे समझदार लगता है चुन सकते हैं। मैं बाद में एक और पूरा उदाहरण बना सकता हूं।

+0

अपने जवाब के लिए धन्यवाद। सबक्लास समाधान का उपयोग करने से मुझे वह करने में मदद मिली जो मैं करने की कोशिश कर रहा था। एक बार फिर धन्यवाद। – Derick

2

एक अन्य समाधान, EventDispatcher की setter विधि का उपयोग करने, screen_manager.current

button.bind(on_press=partial(sm.setter('current'), (sm, 'whatever')) 
निश्चित रूप से

के लिए सेटर समारोह के लिए एक संदर्भ मिल गया था, यह बहुत सेक्सी नहीं है, यही कारण है कि केवी अक्सर एक क्लीनर है कि इन चीजों का समाधान, लेकिन यह काम करना चाहिए।

ps: यदि आपको इसके बारे में पता नहीं है, तो partialfunctools मॉड्यूल से आता है, और यह अक्सर प्रीलोडेड पैरामीटर के साथ इस तरह के कॉलबैक बनाने के लिए उपयोगी होता है।

+0

मैं किवी के लिए बिल्कुल नया हूं, इसलिए मेरी सूची में कामुकता अधिक नहीं है। यह मेरे लिए बहुत आसान होगा। धन्यवाद। – Derick

5

दो स्क्रीन, कोई केवी फ़ाइल सब कुछ पायथन में किया के साथ एक काम कर उदाहरण:

import kivy 
kivy.require('1.8.0') 

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

class ScreenOne(Screen): 

    def __init__ (self,**kwargs): 
     super (ScreenOne, self).__init__(**kwargs) 

     my_box1 = BoxLayout(orientation='vertical') 
     my_label1 = Label(text="BlaBlaBla on screen 1", font_size='24dp') 
     my_button1 = Button(text="Go to screen 2",size_hint_y=None, size_y=100) 
     my_button1.bind(on_press=self.changer) 
     my_box1.add_widget(my_label1) 
     my_box1.add_widget(my_button1) 
     self.add_widget(my_box1) 

    def changer(self,*args): 
     self.manager.current = 'screen2' 

class ScreenTwo(Screen): 

    def __init__(self,**kwargs): 
     super (ScreenTwo,self).__init__(**kwargs) 

     my_box1 = BoxLayout(orientation='vertical') 
     my_label1 = Label(text="BlaBlaBla on screen 2",font_size='24dp') 
     my_button1 = Button(text="Go to screen 1",size_hint_y=None, size_y=100) 
     my_button1.bind(on_press=self.changer) 
     my_box1.add_widget(my_label1) 
     my_box1.add_widget(my_button1) 
     self.add_widget(my_box1) 

    def changer(self,*args): 
     self.manager.current = 'screen1' 

class TestApp(App): 

     def build(self): 
      my_screenmanager = ScreenManager() 
      screen1 = ScreenOne(name='screen1') 
      screen2 = ScreenTwo(name='screen2') 
      my_screenmanager.add_widget(screen1) 
      my_screenmanager.add_widget(screen2) 
      return my_screenmanager 

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

क्या कोई विशेष कारण है कि यह Kivy 1.9.2 के साथ काम नहीं करेगा? –

संबंधित मुद्दे