我已经移植了这个任务的代码:http://www.stanford.edu/class/cs221/progAssignments/PA1/search.html(整个源代码可以从那里获得zip) 从Python2.x到3.x。注意,移植不是我的任务,我只是想让代码保持最新,避免安装另一个版本的Python。。。在
在修复了通常的2.x->;3.x语法(打印、异常引发等)之后,我意识到模块Tkinter
现在在3.x(小写)中被称为{
def keys_pressed(d_o_e=tkinter.tkinter.dooneevent,d_w=tkinter.tkinter.DONT_WAIT)
错误类型如下:
^{pr2}$IDE中的代码完成和变量跟踪似乎确实表明tkinter
模块没有属性或子类tkinter
,在这些属性或子类下可以引用dooneevent
或{
_tkinter.dooneevent(_tkinter.DONT_WAIT)
将主循环向前移动,但即使这样引用它,仍然会产生相同的错误。在
任何想法都值得赞赏。在
更新:通过lambda符号引用_root_窗口似乎可以工作,因为在大多数情况下,它不再抱怨预执行时间。然而,对于我未经训练的眼睛来说,这基本上是“魔法”,因此我几乎不知道接下来的错误是什么,也不知道如何解决它。方法现在看起来像这样,我在第一行做了更改:
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
引用定义方法的行(上面的第一行)。在
在Python3中,
Tkinter.tkinter
似乎已更改为tkinter._tkinter
。比较python2中的these docs和python3中的these。另外,dooneevent
不再在tkinter._tkinter
中,而是Tk
(又名root
)对象的成员。在所以把你的代码改成
这利用了在链接代码中
_root_window
是global
的事实,因此当定义类时,_root_window
不可用,但在lambda运行时它将可用。在相关问题 更多 >
编程相关推荐