Kivy's Spinner не открывается - PullRequest
2 голосов
/ 26 марта 2020

Я работаю над проектом, и у меня возникают проблемы при открытии виджета счетчика из KIVY. Я не смог найти никакого ответа, просматривая inte rnet, поэтому я пришел сюда:)

Я попытался использовать Float Layout вместо Grid, но он тоже не работал. Использование kivy == 1.11.1 (не работало ни в 2.0.0rc1, ни в 1.11.0)

UI.py

import kivy
kivy.require('1.11.1')

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.uix.button import Button

from kivy.core.window import Window
Window.clearcolor = (1, 1, 1, 1)


from tkinter import Tk
from tkinter.filedialog import askopenfilename

class CustRedButton(Button):
    pass

class MainScreen(Screen):
    def OpenData(self):
        Tk().withdraw()  # we don't want a full GUI, so keep the root window from appearing
        dir = askopenfilename(title='Open File', filetypes=(('CSV files', '*.csv'),))
        if dir:
            self.DataFileDir=dir

    def toSettings(self):
        try:
            if self.DataFileDir:
                pass
            self.manager.current = 'settings'
        except Exception as e:
            if isinstance(e, AttributeError):
                print('Got No Data')
                self.manager.current = 'settings'
            else:
                print(e)


class SettingsScreen(Screen):
    def __init__(self, **kwargs):
        super(SettingsScreen, self).__init__(**kwargs)
        self.spinner_values = ('House', 'Home', 'Car', 'Kivy')

    def toMain(self):
        try:
            self.manager.current = 'main'
        except Exception as e:
            print(e)

    def on_spinner_select(self, text):
        print(text)


class ScreenManagment(ScreenManager):
    main_screen= ObjectProperty(None)
    settings_screen= ObjectProperty(None)


presentation= Builder.load_file('main.kv')
class MainApp(App):
    def build(self):
        return presentation

def runUI():
    MainApp().run()


if __name__ == '__main__':
    runUI()

и main.kv:

#: import NoTransition kivy.uix.screenmanager.NoTransition

<Button>:
    font_size: root.width*0.1
    size_hint: 0.2,0.17
    color: 0,0,0,1

    background_normal: ''
    background_color: 0.8,0.8,0.8,1

<CustRedButton>:
    font_size: root.width*0.19
    size_hint: 0.1,0.1
    color: 0,0,0,1

    background_normal: ''
    background_color: 1,0.1,0.1,1


<Label>:
    color: 0,0,0,1


ScreenManagment:
    id: screen_manager

    main_screen: main_screen
    settngs_screen: settings_screen

    transition: NoTransition()
    MainScreen:
        name: 'main'
        id: main_screen
        manager: screen_manager

    SettingsScreen:
        name: 'settings'
        id: settings_screen
        manager: screen_manager

<MainScreen>:
    BoxLayout:
        orientation:'horizontal'
        FloatLayout:
            Button:
                pos_hint: {'x':0.55,'top':0.6}
                on_press: root.toSettings()
                text: 'Go To Settings'

            Button:
                pos_hint: {'x':0.25,'top':0.6}
                text: 'Open Data'
                on_release: root.OpenData()


<SettingsScreen>:
    BoxLayout:
        orientation:'horizontal'
        FloatLayout:
            CustRedButton:
                pos_hint:{'x':0, 'y':0}
                on_press: root.toMain()
                text: 'To Main'

            GridLayout:
                cols:2
                pos_hint: {'x':-0.1, 'y':0.6}
                size_hint: 1, 0.2
                Label:
                    text:"Select"

                Spinner:
                    pos_hint: {'center': (.7, .7)}
                    text: root.spinner_values[0]
                    values: root.spinner_values
                    on_text: root.on_spinner_select(text)
                    background_color: 0.5,0.5,0.5,1

Все остальные виджеты работают нормально, и спиннер получает «spinner_values» из __init__ штрафа. На самом деле я понятия не имею, почему я вижу счетчик, но не открываю его, чтобы выбрать значение.

ps Я новичок в StackOverflow, поэтому, если я не поместил достаточно информации, сообщите мне, и я добавлю ее

1 Ответ

2 голосов
/ 26 марта 2020

Проблема в том, что ваше правило <Button>: применяется ко ВСЕМ Buttons, включая Buttons в Spinner. Изменение этого правила на MyButton@Button> и использование его для двух Buttons позволяет Spinner работать. Вот модифицированная версия вашего kv файла, который, я думаю, будет делать то, что вы хотите:

#: import NoTransition kivy.uix.screenmanager.NoTransition

<MyButton@Button>:
    font_size: root.width*0.1
    size_hint: 0.2,0.17
    color: 0,0,0,1

    background_normal: ''
    background_color: 0.8,0.8,0.8,1

<CustRedButton>:
    font_size: root.width*0.19
    size_hint: 0.1,0.1
    color: 0,0,0,1

    background_normal: ''
    background_color: 1,0.1,0.1,1


<Label>:
    color: 0,0,0,1


ScreenManagment:
    id: screen_manager

    main_screen: main_screen
    settngs_screen: settings_screen

    transition: NoTransition()
    MainScreen:
        name: 'main'
        id: main_screen
        manager: screen_manager

    SettingsScreen:
        name: 'settings'
        id: settings_screen
        manager: screen_manager

<MainScreen>:
    BoxLayout:
        orientation:'horizontal'
        FloatLayout:
            MyButton:
                pos_hint: {'x':0.55,'top':0.6}
                on_press: root.toSettings()
                text: 'Go To Settings'

            MyButton:
                pos_hint: {'x':0.25,'top':0.6}
                text: 'Open Data'
                on_release: root.OpenData()


<SettingsScreen>:
    BoxLayout:
        orientation:'horizontal'
        FloatLayout:
            CustRedButton:
                pos_hint:{'x':0, 'y':0}
                on_press: root.toMain()
                text: 'To Main'

            GridLayout:
                cols:2
                pos_hint: {'x':-0.1, 'y':0.6}
                size_hint: 1, 0.2
                Label:
                    text:"Select"

                Spinner:
                    pos_hint: {'center': (.7, .7)}
                    text: root.spinner_values[0]
                    values: root.spinner_values
                    on_text: root.on_spinner_select(text)
                    background_color: 0.5,0.5,0.5,1
...