2012-05-07 2 views
1

Я создаю игру для пользователя, чтобы выбрать цвет символов и приступить к их проходу через лабиринт. Первоначально у меня был пользователь, который вводил имя своего персонажа и направление, в котором они хотели, чтобы они шли, но изменил вход, чтобы использовать клавиши со стрелками с tkinter. Теперь я столкнулся с проблемой, потому что tkinter открывает новое окно для ввода.новое окно при использовании tkinter в python

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() 

Это показывает, что я импортировал и свою главную функцию.

+0

Я не уверен, если это вопрос, но какова цель цикла, а в вашей основной функции? –

+0

На самом деле теперь, когда я думаю об этом, я уверен, что это проблема. Что происходит, когда вы закрываете окно игры, скажем, с помощью мыши? –

+0

Я поставил цикл while как бесконечный цикл. Я взял его, и он по-прежнему делает то же самое. У меня было это в моей оригинальной программе, когда я предлагал пользователю ввести персонажа и направление, в котором они хотели, чтобы они шли, чтобы они могли перемещаться по игре. Когда я перешел на клавиши со стрелками, это стало ненужным. – user1378701

ответ

3

Каждый раз, когда вы это делаете ...

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

Вы создаете новое окно. Поэтому, конечно, когда вы используете bind_all в этом новом окне, это новое окно получает тот вход. Я не могу сказать, что вы пытаетесь сделать, но ясно, что именно поэтому вы видите поведение, которое вы видите.

В большинстве случаев вам нужен только один root - вот почему он называется «корень»! Похоже, вы должны использовать bind_all на примере view.root, а не на этом новом корне.

Кроме того, в качестве побочного примечания поток управления действительно странный в вашем коде. Почему if __name__ == '__main__'внутриmain функция? Обычно это будет на верхнем уровне модуля, и будет позвонить по телефонуmain.

+0

Я делал много чего не так, спасибо за помощь. Я получил код для использования клавиш со стрелками и использовал этот корень вместо view.root, который я должен был использовать. Мои 16 строк выше теперь превратились в 6 строк. Еще раз спасибо. – user1378701

1

Оператор root = tk.Tk() фактически создает новое окно, а root.mainloop() поддерживает контур управления для окон. Если вы добавите этот код в while True:, несколько окон будут открыты один за другим.

Проверьте необходимость в while True:

С уважением