在kivy按钮上使用随机选择的方法

所以,我正在用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

解决方案:

一种方法是在窗口中添加一个 idLabel:

<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_screenAsianWindow 在这一点上)。)


一个更简单的方法是只使用 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"

给TA打赏
共{{data.count}}人
人已打赏
未分类

连接两个表,一个是父子层次结构,输出的行数比表1多。

2022-9-8 14:07:20

未分类

安卓工作室3.6无法点击文字改变其ID和文字。

2022-9-8 14:07:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索