在Python/Kivy中如何避免数据库的全局对象

2024-07-08 10:48:03 发布

您现在位置:Python中文网/ 问答频道 /正文

致相关人士

我有一个Python类,它包含一个数据库,并具有我所需要的所有功能-全部从命令提示符检查。现在,我正在尝试围绕它构建一个Kivy shell,以使它更加用户友好和视觉愉悦。你知道吗

我通过将数据库类的一个实例定义为全局对象来进行管理,因此尽管我已经完成了任务,但我一点也不高兴。我知道,人们应该避免全局变量而不是瘟疫。你知道吗

有人能给我一个解决办法吗?在哪里定义数据库的第一个实例,以及如何在小部件之间传递它?你知道吗

我在下面展示了我的程序的一个显著缩减的框架,以供讨论,这将有希望得到发展。你知道吗

你知道吗主.py地址:

from kivy.app   import App

from rootwidget import *
from mainmenu   import *
from editentry  import *

from database   import *  #  <----= import the database class I want to work on

from kivy.lang  import Builder
Builder.load_file("rootwidget.kv")
Builder.load_file("mainmenu.kv")
Builder.load_file("editentry.kv")

class DataBaseApp(App):
  def build(self):  
    return RootWidget()

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

这里所有的东西都是标准的Python/Kivy编码,除了导入我的数据库的import database。数据库也被剥离了:

你知道吗数据库.py地址:

class DataBase:
  entries = []

我有三个小部件,rootwidgetScreenManager)和两个子部件(类型为Screen)、mainmenueditentry。你知道吗

它们的定义如下:

你知道吗rootwidget.kv电压地址:

#: kivy 1.9.0

<RootWidget>:
  name: "RootWidget_ScreenManager"

  MainMenu:
  EditEntry:  

以及根控件.py地址:

from kivy.uix.screenmanager import ScreenManager

class RootWidget(ScreenManager):
  pass

你知道吗主菜单.kv地址:

#: kivy 1.9.0

<MainMenu>:
  name: "MainMenu_Screen"

  BoxLayout:
    orientation: "vertical"

    Label:
      text: "Main Menu"

    Button:
      text:  "Go to I/O"
      on_release:
        root.manager.transition.direction = "left"
        root.manager.current = "EditEntry_Screen"

你知道吗主菜单.py地址:

from kivy.uix.screenmanager import Screen

class MainMenu(Screen):
  pass

你知道吗editentry.kv电压地址:

#: kivy 1.9.0

<EditEntry>:
  name: "EditEntry_Screen"

  BoxLayout:
    orientation: "vertical"

    Label:
      text: "Edit Entry"

    Button:
      text:  "Go back to main menu"
      on_release:
        root.manager.transition.direction = "right"
        root.manager.current = "MainMenu_Screen"

以及编辑条目.py地址:

from kivy.uix.screenmanager import Screen

class EditEntry(Screen):
  pass

因此,我的问题是:在哪里实例化DataBase类?我做了几次尝试,一次是在App级别创建第一个实例,然后将它作为参数传递给RootWidget的构造函数。这是有效的,但我无法将它从RootWidget传递给它的子MainMenuEditEntry。在RootWidget级别定义它并没有多大帮助,因为我仍然无法将它传递给它的子级。如果我在子级定义它,我就不能从一个子级传递到另一个子级,比如从MainMenuEditEntry。你知道吗

任何建议/帮助都将不胜感激

干杯


Tags: 实例frompyimport数据库定义地址screen

热门问题