gpt4 book ai didi

python - 将 2.x 代码移植到 3.x 时出现 tkinter 问题, 'tkinter' 模块属性不存在

转载 作者:太空狗 更新时间:2023-10-30 01:03:31 24 4
gpt4 key购买 nike

更新:见下文

我一直在为这个作业移植代码:http://www.stanford.edu/class/cs221/progAssignments/PA1/search.html (整个源代码可以从那里以 zip 的形式获得)从 Python 2.x 到 3.x。请注意,移植不是任务,这只是我试图使代码保持最新并避免安装另一个版本的 Python ...

经过通常的 2.x -> 3.x 语法修复(打印、异常引发等),并意识到模块 Tkinter 现在被称为 tkinter在 3.x(小写)中,我遇到了一些奇怪的问题,包括这个片段和其他几个类似的问题:

def keys_pressed(d_o_e=tkinter.tkinter.dooneevent,d_w=tkinter.tkinter.DONT_WAIT)

错误属于以下类型:

AttributeError: 'module' object has no attribute 'tkinter'

我的 IDE 中的代码完成和变量 trace 确实似乎表明 tkinter 模块没有属性或子类 tkinter 可以在其下引用 dooneeventDONT_WAIT。然而,互联网上还有一些其他引用资料,人们使用像这样的结构

_tkinter.dooneevent(_tkinter.DONT_WAIT)

将主循环向前移动,但即使这样引用它仍然会产生相同的错误。

非常感谢任何想法。


更新:通过 lambda 符号引用 _root_window 似乎可行,因为在大多数情况下它不再提示预执行时间。然而,对于我未经训练的人来说,这基本上是“魔术”,因此我不知道这个后续错误在说什么或如何解决它。该方法现在看起来像这样,我在第一行进行了更改:

def move_to(object, x, y=None, d_o_e=lambda arg: _root_window(arg), d_w=tkinter._tkinter.DONT_WAIT):
if y is None:
try: x, y = x
except: raise 'incomprehensible coordinates'

horiz = True
newCoords = []
current_x, current_y = _canvas.coords(object)[0:2] # first point
for coord in _canvas.coords(object):
if horiz:
inc = x - current_x
else:
inc = y - current_y
horiz = not horiz

newCoords.append(coord + inc)

_canvas.coords(object, *newCoords)
d_o_e(d_w)

我得到的错误是:

TypeError: 'Tk' object is not callable              

引用定义方法的行(上面的第一行)。

最佳答案

似乎 Tkinter.tkinter 在 Python 3 中被更改为 tkinter._tkinter。比较 these docs来自 Python 2 与 these来自 Python 3。此外,dooneevent 不再位于 tkinter._tkinter 中,但仍然是 Tk 的成员(又名 root ) 对象。

所以把你的代码改成

def keys_pressed(d_o_e=lambda arg: _root_window.dooneevent(arg),
d_w=tkinter._tkinter.DONT_WAIT):

这利用了以下事实:在您的链接代码中 _root_windowglobal,因此当定义类时 _root_window 不可用,它将在运行 lambda 时可用。

关于python - 将 2.x 代码移植到 3.x 时出现 tkinter 问题, 'tkinter' 模块属性不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com