【问题标题】:new window when using tkinter in python在 python 中使用 tkinter 时的新窗口
【发布时间】:2012-05-07 01:13:02
【问题描述】:

我正在创建一个游戏,供用户选择角色颜色并引导他们穿过迷宫。最初我让用户输入他们角色的名称和他们希望他们去的方向,但将输入更改为使用 tkinter 的箭头键。现在我遇到了一个问题,因为 tkinter 会为其输入打开一个新窗口。

import view,datetime,Tkinter as tk

def main():
   global root
   if __name__ == "__main__":
      view.root.update()
      command = raw_input( "choose a player:" )
      run1( command )
      view.root.update()
      while True:
          root = tk.Tk()
          print( "Press a key (Escape key to exit):" )
          root.bind_all( '<Key>', key )
          root.mainloop()
      root.withdraw()
      root.destroy()
      view.root.destroy()

main()

这显示了我导入的内容和我的主要功能。

【问题讨论】:

  • 我不确定这是否是问题所在,但是您的 main 函数中的 while 循环的目的是什么?
  • 其实现在我想起来了,我很确定这就是问题所在。当你用鼠标关闭游戏窗口时会发生什么?
  • 我把while循环作为一个无限循环。我把它拿出来,它仍然做同样的事情。当我提示用户输入角色和他们希望他们前进的方向以便他们可以在游戏中移动时,我在我的原始程序中有它。当我改为箭头键时,它变得不必要了。
  • 当我开始游戏时,它会打开我想要的实际窗口,其中显示了角色和迷宫,但还有另一个较小的窗口,我必须在其中单击以进行角色移动。当我关闭辅助窗口时,出现此错误:TclError: can't invoke "wm" command: application has been destroy
  • root.mainloop() 行阻塞,直到应用程序被销毁。辅助窗口的代码在哪里?

标签: python tkinter


【解决方案1】:

每次你这样做......

root = tk.Tk()
...
root.mainloop()

您正在创建一个全新的窗口。所以当然当你在这个新窗口上使用bind_all 时,那个新窗口就是接收输入的窗口。我无法真正说出你想要做什么,但很明显这就是你看到你所看到的行为的原因。

大多数时候,你只需要一个root——这就是它被称为“root”的原因!看来您应该在 view.root 实例上使用 bind_all,而不是在这个新根上。

另外,作为旁注,您的代码中的控制流确实很奇怪。为什么if __name__ == '__main__' 里面是main 函数?通常它位于模块的顶层,并且会调用 main 本身。

【讨论】:

  • 我在那里做错了很多事情,感谢您的帮助。我已经获得了使用箭头键的代码,并且正在使用该 root 而不是我应该使用的 view.root。我上面的 16 行现在变成了 6 行。再次感谢。
【解决方案2】:

root = tk.Tk() 语句实际上创建了一个新窗口,root.mainloop() 维护窗口的控制循环。如果将此代码添加到while True: 中,则会一一打开多个窗口。

检查while True:的必要性

问候

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2017-05-09
    • 1970-01-01
    • 2017-04-24
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多