首页 > 解决方案 > 如何将我的应用程序上的工具栏与 Python 中的 Kivy 集成?

问题描述

我今天来找你是因为我已经好几天没能解决我的问题了。

我正在尝试做的事情:

我想在我的应用程序一侧创建一个 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 中没有任何改变)。

窗口.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

窗口.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:

工具栏.kv

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

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

先感谢您。梅利托!

标签: pythonkivy

解决方案


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

<ToolBar@GridLayout>:
    BoxLayout:
        Your Code Here

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


推荐阅读