Как я могу интегрировать панель инструментов в моем приложении с Kivy в Python? - PullRequest
0 голосов
/ 13 февраля 2019

Я пришел к вам сегодня, потому что не смог решить свою проблему в течение нескольких дней.

Что я пытаюсь сделать:

Iхочу создать панель инструментов на стороне моего приложения и сделать ее доступной на всех моих экранах.Я попробовал несколько вещей, но ничего не вышло :( Я оставлю вам часть своего кода, чтобы посмотреть, что я сделал.

[Я удалил код здесь, потому что я изменил свой код ниже]

Заранее спасибо за вашу помощь, и я доступен для получения дополнительной информации. Хорошего дня!

НОВОСТИ:

Я просто пытался сделать то, что мне посоветовали сделать @Erikно у меня возникает ошибка при запуске моей программы.

Ошибка

Traceback (most recent call last):
   File "/Users/maelito/Desktop/tradingApp/app.py", line 1, in <module>
     from gui import window as w
   File "/Users/maelito/Desktop/tradingApp/gui/__init__.py", line 4, in <module>
     app.run()
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/app.py", line 799, in run
     self.load_kv(filename=self.kv_file)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/app.py", line 596, in load_kv
     root = Builder.load_file(rfilename)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/builder.py", line 301, in load_file
     return self.load_string(data, **kwargs)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/builder.py", line 368, in load_string
     parser = Parser(content=string, filename=fn)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/parser.py", line 392, in __init__
     self.parse(content)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/parser.py", line 498, in parse
     self.execute_directives()
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/parser.py", line 452, in execute_directives
     kivy.lang.builder.Builder.load_file(ref)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/builder.py", line 301, in load_file
     return self.load_string(data, **kwargs)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/builder.py", line 368, in load_string
     parser = Parser(content=string, filename=fn)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/parser.py", line 392, in __init__
     self.parse(content)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/parser.py", line 501, in parse
     objects, remaining_lines = self.parse_level(0, lines)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/parser.py", line 605, in parse_level
     level + 1, lines[i:], spaces)
   File "/Users/maelito/env/lib/python3.7/site-packages/kivy/lang/parser.py", line 664, in parse_level
     if current_property[:3] == 'on_':
 TypeError: 'NoneType' object is not subscriptable

Поэтому я тоже делюсь с вами новым кодом (у меня ничего не изменилось на screen1.kv и screen2.kv).

Window.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.screenmanager import Screen
from kivy.factory import Factory
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager


class ToolBar(GridLayout):
    pass


class Screen1(Screen):
    pass


class Screen2(Screen):
    pass


class WindowInterface(GridLayout):
    manager = ScreenManager()

    toolbar = ToolBar()
screen_1 = Screen1()
screen_2 = Screen2()

screen_1.add_widget(toolbar)
screen_2.add_widget(toolbar)

manager.add_widget(screen_1)
manager.add_widget(screen_2)

    def construct_toolbar(self):
        self.toolbar.add_buttons(self)


class Window(App):
    pass

window.kv

#:include gui/kv_files/screen_1.kv
#:include gui/kv_files/screen_2.kv
#:include gui/kv_files/toolbar.kv

#:import NoTransition kivy.uix.screenmanager.NoTransition

<WindowInterface>
    name: 'main_screen'
    BoxLayout:
            orientation: "vertical"

            Label:
                text: "main screen"
            Button:
                text: "to screen 1"
                on_press: app.root.current = "screen_1"
            Button:
                text: "to screen 2"
                on_press: app.root.current = "screen_2"

    ScreenManager:
        Screen1:

        Screen2:

        ToolBar:

toolbar.kv

<Toolbar@GridLayout>
BoxLayout:
    orientation: "vertical"
    size: 10,100

    canvas:
        Color:
            rgba: (1,1,1,1)
        Rectangle:
            size: self.size
            pos: self.pos

Заранее спасибо. Maëlito!

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вот минимальный пример того, чего вы хотите достичь.Надеюсь, вы сможете увидеть его внутреннюю работу и понять, как заставить его работать для вашего приложения!

main.py

from kivy.app import App
from kivy.uix.screenmanager import Screen

class ToolBarGrid():
    pass

class Screen1(Screen):
    pass

class Screen2(Screen):
    pass

class MainApp(App):
    def load_screen(self, new_screen_name):
        self.root.ids.screen_manager_id.current = new_screen_name

MainApp().run()

main.kv

GridLayout:
    cols: 1
    ToolBarGrid:
    ScreenManager:
        id: screen_manager_id
        Screen1:
            id: "screen1"
            name: "screen1"
        Screen2:
            id: "screen2"
            name: "screen2"

<ToolBarGrid@GridLayout>:
    rows: 1
    Label: 
        text: "one"
    Label: 
        text: "two"
    Label: 
        text: "three"
    Label: 
        text: "four"

<Screen1>:
    GridLayout:
        cols: 1
        Label:
            text: "Screen 1"
        Button: 
            text: "Load screen 2"
            on_release: app.load_screen("screen2")

<Screen2>:
    GridLayout:
        cols: 1
        Label:
            text: "Screen 2"
        Button: 
            text: "Load screen 1"
            on_release: app.load_screen("screen1")
0 голосов
/ 13 февраля 2019

Я заметил, что вы создаете панель инструментов, унаследованную от GridLayout, в вашем файле .kv (Toolbar@GridLayout), но вам не хватает двоеточия и отступа, поскольку это класс.Это должно выглядеть так:

<ToolBar@GridLayout>:
    BoxLayout:
        Your Code Here

Попробуйте, и дайте мне знать, что происходит.Не уверен, что это полная проблема, но я заметил кое-что в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...