`with canvas:` (Python `with Something() as x:`) 如何在 Kivy 中隐式工作?

2023-11-22

我刚刚意识到在 Kivy 中使用添加顶点指令的方式有一些神秘的东西(至少对我来说)withPython 语句。例如,方式with使用是这样的:

... some code
class MyWidget(Widget)
    ... some code 

    def some_method (self):
        with self.canvas:
           Rectangle(pos=self.pos, size=self.size)

一开始我以为这只是with我偶尔使用过的Python语句。但我突然意识到事实并非如此。通常它看起来更像这样(示例取自here):

with open('output.txt', 'w') as f:
   f.write('Hi there!')

通常有一个as在实例之后以及类似对象的别名。在 Kivy 示例中,我们没有定义别名,但这仍然可以。但令我困惑的部分是指令 Rectangle 仍然与 self.canvas 相关联。阅读完有关with声明中,我非常确信 Kivy 代码应该这样写:

class MyWidget(Widget)
    ... some code 

    def some_method (self):
        with self.canvas as c:
           c.add (Rectangle(pos=self.pos, size=self.size))

我假设在内部该方法add是被呼叫的人。假设我们可以简单地添加矩形self.add (Rectangle(pos=self.pos, size=self.size))

我是否遗漏了一些关于withPython 语句?或者这是 Kivy 以某种方式实现的?


我不认识 Kivy,但我想我可以猜出这个具体的构造是如何工作的。

不是保留与您交互的对象(画布?)的句柄,而是with语句被编程为将其存储在某个对您隐藏的全局变量中。然后,你在里面使用的语句with使用该全局变量来检索对象。在块的末尾,作为清理的一部分,全局变量被清除。

结果是一个权衡:代码不太明确(这通常是 Python 中所需的功能)。然而,代码更短,这可能会更容易理解(假设读者知道 Kivy 是如何工作的)。这实际上是在 Python 中制作嵌入式 DSL 的技术之一。

其中涉及一些技术细节。例如,如果您希望能够嵌套此类结构(将一个with在另一个内部),您可能希望使用一个保存此类对象堆栈的全局变量,而不是一个简单的全局变量。另外,如果您需要处理线程,您可以使用线程局部变量而不是全局变量。但通用机制仍然是一样的——Kivy 使用某种保存在你直接控制之外的地方的状态。

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

`with canvas:` (Python `with Something() as x:`) 如何在 Kivy 中隐式工作? 的相关文章

  • Python setuptools:如何在 setup.py 中添加私有存储库 (gitlab)?

    我上传了 2 个包 它们位于我的 gitlab 存储库中 如果我想使用 pip 将它们安装在我的系统中 这很容易 因为 gitlab 可以帮助您 https docs gitlab com ee user packages pypi rep
  • 切片稀疏(scipy)矩阵

    我将不胜感激任何帮助 以理解从 scipy sparse 包中切片 lil matrix A 时的以下行为 实际上 我想根据行和列的任意索引列表提取子矩阵 当我使用这两行代码时 x1 A list 1 x2 x1 list 2 一切都很好
  • 即使页面未完全加载,我们也可以使用 Selenium 获取页面源吗(TimeoutException: Message: timeout)?

    即使遇到 TimeoutException Message timeout 也能获取页面源码吗 当我调用 driver page source 时 有时无法加载整页 但我只需要它的部分信息 尚未确定 所以我只想在任何情况下保存页面 是否可以
  • 从Python中的字符串中提取货币金额

    我正在制作一个程序 从字符串中获取货币并将其转换为其他货币 例如 如果字符串是 the car cost me 13 250 我需要得到 and 13250 我已经有了这个正则表达式 1 确实如此 但是该字符串很有可能有多个价格 并且全部使
  • boto3 资源(例如 DynamoDB.Table)的类型注释

    The boto3库提供了几种返回资源的工厂方法 例如 dynamo boto3 resource dynamodb Table os environ DYNAMODB TABLE 我想注释这些资源 以便我可以获得更好的类型检查和完成 但我
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • 希伯来语中的稀疏句子标记化错误

    尝试对希伯来语使用稀疏句子标记 import spacy nlp spacy load he doc nlp text sents list doc sents I get Warning no model found for he Onl
  • Jupyter Notebooks 不显示进度条

    我正在尝试在 Jupyter 笔记本中显示进度条 这是一台新电脑 我通常做的事情似乎不起作用 from tqdm import tqdm notebook example iter 1 2 3 4 5 for rec in tqdm not
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • Python多处理错误“ForkAwareLocal”对象没有属性“连接”

    下面是我的代码 我面临着多处理问题 我看到这个问题之前已经被问过 我已经尝试过这些解决方案 但它似乎不起作用 有人可以帮我吗 from multiprocessing import Pool Manager Class X def init
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • DataGridView 导航到下一行

    我有一个 C winforms 应用程序 我试图让一个按钮工作 该按钮将选择 datagridview 中当前选择的行之后的下一行 到目前为止我的代码是 private void button4 Click object sender Ev
  • 谷歌互动涂鸦

    有人知道 Google 奥运互动涂鸦是如何运作的吗 http www google com doodles soccer 2012 我发现Div是hplogo 样式就在它的上方 例如 hplogo background url logos
  • Angular js:从 jQuery 访问 $scope

    stackoverflow上有好几个这样的问题 我知道 尝试了所有答案 但仍然没有运气 我的html div class headline gameContent headline div jQuery var country headli
  • MKMapView 在 iOS 8 中显示空白屏幕

    我在 iOS 8 中显示 MKMapView 时遇到问题 它在 iOS 7 中运行良好 现在也运行良好 但仅限于模拟器 在设备上 它仅显示注释 但后面不显示地图 它看起来像这样 https i stack imgur com SenGt j
  • .NET 3.5 C# 与 System.Timer System.ObjectDisposeException 的错误:无法访问已释放的对象

    在我的 Windows 服务应用程序中 我经常使用计时器 我只使用 System Timers 我以前从未遇到过这个问题 但突然我遇到了这个异常 System ObjectDisposedException Cannot access a
  • 文本框的默认值

    如何设置文本框的值 我有这个 1 文本框 我想将默认值设置为 0 这样当用户不输入任何内容时我的计算仍然可以 这可以在标记 aspx 中完成 如下所示
  • 是否有与 jQuery .has() 等效的普通 JS?

    在这个 jQuery 选择器中 相当于 has 的普通 JS 是什么 main container children analytics has a not promo Within main container 我正在尝试选择所有 ana
  • 在 QtCreator 中使用 cin

    对于学校 我们使用 C 作为首选语言 我目前正在使用 QtCreator 作为 IDE 它的 GUI 库非常棒 学校正在使用 Visual Studio 然而 我们编写的大多数程序都使用 cin 和 cout 进行输入 输出 cout 作为
  • 为什么 WCF 在作为 Web 服务托管时不能“正确”使用/公开抽象类型

    我设计 Web 服务已经有一段时间了 但直到最近才不得不公开 复杂 的 WCF 服务 我对 WCF 中明显缺乏对抽象类型的 适当支持 感到困惑 当然 你可以使用它们 当然你可以让它们 工作 你只是不会得到你想要的 第一个问题是 如果您从具有
  • Rails 推荐的添加示例数据的方式

    我有一个类似于下面的 Rake 脚本 但我想知道是否有更有效的方法来执行此操作 而不必删除数据库 运行所有迁移 重新播种数据库 然后添加示例数据 namespace db do desc Fill database with sample
  • 不符合 POSIX 的系统上 ssize_t 的替代方案

    我正在编写一个涉及网络 I O 的程序 所以send and recv使用的是 POSIX 函数 他们返回一个ssize t 这也是 POSIX 特定的 包装纸看起来像这个 ATM ssize t sock send int sock co
  • Mac 终端发送带附件的电子邮件

    我正在尝试制作一个 bash 脚本 该脚本将向所有联系人发送一封电子邮件 其中包含一条消息和一个附件 这并非出于恶意目的 我怎么能这样做呢 这可能吗 提前致谢 我之前使用 uuencode 来完成此操作 uuencode source tx
  • 如何动态添加组件到Java JScrollPane

    我正在尝试用 Java 制作 GUI 应用程序 但在 JScrollPane 中动态添加 更新组件时遇到问题 我有两个 JPanel P1 和 P2 其中 P1 有一个用于设置应用程序参数的表单 P2 包含一些 GUI 组件 这些组件根据
  • Angularjs 合并两个对象,忽略空值和缺失值

    例如 从这两个对象 var object1 color yellow size null age 7 weight null var object2 color blue size 51 age null 我想要这个 对象 2 覆盖对象 1
  • 为什么 Angular 8 路由器无法在带有 WkWebView 的 Cordova IOS 中工作?

    我有一个现有的应用程序构建Angular8 及其代码由一个网站和 2 个移动应用程序共享Android and IOS 在帮助下捆绑Cordova 它工作正常 但苹果公司宣布他们很快将不再支持使用UIWebView 自 2020 年 4 月
  • 让匿名用户使用 Google Drive SDK 将文件上传到我的 Google 云端硬盘

    我正在构建一个网络应用程序 我需要让用户上传文件 我想将所有用户上传的文件存储在 我的 中央 Google 云端硬盘中 用户不必登录他们的 Google 帐户或授权该应用程序 因为他们将上传到我的 Google 云端硬盘 这可能吗 您应该使
  • 按位运算 - 零填充右移(>>>)用法?

    一般来说 位移位 gt gt lt lt 允许我们除 乘 2 例子 9 base 10 00000000000000000000000000001001 base 2 9 gt gt 2 base 10 000000000000000000
  • Wpf Observable 集合和 DataGrid 不更新更改

    我在视图模型中有一个可观察集合 它实现了 Bindable Base 如下所示 请查看 MoveUp 和 MoveDown 方法 它们绑定到视图中的两个按钮 当按下向上按钮时 我希望数据网格中的选定行根据数据库中的序列列向上移动一步 向下移
  • 在实体框架编码迁移中创建全文索引

    太长了 如何使用 Entity Framework 5 编码迁移添加全文索引 我在使用实体框架迁移向数据库添加全文索引时遇到问题 它需要从一开始就存在 因此我尝试修改自动生成的 InitialCreate 迁移来添加它 由于没有办法通过 D
  • `with canvas:` (Python `with Something() as x:`) 如何在 Kivy 中隐式工作?

    我刚刚意识到在 Kivy 中使用添加顶点指令的方式有一些神秘的东西 至少对我来说 withPython 语句 例如 方式with使用是这样的 some code class MyWidget Widget some code def som