Не могу получить доступ к экземплярам из другого экземпляра класса - PullRequest
0 голосов
/ 31 января 2020

Используя Kivy Factory, я создал свой класс MainWindow внутри класса ApplyPage, я пытаюсь получить доступ к переменной self.placementtext из моего класса MainWindow, который инициализирован как None, когда я пытаюсь получить к нему доступ из ApplyPage возвращается как None. Я знаю, что он возвращается как None, потому что это то, что я инициализировал, но я хотел бы знать любой возможный способ доступа к исходному значению, которому оно назначено в функции def printtext(self). Любые идеи о том, как это сделать, будут признательны, вот мой код.

class MainWindow(Screen):
    search_string1 = ObjectProperty(None)
    search_string2 = ObjectProperty(None)



    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
        self.placementtext = None
        self.searchbutton = Button( pos_hint = {"center_x": 0.5, "center_y": 0.5}, size_hint= (0.2, 0.1), font_name = 'fonts/Qanelas-Heavy.otf', text= "Search", background_color = (0.082, 0.549, 0.984, 1.0),                            background_normal= '', font_size = 20)
        self.searchbutton.bind(on_release=self.searchpressed)
        self.add_widget(self.searchbutton)


    def searchpressed(self, instance):
        app = App.get_running_app()
        placements = database.child("placements").get()
        placementslist = placements.val()
        placementslist.items()
        for key, value in placementslist.items():
            self.key = key
            key_list = []
            key_list.append(key)
            for key in key_list:
                name = database.child("placements").child(str(key)).child("placement name").get()
                description = database.child("placements").child(str(key)).child("placement description").get()
                location = database.child("placements").child(str(key)).child("placement location").get()
                date = database.child("placements").child(str(key)).child("placement date").get()
                price = database.child("placements").child(str(key)).child("placement price").get()
                thelocalId = database.child("placements").child(str(key)).child("localId").get()
                self.thelocalId = thelocalId.val()
                data = "\n" + "\n" + str(name.val()) + '\n' + str(description.val()) + "\n" + str(
                    location.val()) + '\n' + str(date.val()) + '\n' + '\n' + str(price.val())
                project_list_screen = self.manager.get_screen('project_list_screen')
                project_list_screen.project_list.adapter.data.extend(["\n" + "\n" + str(name.val()) + '\n' + str(
                    description.val()) + "\n" + str(location.val()) + '\n' + str(date.val()) + '\n' + '\n' + str(
                    price.val())])
                project_list_screen.project_list._trigger_reset_populate()



                app.root.current = "project_list_screen"


    def printtext(self):
       self.placementtext = self.project_list_screen.project_list.adapter.selection[0]

Factory.register('MainWindow', cls=MainWindow)


class ApplyPage(Screen):
    mainwindow = ObjectProperty(None)

    def __init__(self, **kwargs):
        self.mainwindow = kwargs.pop('mainwindow', None)
        super(ApplyPage, self).__init__(**kwargs)
        self.yes = Button(text="Yes", font_size = 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.1,"y":0.05}, size_hint= [0.2, 0.1])
        self.add_widget(self.yes)
        self.no = Button(text="No", font_size= 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.7, "y":0.05}, size_hint= [0.2, 0.1])
        self.add_widget(self.no)

    def on_enter(self, *args):
        print(self.mainwindow.placementtext)

Вот как я создал экземпляр класса в моем файле kivy

 ApplyPage:
        id: applyingpage
        name: "applyingpage"
        mainwindow: Factory.MainWindow()

Любая помощь о том, как доступ к self.placementtext оригинальное значение будет оценено

1 Ответ

0 голосов
/ 31 января 2020

Ленивый метод дает классу приложения свойство, в которое вы вводите информацию на главном экране, а затем считываете на втором экране.

class MyApp(App):
    placementtext = None

, поэтому всякий раз, когда вы меняете текст размещения (так как это свойство не может использовать on_placementtext bind) просто добавьте

app.placementtext = self.placementtext

, и теперь вы можете получить к нему доступ со своего второго экрана, вызвав app.placementtext. Например:

def on_enter(self, *args):
    print(app.placementtext)

Другой метод заключается в использовании кэша. Сначала вы регистрируете свой кэш

Cache.register('windows')

, затем добавляете экран главного окна, когда создаете его экземпляр

Cache.add('windows','mainwindow',#putyourmainwindowobjecthere)

, теперь вы можете вызывать его из любого места! Например:

def on_enter(self,*args):
    print(Cache.get('windows','mainwindow').placementtext)

Убедитесь, что вы сначала импортировали модуль из kivy!

Надеюсь, это поможет!

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