2017-02-12 7 views
1

Когда я выполнял какой-то код на своем компьютере (macOS Sierra, 10.12.3), я не мог выйти из программы во втором окне, используя «quit» в док или с командой-Q. Я получил эту обратную связьНедопустимое имя команды «exit» при выполнении «exit»

invalid command name "exit" 
    while executing 
"exit" 

от PyCharm.

Я попытался запустить тот же скрипт в IDLE (Python 3.6) и Terminal (Python 2.7), и все они создали ту же проблему (хотя не было распечатки из IDLE).

Независимо от того, сколько раз я нажимаю command-Q, окно все еще было, хотя я все еще могу выйти из окна с помощью диспетчера окон. Может кто-нибудь, пожалуйста, скажите мне, почему возникла проблема? Следующий код является простейшим вариантом, который может воспроизвести проблему:

#!/usr/bin/env python 
try: 
    import tkinter as tk 
except ImportError: 
    import Tkinter as tk 

first = tk.Tk() 
first_frame = tk.Frame(first, height=10, width=200) 
first.wm_title("") 
frame = tk.Frame(first) 
tk.Button(frame, text="Next", command=lambda: first.destroy()).pack(side=tk.RIGHT) 
tk.Button(frame,text="Quit",command=lambda: quit()).pack(side=tk.LEFT) 
frame.pack(fill=tk.X) 
first.protocol("WM_DELETE_WINDOW", lambda: quit()) 
first.mainloop() 

root = tk.Tk() 
root.attributes('-topmost', True) 
root.title('') 
test=tk.Label(root,text='test') 
test.pack() 
root.mainloop() 

ответ

0

Я считаю, Cmd-Q (то есть меню «Python») получает инстанцированную первым основной цикл.

У меня есть следующий фрагмент кода, который вызывает такое же такое же поведение:

def x_out(): 
    if tkMessageBox.askokcancel("Quit", "Do you really wish to quit?"): 
     root.destroy() 

menu = Menu(root) 
root.config(menu=menu) 
filemenu = Menu(menu) 

menu.add_cascade(label="File", menu=filemenu) 
filemenu.add_separator() 
filemenu.add_command(label="Exit", command=x_out) 

Если я File -> Exit затем Cmd-Q, я получаю такое же поведение, как вы. Если я просто Cmd-Q, не проблема. Похоже, решение будет заключаться в том, чтобы ваш first.mainloop() был закрыт LAST. то есть не называть first.destroy() до тех пор, пока root.destroy()