2017-02-23 35 views
0

Как я могу получить доступ к значению условий, которое находится внутри моего CurrentWeather виджета из Python в моем AddLocationForm? Я хочу изменить значение условий из моего AddLocationForm вместо того, чтобы делать это в CurrentWeather. Это мой код, до сих пор:Как получить доступ к виджету, который находится в другом классе в kivy

Python:

from kivy.network.urlrequest import UrlRequest 
import json 
from kivy.core.window import Window 
from kivy.uix.textinput import TextInput 
from kivy.uix.listview import ListItemButton 
from kivy.factory import Factory 

Window.clearcolor = (0.45, 0.3, 1, 0.5) 

class AddLocationForm(BoxLayout): 
    search_input = ObjectProperty() 
    search_results = ObjectProperty() 
    currentWeather = ObjectProperty() 

    def search_location(self): 
     search_template = "http://api.openweathermap.org/data/2.5/weather?q={}&appid=f8020ca79e2de4c1dd5a125c3f22fa18" 
     search_url = search_template.format(self.search_input.text) 
     request = UrlRequest(search_url, self.found_location) 

    def found_location(self, request, data): 
     data = json.loads(data.decode()) if not isinstance(data, dict) else data 
     weather = "%s" %(data["weather"][0]["description"]) 
     root.WeatherRoot.CurrentWeather.conditions = weather #Problem is here 

class LocationButton(ListItemButton): 
    pass 

class WeatherApp(App): 
    def build(self): 
     global root 
     root = self.root 

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

Kv:

#: import ListItemButton kivy.uix.listview.ListItemButton 
#: import ListAdapter kivy.adapters.listadapter.ListAdapter 
#: import main main 

WeatherRoot: 

<WeatherRoot>: 
    AddLocationForm 

<AddLocationForm>: 
    orientation: "vertical" 
    search_input: search_box 
    search_results: search_results_list 
    BoxLayout: 
     height: "40dp" 
     size_hint_y: None 
     TextInput: 
      id: search_box 
      size_hint_x: 50 
      multiline: False 
     Button: 
      text: "Search" 
      size_hint_x: 25 
      on_press: root.search_location() 
      background_color: (1, 0.5, 0.656, 1) 

<[email protected]>: 
    id: current_weather 
    currentWeather: current_weather 
    location: "" 
    conditions: "" 
    temp: None 
    temp_min: None 
    temp_max: None 

    orientation: "vertical" 
    Label: 
     text: root.location 
     pos_hint: {'x': 0.435, "y": 1} 
     font_size: '40dp'  
     size_hint_y: None 
     size_hint_x: None 
    BoxLayout: 
     orientation: "horizontal" 

     Label: 
      id: curCon 
      text: root.conditions 
+0

Не могли бы вы сделать минимальный пример этого? Смотрите это http://stackoverflow.com/help/mcve – EL3PHANTEN

+0

Это лучше? Я учился в школе, поэтому мне так долго приходилось отвечать. –

ответ

1

Дерево:

WeatherRoot:   # root widget 

<WeatherRoot>:   # root widget class 
    AddLocationForm # root widget's child 

Поэтому лет Сначала вы получите свой App экземпляр с app. Экземпляр после метод сборки имеет rootproperty, который является всего лишь экземпляром хранимого корневого виджета. Вот почему global root бесполезен в более крупном коде из-за, например, столкновений, путаницы с каким-либо другим именем и т. д., в то время как доступный проще.

Чтобы получить доступ к классу динамически созданный в кв из питона или кв вам нужно использовать дерево виджет (чтобы получить к уже существующему экземпляру):

app.root.children[0]... 

или Factory к создать экземпляр из виджет, например если вы хотите создать новый после того, как будет оценено какое-либо условие.

Но!

Вы имеете непонятым, как динамические классы работают в кВ - <[email protected]>: просто декларация, не экземпляр. Как шаблон. Для того, чтобы на самом деле работать с ним вы должны поместить его где-нибудь, например:

питон:

cw = Factory.CurrentWeather() 
somewhere.add_widget(cw) 

киловольт:

WeatherRoot: 
    CurrentWeather: # here 

<WeatherRoot>: 
    AddLocationForm: 
     CurrentWeather: # or here 

Если вы хотите добавить его в Python, вы можете легко использовать некоторую переменную для хранения экземпляра и по-прежнему иметь доступ к ней позже через дерево виджетов. С другой стороны, при добавлении в кв, не имеют доступа к __init__ и вы не можете сохранить экземпляр в переменную без sillyish хаков, как это:

#:import Factory kivy.factory.Factory 

<[email protected]>: 

BoxLayout: 
    Button: 
     on_release: self.new = Factory.Blob(); self.parent.add_widget(self.new) 

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

 Смежные вопросы

  • Нет связанных вопросов^_^