簡體   English   中英

Kivy 從 FloatLayout 繼承 ScreenManager

[英]Kivy Inherit ScreenManager from FloatLayout

我無法理解如何使用 Kivy 將一個 class 的功能繼承到另一個。 我了解錯誤消息( 'LoadDialog_Directory' object has no attribute 'manager' ),但我只是不知道如何修復它。 我相信我需要對下面的 function 做點什么,但最終,我不知道。

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

此腳本的目標是能夠將filechooser特定驅動程序作為文件選擇器的path 我之所以選擇這種方法而不是其他方法,是因為大多數人使用的是 Kivy 1.11.1,這個版本有很多不推薦使用的功能,不適用於 2.0。

.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang.builder import Builder
from kivy.uix.spinner import SpinnerOption
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.utils import platform
from kivy.properties import StringProperty

import os
import string


class WindowManager(ScreenManager):
    pass   
class MyOption(SpinnerOption):
    pass


class LoadDialog_Directory(FloatLayout):
    load = ObjectProperty(None)
    cancel = ObjectProperty(None)

    def dir_driver(self):
        x = self.manager.get_screen("first")
        return str(x.ids.drive_dir.text)

        
        
class FirstWindow(Screen):

    def get_drives(self):
        drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]
        return drives
        
      
    def dismiss_popup(self):
        self._popup.dismiss()
  
        
    def show_load_directory(self):
        content = LoadDialog_Directory(load=self.directroy_path, cancel=self.dismiss_popup)
        self._popup = Popup(title="Load file", content=content, size_hint=(0.9, 0.9))
        self._popup.open()
        
                
    def directroy_path(self, path, filename):        
        self.ids.text_input_directory.text = str(filename[0])
        self.dismiss_popup()
        
             
kv_main = Builder.load_file('main.kv')

#
class MyApp(App):
    def build(self):
        return kv_main
        

if __name__ == '__main__':
    
    MyApp().run()

主文件

#:include first.kv

WindowManager:
    FirstWindow:
    
<LoadDialog_Directory>:
    BoxLayout:
        size: root.size
        pos: root.pos
        orientation: "vertical"
        FileChooserListView:
            id: filechooser
            dirselect: True
            path: root.dir_driver()

        BoxLayout:
            size_hint_y: None
            height: 30
            Button:
                text: "Cancel"
                on_release: root.cancel()
            Button:
                text: "Load"
                on_release: root.load(filechooser.path, filechooser.selection)

第一個.kv

<FirstWindow>
    name: 'first'
    GridLayout:
        cols: 1
        
        BoxLayout:
            orientation: "horizontal"               
            TextInput:
        
        BoxLayout:
            orientation: "horizontal"
            Spinner:    
                id: drive_dir
                text: "Root Drive"
                halign: 'center'
                option_cls: "MyOption"
                values: root.get_drives()               
            Button:
                text: "Set Result Directory"
                on_release: root.show_load_directory()
            TextInput:
                id: text_input_directory
                disabled: True
                text: text_input_directory.text
        
        BoxLayout:
            size_hint: (0.01, 1)
            orientation: "horizontal"       
            TextInput:

旁注:額外空白TextInput的原因是如果Spinner占用過多的應用程序,它將不會 function(顯示驅動程序)。

經過幾個小時的反復試驗,我終於讓它工作了,但我不知道它為什么工作。 以下是變化:

  1. class LoadDialog_Directory(FloatLayout)中的新變量 - input_pth
  2. 在 class input_pth class FirstWindow(Screen) function show_load_directory(self)中將 input_pth 調用到我的content變量中
  3. 在 main.kv 文件中將我的filechooser.path設置為root.input_pth

我不明白content中的input_pth變量如何能夠引用class LoadDialog_Directory(FloatLayout)而無需傳遞類似的內容:

def __init__(self, input_pth, **kwargs):
        super(LoadDialog_Directory, self).__init__()
        self.input_pth = input_pth

.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang.builder import Builder
from kivy.uix.spinner import SpinnerOption
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.utils import platform
from kivy.properties import StringProperty

import os
import string


class WindowManager(ScreenManager):
    pass  
    
class MyOption(SpinnerOption):
    pass


class LoadDialog_Directory(FloatLayout):   
    input_pth = StringProperty()
    load = ObjectProperty()
    cancel = ObjectProperty()
    
        
        
class FirstWindow(Screen):

    def drive_list(self):
        drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]
        return drives
        
      
    def dismiss_popup(self):
        self._popup.dismiss()
  
        
    def show_load_directory(self):
        content = LoadDialog_Directory(load=self.directroy_path, cancel=self.dismiss_popup, input_pth=self.ids.drive_dir.text)
        
        self._popup = Popup(title="Load file", content=content, size_hint=(0.9, 0.9))
        self._popup.open()
        
                
    def directroy_path(self, path, filename):        
        self.ids.text_input_directory.text = str(filename[0])
        self.dismiss_popup()

        
             
kv_main = Builder.load_file('main.kv')

#
class MyApp(App):
    def build(self):
        return kv_main
        

if __name__ == '__main__':
    
    MyApp().run()

主文件

#:include first.kv

WindowManager:
    FirstWindow:
    
<LoadDialog_Directory>:
    BoxLayout:
        size: root.size
        pos: root.pos
        orientation: "vertical"
        FileChooserListView:
            id: filechooser
            dirselect: True
            path: root.input_pth

        BoxLayout:
            size_hint_y: None
            height: 30
            Button:
                text: "Cancel"
                on_release: root.cancel()
            Button:
                text: "Load"
                on_release: root.load(filechooser.path, filechooser.selection)

第一個.kv

<FirstWindow>
    name: 'first'
    GridLayout:
        cols: 1
        
        BoxLayout:
            orientation: "horizontal"               
            TextInput:
        
        BoxLayout:
            orientation: "horizontal"
            Spinner:    
                id: drive_dir
                halign: 'center'
                option_cls: "MyOption"
                values: root.drive_list()

            Button:
                text: "Set Result Directory"
                on_release: root.show_load_directory()
            TextInput:
                id: text_input_directory
                disabled: True
                text: text_input_directory.text
        
        BoxLayout:
            size_hint: (0.01, 1)
            orientation: "horizontal"       
            TextInput:

暫無
暫無

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

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