Kivy - 在 .py 文件中使用一个屏幕的 TextInput 中的文本到另一个屏幕

2023-12-01

我的第一个屏幕上有一个 TextInput,我想在第二个屏幕上的标签中使用收到的文本。我怎样才能做到这一点?由于可能有不同的玩家,我创建了一个玩家类,它为每个玩家存储一个名字和他/她的分数。在第二个屏幕中,我还尝试创建一个可以编辑点(标签文本)的按钮,但是当我单击它时,没有任何反应。 (我也是新来的。)

在下面的代码中,我标记了相关行。

所以概述:

  • 第一个屏幕:使用 textInput 提取用户名 + 使用 Player 类创建玩家实例

  • 第二个屏幕:在标签中使用玩家姓名 + 在标签中使用玩家点数 + 创建 2 个按钮,用于从此“点”标签添加/减去点数

我知道这里有类似的情况,但它对我的 .py 文件没有帮助:如何在 Kivy/Python 中从一个屏幕引用另一个屏幕中的 TextInput?

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.properties import ObjectProperty, NumericProperty


class Player:
    def __init__(self, name):
        self.name = name
        self.points = 0

    def reset_points(self):
        self.points = 0

    def add_point(self, *args):
        self.points += 1

    def subtract_point(self, *args):
        self.points -= 1


class WelcomeWindow(Screen):
    # Introduce names of the 4 players

    def __init__(self, **kwargs):
        super(WelcomeWindow, self).__init__(**kwargs)
        self.name = "welcomewindow"
        self.layout = "layout_welcome_window"

        global_layout = GridLayout(rows=3)
        self.add_widget(global_layout)

        label_player_i = Label(text="Name Player ")
        global_layout.add_widget(label_player_i)

        name_input_player_i = TextInput(id="player ", text="player", multiline=False) # <--- user inputs name here
        global_layout.add_widget(name_input_player_i)

        self.player1 = Player(name_input_player_i.text) # <--- name is assigned to player here

        # Create button to go to next screen
        go_further_button = Button(text="Go to first round")
        go_further_button.bind(on_release=self.go_further)
        global_layout.add_widget(go_further_button)

    def go_further(self, *args):
        self.manager.current = "firstround"
        self.manager.transition.direction = "left"

class FirstRound(Screen):
    #Give explanation of first round + option to add points for every player

    def __init__(self, **kwargs):
        super(FirstRound, self).__init__(**kwargs)
        self.name = "firstround"
        self.layout = "layout_first_round"

        #Create layout
        global_layout = GridLayout(rows=4)
        self.add_widget(global_layout)

        #Create Labels
        label_player_name_i = Label(text=WelcomeWindow().player1.name) # <--- Label should get the name of the player here
        global_layout.add_widget(label_player_name_i)

        label_player_points_i = Label(text=str(WelcomeWindow().player1.points)) # <--- Label should get points of player
        global_layout.add_widget((label_player_points_i))

        #Create Buttons
        button_minus = Button(text="-", font_size=100, id="minus_button")
        button_minus.bind(on_release=WelcomeWindow().player1.subtract_point) # <--- When button pushed: should subtract point
        global_layout.add_widget(button_minus)

        button_plus = Button(text="+", font_size=100, id="plus_button")
        button_plus.bind(on_release=WelcomeWindow().player1.add_point) # <--- When button pushed: should add point
        global_layout.add_widget(button_plus)


WindowManager = ScreenManager()
WindowManager.add_widget(WelcomeWindow())
WindowManager.add_widget(FirstRound())

class KingenApp(App):

    def build(self):
        return WindowManager

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

您的代码有几个问题:

  • The __init__()任何方法Widget当您创建该实例时调用Widget。所以__init__()的方法FirstRound被称为在线WindowManager.add_widget(FirstRound())。此时还无法输入任何文本TextInput of WelcomeWindow,所以你无法获取当时的玩家名字。
  • 的创建Player实例 (self.player1 = Player(name_input_player_i.text))创建Player在用户有机会输入玩家姓名之前的实例。
  • 指某东西的用途WelcomeWindow() in the __init__()的方法FirstRound创建一个新实例WelcomeWindow这与你的 GUI 中的无关。因此从该实例中提取的任何信息都是没有用的。
  • In your FirstRound,玩家点标签从Player当时的类实例Label被建造。改变points的属性Player之后不会有任何影响Label.

第一个问题可以通过将大部分代码移出__init__()的方法FirstRound,并将其放入on_enter()时运行的方法Screen被展示。

第二个问题可以通过移动创建Player实例进入go_further()方法,因为它在离开时执行WelcomeWindow.

第三个问题可以通过替换这些用途来解决WelcomeWindow() with self.manager.get_screen('welcomewindow')访问实际实例WelcomeWindow那是在你的 GUI 中。

这是代码的修改版本,它执行这三件事:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label


class Player:
    def __init__(self, name):
        self.name = name
        self.points = 0

    def reset_points(self):
        self.points = 0

    def add_point(self, *args):
        self.points += 1

    def subtract_point(self, *args):
        self.points -= 1


class WelcomeWindow(Screen):
    # Introduce names of the 4 players

    def __init__(self, **kwargs):
        super(WelcomeWindow, self).__init__(**kwargs)
        self.name = "welcomewindow"
        self.layout = "layout_welcome_window"

        global_layout = GridLayout(rows=3)
        self.add_widget(global_layout)

        label_player_i = Label(text="Name Player ")
        global_layout.add_widget(label_player_i)

        self.name_input_player_i = TextInput(id="player ", text="player", multiline=False) # <--- user inputs name here
        global_layout.add_widget(self.name_input_player_i)

        # Create button to go to next screen
        go_further_button = Button(text="Go to first round")
        go_further_button.bind(on_release=self.go_further)
        global_layout.add_widget(go_further_button)

    def go_further(self, *args):
        self.player1 = Player(self.name_input_player_i.text) # <--- name is assigned to player here
        self.manager.current = "firstround"
        self.manager.transition.direction = "left"


class FirstRound(Screen):
    #Give explanation of first round + option to add points for every player

    def __init__(self, **kwargs):
        super(FirstRound, self).__init__(**kwargs)
        self.name = "firstround"
        self.layout = "layout_first_round"

    def on_enter(self, *args):
        #Create layout
        global_layout = GridLayout(rows=4)
        self.add_widget(global_layout)

        #Create Labels
        welcome_window = self.manager.get_screen('welcomewindow')  # get a reference to the WelcomeWindow instance
        label_player_name_i = Label(text=welcome_window.player1.name) # <--- Label should get the name of the player here
        global_layout.add_widget(label_player_name_i)

        label_player_points_i = Label(text=str(welcome_window.player1.points)) # <--- Label should get points of player
        global_layout.add_widget((label_player_points_i))

        #Create Buttons
        button_minus = Button(text="-", font_size=100, id="minus_button")
        button_minus.bind(on_release=welcome_window.player1.subtract_point) # <--- When button pushed: should subtract point
        global_layout.add_widget(button_minus)

        button_plus = Button(text="+", font_size=100, id="plus_button")
        button_plus.bind(on_release=welcome_window.player1.add_point) # <--- When button pushed: should add point
        global_layout.add_widget(button_plus)


WindowManager = ScreenManager()
WindowManager.add_widget(WelcomeWindow())
WindowManager.add_widget(FirstRound())


class KingenApp(App):

    def build(self):
        return WindowManager


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

第四个问题本身值得一个问题,但可能涉及使用 kivy 语言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kivy - 在 .py 文件中使用一个屏幕的 TextInput 中的文本到另一个屏幕 的相关文章

随机推荐

  • 为什么 x86 寄存器如此命名?

    例如 累加器命名为EAX并且 当指令指针被调用时IP 我还知道有一些字节称为CL and DH 我知道所有的名字一定有一个约定 但是它是什么 我发现的东西 EAX Accumulator Register EBX Base Register
  • 在 Angular 2 Typescript 中使用 flow.js

    我想将 flowjs 或 ng flow 集成到我的 Angular 2 应用程序中 我已经安装了flowjs使用打字 npm install save dev types flowjs from https www github com
  • MS Access 插入大型记录集速度较慢 (VBA)

    我有一段代码创建一个新表 然后尝试将记录集值复制到该表中 唯一的问题是它非常慢并且访问在执行下面的插入部分时显示加载符号 目前 插入 500 条记录时会出现此问题 但当我获得最终数据集时 我需要插入大约 10 000 到 20 000 条记
  • Ruby on Rails - 制作新应用程序时出错(rb:55:在“require”中)

    我一直在关注 Mike Hartl 的精彩作品Ruby on Rails 教程 我必须提前对 gem 文件和 ruby 的版本做出一些决定 我决定 在让 Heroku 工作出现一些问题之后 我会直接模仿所描述的教程和 ruby 版本 让我去
  • 将 libcutils 链接到本机可执行文件[重复]

    这个问题在这里已经有答案了 我希望我的可执行文件能够调用 libcuils 支持的函数 就像property get 在 Android mk 中我有 LOCAL LDLIBS lcutils ndk build返回 未定义的引用prope
  • Android 上的时间解析问题

    尝试解析时间字符串时出现解析异常02 22 p m 我有以下转换函数 public static long convertdatetotimestamp String datestring String newdateformat Stri
  • 在同一台计算机上连接两个本地 uwp 应用程序

    我试图让两个 uwp 应用程序 Windows 10 应用程序 在同一台计算机上运行时进行通信 应用程序已经可以进行通信当运行于不同的主机 因此代码正在运行 两个应用程序都可以在其清单文件中声明的本地和公共网络中进行通信 什么时候在同一主机
  • ReactCrop 预览未渲染

    我想为我的 Web 应用程序实现图像裁剪功能 并发现 React image crop 是实现该功能的最佳 npm 包 但是 由于某种原因 ReactCrop 组件提供的预览没有在我的视口上渲染 这是我一直使用的代码 import useS
  • 使用 JQuery 导航无根 dom

    给定这个 html 字符串 var string div div p p 我用它创建一个 jQuery 对象 var dom string 是否有机会使用选择器指向其标签之一 当然 无需将其全部嵌入到新创建的项目中 dom find p 当
  • CSS:IE7 的表格和表格单元格替换

    http jsfiddle net vByVD 9 这就是我所拥有的 在大多数浏览器中 菜单看起来都是水平的 但在 IE7 及更低版本中 当然是另一回事了 它是垂直的 我发现这是因为他们不支持表格 表格单元格 我尝试了一些技巧 正如您在 C
  • OpenSSL 1.1.0 中的 EVP_get_cipherbyname 和“未定义的结构/联合 evp_cipher_st”

    我正在尝试将 openssl 与 Visual Studio C 项目一起使用 我使用 Visual Studio nmake 命令编译 openssl 然后使用以下命令将所有内容安装到预定义文件夹 C openssl nmake inst
  • 无法在 Node.js 上使用 sqlite3 将行放入数组中

    我在 Node js 中有一段代码 它从 SQLite 数据库中选择所有内容并打印每一行 它可以工作 代码如下 var sqlite3 require sqlite3 verbose var db new sqlite3 Database
  • Braintree 中出现“请求已中止:无法创建 SSL/TLS 安全通道”错误

    在我的本地 PC Braintree 中 执行时显示错误 请求已中止 无法创建 SSL TLS 安全通道 var clientToken gateway ClientToken generate 我正在使用 Braintree 2 33 0
  • Ruby 中变量前的感叹号

    通过 ruby Monk 他们偶尔会从左侧字段中抛出一段具有不熟悉语法的代码 def compute xyz return nil unless xyz xyz map a b b nil a b a end 谁能解释一下这三种用途吗 1
  • Sequelize 不创建模型关联列

    当 Sequelize 创建关联字段时 我有点困惑 我已经使用sequelize cli 创建了我的迁移 这生成了迁移和模型文件 然后在模型文件中我填充了我的关联 然后跑了npx sequelize cli db migrate 这将创建表
  • m2e eclipse插件如何与eclipse交互?

    我是一个 Eclipse 强者 由于历史上 Maven Eclipse 集成不佳而忽略了 Maven m2e 似乎正在成熟 我正在认真试驾它 我想了解 m2e 在 eclipse 中是如何工作的 这样我就可以更好地让两者顺利地协同工作 并了
  • 根据以编程方式创建时间表更改运输车队

    在跟进我之前的问题时上一个问题 当以编程方式创建时间表时 我在主程序启动时运行该函数 参见图 1 我想基于此更改 Transporterfleet image2 时间表 但是 当我通过 initschedule 函数执行此操作时 会给出下一
  • Scikit Learn 的 Keras 包装器 - AUC 评分器不起作用

    我正在尝试使用Keras Scikit 学习包装器以便更容易地随机搜索参数 我在这里写了一个示例代码 其中 我生成一个人工数据集 我在用moons from scikit learn from sklearn datasets import
  • mysql触发器怎么写

    有两张桌子表A 如果用户使用此查询 插入 A 值 abc 1 50 那么触发器应该检查 表B 中的student name 如果student name已经存在于 表B 中 那么 更新表 B 中的 all marks 字段 例如 all m
  • Kivy - 在 .py 文件中使用一个屏幕的 TextInput 中的文本到另一个屏幕

    我的第一个屏幕上有一个 TextInput 我想在第二个屏幕上的标签中使用收到的文本 我怎样才能做到这一点 由于可能有不同的玩家 我创建了一个玩家类 它为每个玩家存储一个名字和他 她的分数 在第二个屏幕中 我还尝试创建一个可以编辑点 标签文