Mik*_*ael 5 python porting tkinter version
我一直在移植这个任务的代码: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)
Run Code Online (Sandbox Code Playgroud)
错误的类型如下:
AttributeError: 'module' object has no attribute 'tkinter'
Run Code Online (Sandbox Code Playgroud)
我的IDE中的代码完成和变量跟踪确实似乎表明该tkinter模块没有属性或子类tkinter,可以在其中引用dooneevent或DONT_WAIT.但是,在互联网上还有一些使用类似结构的人参考
_tkinter.dooneevent(_tkinter.DONT_WAIT)
Run Code Online (Sandbox Code Playgroud)
将主循环向前移动,但即使像那样引用它仍然会产生相同的错误.
任何想法都非常感激.
更新:通过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)
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
TypeError: 'Tk' object is not callable
Run Code Online (Sandbox Code Playgroud)
引用定义方法的行(上面的第一行).
它的出现Tkinter.tkinter改变为tkinter._tkinter在Python 3.比较这些文档在Python 2与这些在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):
Run Code Online (Sandbox Code Playgroud)
这需要的事实是,在你的代码链接的优点_root_window是global,因此,尽管_root_window是不可定义的类时,在运行拉姆达时可用.
| 归档时间: |
|
| 查看次数: |
2244 次 |
| 最近记录: |