использование random.choice с кнопками kivy - PullRequest
0 голосов
/ 24 апреля 2020

Итак, я создаю программу с kivy, которая зависит от возможности случайного выбора местоположения из уже созданного словаря с помощью кнопок. Я хочу, чтобы выбор отображался в окне, которое кнопка занимает у вас, а не в командной строке. Есть способ сделать это? Я приложил фрагмент кода .py и мой код KIVY. Я хочу, чтобы вывод отображался в окне (изображение также прикреплено), где написано "Go to:"

.py код:

import kivy
import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
FoodPlaces={'Asian': ['joy yee','strings','ramen san','chi cafe']}
class MainWindow(Screen):
    pass
class FoodWindow(Screen):
    def asianBtn(self):
        print(random.choice(FoodPlaces['Asian']))
class AsianWindow(Screen):
    pass
class WindowManager(ScreenManager):
    pass

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


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

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

код kivy:

WindowManager:
    MainWindow:
    FoodWindow:
    AsianWindow:
<MainWindow>:
    name:"main"
    GridLayout:
        cols:1
        Label:
            text:"Pick a Category"
        Button:
            text:"Food"
            on_release:
                app.root.current="food"
                root.manager.transition.direction="left"
<FoodWindow>:
    name: "food"
    GridLayout:
        cols:1
        Label:
            text:"Pick a Food Type"
        Button:
            text: "Asian"
            on_release:
                app.root.current="asian"
                root.manager.transition.direction="left"
                root.asianBtn()
        Button:
            text: "Go Back"
            on_release:
                app.root.current="main"
                root.manager.transition.direction="right"
<AsianWindow>
    name:"asian"
    GridLayout:
        cols:1
        Label:
            text: "Go to:"
        Button:
            text: "Go Back"
            on_release:
                app.root.current="food"
                root.manager.transition.direction="right"

enter image description here

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Итак, вы используете print, который не поможет вам отображаться в пользовательском интерфейсе. Я не уверен на 100%, как / где вы хотите отобразить, но я бы посоветовал вам добавить метку там, где вы хотите отобразить вывод. Вы хотели бы, чтобы у этой метки было свойство id, чтобы вы могли динамически изменять ее текстовое значение на любое значение, выбранное случайной функцией из dict.

Этикетка будет выглядеть примерно так в kv:

Label:
    id: output

И чтобы установить ее значение, вам понадобится такая строка в файле py:

self.ids.output.text = "name of restaurant"

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

0 голосов
/ 24 апреля 2020

Один из способов сделать это - добавить id к Label:

<AsianWindow>
    name:"asian"
    GridLayout:
        cols:1
        Label:
            id: goto   # Use this id to access the Label
            text: "Go to:"
        Button:
            text: "Go Back"
            on_release:
                app.root.current="food"
                root.manager.transition.direction="right"

Чтобы упростить задачу, поместите метод asianBtn() в класс AsianWindow:

class AsianWindow(Screen):
    def asianBtn(self):
        self.ids.goto.text = random.choice(FoodPlaces['Asian'])

И измените его вызов в kv на:

<FoodWindow>:
    name: "food"
    GridLayout:
        cols:1
        Label:
            text:"Pick a Food Type"
        Button:
            text: "Asian"
            on_release:
                app.root.current="asian"
                root.manager.transition.direction="left"
                app.root.current_screen.asianBtn()
        Button:
            text: "Go Back"
            on_release:
                app.root.current="main"
                root.manager.transition.direction="right"

С помощью метода asianBtn() в классе AsianWindow путь к goto Label проще, и путь к самому методу asianBtn() проще (поскольку current_screen - это AsianWindow в этой точке).


Еще более простой способ - просто использовать on_enter() метод AsianWindow, так что случайный выбор отображается всякий раз, когда отображается AsianWindow. для этого просто замените метод asianBtn() на метод on_enter():

class AsianWindow(Screen):
    def on_enter(self, *args):
        self.ids.goto.text = random.choice(FoodPlaces['Asian'])

И теперь вам даже не нужно вызывать asianBtn() из Button:

<FoodWindow>:
    name: "food"
    GridLayout:
        cols:1
        Label:
            text:"Pick a Food Type"
        Button:
            text: "Asian"
            on_release:
                app.root.current="asian"
                root.manager.transition.direction="left"
        Button:
            text: "Go Back"
            on_release:
                app.root.current="main"
                root.manager.transition.direction="right"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...