2015-05-04 9 views
8

Uso Tkinter per creare una finestra GUI e selezionare un file. Il codice che uso è la seguente:NSException con Tkinter su mac

Tk().withdraw() 
file = askopenfilenames(title='Chose transition file') 

Quando eseguo questo da solo, sia in Windows e OSX, funziona. Tuttavia, ho bisogno che faccia parte di uno script più grande che può essere trovato in this link (righe 88-89). Questo script viene eseguito correttamente in più un sistema operativo Windows, ma quando l'eseguo in OSX, ottengo il seguente errore:

Last login: Thu Apr 30 17:45:40 on ttys000 
/Users/nueye/Desktop/plaidtomac/PyInstaller-2.1/Plaid/dist/Plaid ; exit; 
MyMacBookPro15:~ nueye$ /Users/nueye/Desktop/plaidtomac/PyInstaller-2.1/Plaid/dist/Plaid ; exit; 
running Plaid 
2015-04-30 17:46:15.367 Plaid[526:903] -[NSApplication _setup:]: unrecognized selector sent to instance 0x101d41340 
2015-04-30 17:46:15.368 Plaid[526:903] An uncaught exception was raised 
2015-04-30 17:46:15.369 Plaid[526:903] -[NSApplication _setup:]: unrecognized selector sent to instance 0x101d41340 
2015-04-30 17:46:15.370 Plaid[526:903] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSApplication _setup:]: unrecognized selector sent to instance 0x101d41340' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x00007fff8685b7b4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x00007fff84e2c0f3 objc_exception_throw + 45 
    2 CoreFoundation      0x00007fff868b5110 +[NSObject(NSObject) doesNotRecognizeSelector:] + 0 
    3 CoreFoundation      0x00007fff8682d91f ___forwarding___ + 751 
    4 CoreFoundation      0x00007fff86829a68 _CF_forwarding_prep_0 + 232 
    5 Tk         0x0000000117b0cb24 TkpInit + 545 
    6 Tk         0x0000000117a829ee Initialize + 1648 
    7 _tkinter.so       0x0000000103b2ac0d Tcl_AppInit + 77 
    8 _tkinter.so       0x0000000103b29657 Tkinter_Create + 919 
    9 Python        0x00000001002bffad PyEval_EvalFrameEx + 21405 
    10 Python        0x00000001002c1fb3 PyEval_EvalCodeEx + 2115 
    11 Python        0x000000010023bac0 function_call + 176 
    12 Python        0x0000000100209eb2 PyObject_Call + 98 
    13 Python        0x000000010021c56d instancemethod_call + 365 
    14 Python        0x0000000100209eb2 PyObject_Call + 98 
    15 Python        0x00000001002b9957 PyEval_CallObjectWithKeywords + 87 
    16 Python        0x000000010021f85e PyInstance_New + 126 
    17 Python        0x0000000100209eb2 PyObject_Call + 98 
    18 Python        0x00000001002bdc60 PyEval_EvalFrameEx + 12368 
    19 Python        0x00000001002c1fb3 PyEval_EvalCodeEx + 2115 
    20 Python        0x00000001002c03f0 PyEval_EvalFrameEx + 22496 
    21 Python        0x00000001002c1fb3 PyEval_EvalCodeEx + 2115 
    22 Python        0x00000001002c20d6 PyEval_EvalCode + 54 
    23 Python        0x00000001002e7237 PyRun_StringFlags + 279 
    24 Python        0x00000001002e7321 PyRun_SimpleStringFlags + 65 
    25 Plaid        0x0000000157e1beac 0x0 + 5769379500 
    26 Plaid        0x0000000157e2fcb8 0x0 + 5769460920 
    27 Plaid        0x0000000157e1b7f4 0x0 + 5769377780 
) 
terminate called after throwing an instance of 'NSException' 
Abort trap 
logout 

Il codice funziona benissimo in OSX se io commento le righe di codice Tkinter.

Potrebbe per favore dirmi cosa devo fare per superare questo?

+2

Questo è un bit di codice dispari (righe 88-89). Per uno, non si salva un riferimento a 'Tk()', e non si avvia mai il ciclo degli eventi. Hai considerato di spostare quel codice su una funzione, salvare un riferimento temporaneo alla finestra di root ed eseguire il ciclo degli eventi? –

+0

@BryanOakley, grazie per il tuo commento. Potresti postare un link ad un esempio che fa ciò che proponi? Non sono affatto esperto in Tkinter –

risposta

1

Seguire la risposta in this question

C'è un problema noto con TK e IDLE su OSX perché:

Python's integrated development environment, IDLE, and the tkinter GUI toolkit it uses, depend on the Tk GUI toolkit which is not part of Python itself. For best results, it is important that the proper release of Tcl/Tk is installed on your machine.

per ingrandire:

If you are using Python from a python.org 64-bit/32-bit Python installer for Mac OS X 10.6 and later, you should only use IDLE or tkinter with an updated third-party Tcl/Tk 8.5 (not 8.6), like ActiveTcl 8.5 installed.

If you are using Mac OS X 10.6, do not use IDLE or Tkinter from the Apple-supplied Python 2.6.1 in Mac OS X 10.6. If possible, install and use a newer version of Python and of Tcl/Tk.

If you are using Mac OS X 10.7 or later, the Apple-supplied Tcl/Tk 8.5 still has serious bugs that can cause application crashes. If you wish to use IDLE or Tkinter, install and use a newer version of Python and of Tcl/Tk.

Questo link (https://www.python.org/download/mac/tcltk/) forse aiuta tu.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/17790283) – Oz123

+0

@ Oz123: Grazie per avermelo ricordato, sono un principiante. Ho aggiornato la risposta –