如何在我的应用程序中将ToolBar与Kivy在Python中集成?

问题描述 投票:0回答:2

我今天来找你,因为我好几天都没能解决问题。

我正在做的事情:

我想在我的应用程序一侧创建一个ToolBar,并使其在我的所有屏幕上都可用。我尝试了几件事,但没有任何结果:(我会给你一些代码,看看我做了什么。

[我在这里删除了代码因为我已经改变了我的下面]

提前感谢您的帮助,我可以获得更多信息。祝你有美好的一天!

新闻:

我只是尝试做我被建议做的事情@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.朋友

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

shindov.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!

python kivy
2个回答
0
投票

这是您想要完成的最小例子。希望您能看到它的内部工作原理并了解如何使其适用于您的应用程序!

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
投票

我注意到你正在创建继承自.kv文件(Toolbar@GridLayout)中GridLayout的工具栏,但是你缺少冒号和缩进,因为它是一个类。它应该看起来像:

<ToolBar@GridLayout>:
    BoxLayout:
        Your Code Here

试试看,让我知道会发生什么。不确定这是完整的问题,但只是我在你的代码中注意到的。

© www.soinside.com 2019 - 2024. All rights reserved.