- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 Kivy 的新手,我有这个演示我的问题的小演示片段:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
class KivyGuiApp(App):
def build(self):
return root_widget
class MyBox(BoxLayout):
def print_ids(self, *args):
print("\nids:")
for widget in self.walk():
print("{} -> {}".format(widget, widget.id))
def print_names(self, *args):
print("\nnames:")
for widget in self.walk():
print("{} -> {}".format(widget, widget.name))
root_widget = Builder.load_string("""
MyBox:
id: screen_manager
name: 'screen_manager'
SimpleLayout:
id: simple_layout
name: 'simple_layout'
<SimpleLayout@BoxLayout>:
id: simple_layout_rule
name: 'simple_layout_rule'
Button:
id: button_ids
name: 'button_ids'
text: 'print ids to console'
on_release: app.root.print_ids()
Button:
id: button_names
name: 'button_names'
text: 'print names to console'
on_release: app.root.print_names()
""")
if __name__ == '__main__':
KivyGuiApp().run()
所以当你运行代码时会有两个按钮:
我的问题是:
奖励问题:
编辑:
所以这是我能想到的通过唯一的“全局”id 引用小部件的最简单方法。
首先,我创建了一个将由我的 App 类继承的类:
class KivyWidgetInterface():
''' interface for global widget access '''
global_widgets = {}
def register_widget(self, widget_object):
''' registers widget only if it has unique gid '''
if widget_object.gid not in self.global_widgets:
self.global_widgets[widget_object.gid] = widget_object
def get_widget(self, widget_gid):
''' returns widget if it is registered '''
if widget_gid in self.global_widgets:
return self.global_widgets[widget_gid]
else:
return None
因此,只有当小部件具有 gid(一个小部件类变量)并且它是唯一的时,才会被注册。这样我就可以在这个字典中只存储重要的小部件。此外,它可以从 .kv 和 python 端轻松访问。
现在我创建 gid 变量并将它们注册到 .kv 中的字典:
<PickDirectory>:
gid: 'pick_directory'
on_pos: app.register_widget(self)
on_selection: app.get_widget('filelist').some_func()
<FileListView>:
gid: 'filelist'
on_pos: app.register_widget(self)
Button:
name: 'not important'
Button:
gid: 'tab_browse_button1'
on_pos: app.register_widget(self)
实际上困扰我的是我在这个“全局”字典中使用“on_pos”事件注册我的小部件......我真的不喜欢,但我找不到任何可靠的方法来调用寄存器小部件初始化后的方法(在初始化阶段之后立即调用 on_pos,当小部件被定位时,以后很少,所以......根据我对 kivy api 的了解,这似乎是最不麻烦的方法,订单小部件被初始化使用 .kv 语言等;因此,如果有更好的方法,我将非常感激任何指点)。
无论如何,通过这种方式,我可以直接从 .kv 轻松地将任何事件绑定(bind)到任何类中的任何方法
要记住的一件事是 gid(全局 ID)需要在全局范围内是唯一的,但我发现没有比在本地保持 ID 唯一更令人不安的了(这对我来说可能同样甚至更令人困惑)。正如我所说 - 我想以不同的方式注册小部件,但我找不到任何其他可靠的方法来做到这一点(而且我发现 Clock 在此类事情上不可靠)。
最佳答案
实际上,没有。 name
在你的小部件中是一个变量和id
只是一个小部件引用,weakref
根据文档。也许python docs将帮助您了解它是如何工作的。你所做的是打印 id
,而不是小部件内的变量“id”。
在kivy docs据解释,在 kv
之后被解析后,ids 被收集到一个 ObservableDict 中。 id 就像 python 字典键一样工作 id:Widget
但前提是通过字典访问( ids
)。我想kv
解析器只是将所有 id 放入字典中,并且只使用它创建的字典。
Button:
id: test
text: 'self.id'
#or
Button:
id: 'test'
text: 'self.id'
即使像字符串一样写,也没有任何变化。所以我希望解析器的行为是这样的:抓取 id:
之后的所有单词, 变成一个字符串,附加到 ids
词典 <id_string>:Widget_weakref
, 忘记了 id
在你的.kv
或者如果它适用于 .kv
则忽略它再次。因此,当直接调用 id(不是字典式的 d[key])时,它的行为就像一个空的/None
。多变的。我希望我是对的。
回答第二个和第三个:
如果您的意思是通过 id
访问小部件在MyBox
直接举例SimpleLayout
, 那么是的。
python 类:
self.ids.simple_layout
kv MyBox 规则:
MyBox:
id: screen_manager
name: 'screen_manager'
BoxLayout:
Label:
id: my_label
text: 'test'
Button:
text: 'button'
on_release: self.text = root.ids.my_label.text
但是,要像 python 全局工作一样通过 id 访问所有小部件,这是不可能的。您需要先访问类/小部件,然后再访问它的 ids
词典
关于python - Kivy:获取小部件 ID 并通过唯一属性访问小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35792621/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!