Как сделать список во втором экране с киви - PullRequest
0 голосов
/ 02 мая 2020

Я пытался показать список на втором экране после нажатия кнопки на главном экране. но список не будет отображаться, но у меня нет ошибок. что-то не так с моим кодом kivy?

это мой код

def rumus_power_np(radius, air_density, efficiency_factor, kecepatan_angin):
    return 3.14/2 * pow(radius, 2) * np.power(kecepatan_angin, 3) * air_density * efficiency_factor

class MainWindow(Screen):
    def btn(self):
        print("name: ",self.radius.text)
        predicted_power = rumus_power_np(int(self.radius.text), float(self.air_density.text), float(self.efficiency_factor.text)/100, predictions)
        data = {'time':  series.date[-109:].dt.time,'power':  predicted_power}
        df = pd.DataFrame (data, columns = ['time','power'])
        plt.plot(df.time,df.power, color='orange', label = 'predicted power')
        plt.xlabel("time")
        plt.ylabel("power (watt)")
        plt.legend()
        print(predicted_power)
        self.manager.get_screen('second').ids.rv.data = [{'time': df.time}, {'power': df.power}]

class SecondWindow(Screen):
    def btndu(self):
        self.ids.destination.add_widget(FigureCanvasKivyAgg(plt.gcf()))

class WindowManager(ScreenManager):
    pass

kv = Builder.load_file("my.kv")

class MyMainApp(App):
    def build(self):
        return kv

if __name__=="__main__":
    MyMainApp().run()

данные прогнозируемой мощности существуют из кода над ним и должны иметь 109 строк из этих данных.

а это мой код kv

    #:kivy 1.9.1
WindowManager:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "main"
    radius: radius
    air_density: air_density
    efficiency_factor: efficiency_factor

    FloatLayout:

    Label:
        text:"Radius: "
        size_hint: 0.5,0.12
        pos_hint: {"x":0, "top":0.8}
        font_size: (root.width**2 + root.height**2) / 14**4

    TextInput:
        id: radius
        multinline:False
        pos_hint: {"x":0.5, "top":0.78}
        size_hint: 0.3, 0.06
        font_size: (root.width**2 + root.height**2) / 14**4

    Label:
        text:"Meter"
        size_hint: 0.5,0.12
        pos_hint: {"x":0.62, "top":0.8}
        font_size: (root.width**2 + root.height**2) / 16**4

    Label:
        text:"Air\nDensity: "
        size_hint: 0.5,0.12
        pos_hint: {"x":0, "top":0.8-0.13}
        font_size: (root.width**2 + root.height**2) / 14**4

    TextInput:
        id: air_density
        multinline:False
        pos_hint: {"x":0.5, "top":0.78-0.13}
        size_hint: 0.3, 0.06
        font_size: (root.width**2 + root.height**2) / 14**4

    Label:
        text:"kg/m³"
        size_hint: 0.5,0.12
        pos_hint: {"x":0.62, "top":0.8-0.13}
        font_size: (root.width**2 + root.height**2) / 16**4

    Label:
        text:"efficiency\nfactor: "
        size_hint: 0.5,0.12
        pos_hint: {"x":0, "top":0.8-0.13*2}
        font_size: (root.width**2 + root.height**2) / 14**4

    TextInput:
        id: efficiency_factor
        multinline:False
        pos_hint: {"x":0.5, "top":0.78-0.13*2}
        size_hint: 0.3, 0.06
        font_size: (root.width**2 + root.height**2) / 14**4

    Label:
        text:"%"
        size_hint: 0.5,0.12
        pos_hint: {"x":0.62, "top":0.8-0.13*2}
        font_size: (root.width**2 + root.height**2) / 16**4

    Button:
        text:"Submit"
        pos_hint:{"x":0.3,"y":0.25}
        size_hint: 0.4, 0.1
        font_size: (root.width**2 + root.height**2) / 14**4
        on_release:
            root.btn()
            app.root.current = "second"
            root.manager.transition.direction = "left"

<SecondWindow>:
    name: "second"

    GridLayout:
        cols:1

        BoxLayout:
            id: destination

        RecycleView:
            id: rv
            viewclass: 'Label'
            RecycleBoxLayout:
                default_size: None, dp(56)
                default_size_hint: 1, None
                size_hint_y: None
                height: self.minimum_height
                orientation: 'vertical'

        Button:
            text: "show plot"
            on_release:
                root.btndu()

пожалуйста, помогите мне, если что-то не так? Потому что это мой первый раз

1 Ответ

0 голосов
/ 03 мая 2020

Ключи в вашем data должны быть атрибутами вашего viewclass. Если вы используете Label в качестве viewclass, то ключи в ваших данных, вероятно, будут text, поскольку это атрибут Label, который может отображать строку. Вы можете создать свой собственный viewclass для удовлетворения ваших конкретных потребностей c. Я позволил себе создать viewclass, который я называю DataDisplay, чтобы продемонстрировать, что я имею в виду:

class DataDisplay(BoxLayout):
    time = NumericProperty(0.0)
    power = NumericProperty(0.0)

И используя kv для планирования макета DataDisplay:

<DataDisplay>:
    orientation: 'horizontal'
    Label:
        text: 'time: ' + str(root.time)
    Label:
        text: 'power: ' + str(root.power)

При таком расположении каждый элемент данных должен содержать два ключа: time и power. Используя это, следующий код отобразит два набора time и power в RecycleView:

class MainWindow(Screen):
    def btn(self):
        self.manager.get_screen('second').ids.rv.data = [{'time': 2.3, 'power': 4.5}, {'time': 0.1, 'power':9.356}]
...