【问题标题】:python tkinter package tk.call evalpython tkinter 包 tk.call eval
【发布时间】:2017-11-15 19:30:25
【问题描述】:

我正在使用 python tkinter 在 python 中运行 tcl 并且有两种方法可以运行 tcl 命令:

import tkinter 
root = tkinter.Tk()
root.eval("winfo exists .l0")
root.tk.call("winfo exists .l0")

意思相同

但是有什么不同呢? 如果我没有定义小部件名称 .l0 我可以直接使用

child = ".l0"
child.winfo_exists()

? 因为python告诉我“str没有属性winfo_exists”

【问题讨论】:

    标签: python tkinter tcl


    【解决方案1】:

    不同之处在于call 将每个参数作为单独的单词传递给 tcl,其中eval 将通过首先解析字符串然后执行它来评估字符串。

    换句话说,这个:

    root.eval("winfo exists .l0")
    

    ...在功能上与此相同:

    root.tk.call("winfo", "exists", ".l0")
    

    至于错误信息'str' object has no attribute 'winfo_exists',就是这个意思。 "l0" 是嵌入式 tcl 解释器中对象的名称,但在 python 中,"l0" 只是一个字符串,python 字符串没有属性winfo_exists

    【讨论】:

    • 如果我需要测试一个名为 .l0 的窗口没有它的类型,你知道如何处理吗?
    • @shuji:我不明白你的问题。 “.l0”在 tcl 的世界中没有类型。在 tcl 中,一切都是字符串。我确定你想要的可以做到,但我无法理解你想要什么。
    • 我的意思是,在wish(tcl shell)中,我可以输入“winfo exists .l0”,但我怎么能在python中做到这一点?使用 .l0 是一个未知的小部件(不是顶盖、框架等)
    • @shuji:就像我的回答所示,您可以拨打root.tk.call 并传入您想要的任何窗口名称。这只会告诉您是否有该名称的 tcl/tk 窗口,它不会告诉您是否存在代表该小部件的 tkinter 对象。这是一件非常不寻常的事情,因为使用 tkinter 您几乎永远不知道内部窗口名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多