簡體   English   中英

kivy 屏幕之間的轉換

[英]kivy transition between screens

我用 python kivy 制作了一個圖形用戶界面,其中有一個啟動屏幕,其中有一個按鈕,按下時會生成新屏幕,它還會生成新按鈕,因此更容易選擇我需要聚焦的屏幕,但我無法獲得它工作正常因為我不能在新制作的屏幕上生成按鈕,當它們不在焦點時,腳本似乎只為焦點屏幕生成按鈕

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition

    
class ScreenManagement(ScreenManager):
    def __init__(self, **kwargs):
        super(ScreenManagement, self).__init__(**kwargs)

sm = ScreenManagement(transition=FadeTransition())        
         
      
class newtab(Screen):
    def __init__(self, **kwargs):
        super(newtab, self).__init__(**kwargs)
        
        self.bt1=(Button(text="New tab", size_hint =(.1, .1)          ,pos_hint ={'center_x':.1, 'center_y':.94}))
        self.add_widget(self.bt1)
        self.bt1.bind(on_release=self.new_tab)
        
        
        self.txt1 = TextInput(text='',size_hint =(.1, .1),        pos_hint ={'center_x':.2, 'center_y':.75}, multiline=True)
        self.add_widget(self.txt1)
        

            
    def transition(self, instance):
        self.manager.current = (instance.text)
        for item in sm.screen_names:
            
            self.bt2=(Button(text=item, size_hint =(.1, .1)          ,pos_hint ={'center_x':(.1*sm.screen_names.index(item)+.1), 'center_y':.84}))
            self.add_widget(self.bt2)
            self.bt2.bind(on_release=self.transition)
        
    def new_tab(self, *args):
                
        n = len(self.manager.screen_names)    ##number of screens+1
        screen = newtab(name="screen {}".format(n))      #make new screen and give it number
        self.manager.add_widget(screen)
        self.manager.current = "screen 0"
               
        for item in sm.screen_names:            
            self.bt2=(Button(text=item, size_hint =(.1, .1)          ,pos_hint ={'center_x':(.1*sm.screen_names.index(item)+.1), 'center_y':.84}))
            self.add_widget(self.bt2)
            self.bt2.bind(on_release=self.transition)

            
sm.add_widget(newtab(name='screen 0'))    
             
class Application(App):
    def build(self):       
        return sm

if __name__ == "__main__":
    Application().run()

我想下面是您期望得到的。 但我同意@ApuCoder的觀點,您可能會尋找TabbedPanel功能。

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition

class ScreenManagement(ScreenManager):
    def __init__(self, **kwargs):
        super(ScreenManagement, self).__init__(**kwargs)

sm = ScreenManagement(transition=FadeTransition())

class newtab(Screen):
    def __init__(self, **kwargs):
        super(newtab, self).__init__(**kwargs)

        self.bt1 = (Button(text="New tab", size_hint=(.1, .1), pos_hint={'center_x': .1, 'center_y': .94}))
        self.add_widget(self.bt1)
        self.bt1.bind(on_release=self.new_tab)

        self.txt1 = TextInput(text='', size_hint=(.1, .1), pos_hint={'center_x': .2, 'center_y': .75}, multiline=True)
        self.add_widget(self.txt1)

        # add all present screen buttons to newly created screen
        for i, screen in enumerate(sm.screens):
            self.bt2 = (Button(text=screen.name, size_hint=(.1, .1), pos_hint={'center_x': (.1 * i + .1), 'center_y': .84}))
            self.add_widget(self.bt2)
            self.bt2.bind(on_release=self.transition)

        # add this newly created screen button to all screens
        for screen in sm.screens + [self]:
            screen.bt2 = (Button(text=self.name, size_hint=(.1, .1), pos_hint={'center_x': (.1 * len(sm.screens) + .1), 'center_y': .84}))
            screen.add_widget(screen.bt2)
            screen.bt2.bind(on_release=screen.transition)

    def transition(self, instance):
        self.manager.current = instance.text

    def new_tab(self, *args):
        n = len(self.manager.screen_names)  ##number of screens+1
        screen = newtab(name="screen {}".format(n))  # make new screen and give it number
        self.manager.add_widget(screen)
        self.manager.current = "screen 0"

sm.add_widget(newtab(name='screen 0'))

class Application(App):
    def build(self):
        return sm

if __name__ == "__main__":
    Application().run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM