2016-08-06 3 views
1

Das Importieren eines ganzen Pakets funktioniert in IDLE, aber nicht in der Shell. Die folgenden funktioniert gut in IDLE:Importieren aus einem Paket in IDLE vs Shell

import tkinter as tk 
tk.filedialog.askopenfilename() 

in der Schale, bekomme ich diesen Fehler:

AttributeError: 'module' object has no attribute 'filedialog' 

Ich verstehe, dass ich zu import tkinter.filedialog haben diese Arbeit in der Schale zu machen.

Warum der Unterschied zwischen IDLE und Shell? Wie kann ich IDLE wie Shell verhalten? Es kann frustrierend sein, wenn ein Skript in IDLE arbeitet und in der Shell nicht funktioniert.

Ich benutze Python 3.4.

+0

Mögliches Duplikat von [Tkinter-Code mit Font-Modul kann nicht von der Kommandozeile aus ausgeführt werden?] (Http://stackoverflow.com/questions/30877112/tkinter-code-using-font-module-cant-run-from-) Befehlszeile) –

+0

@TerryJanReedy Ja, dieser Post beschreibt ein ähnliches Problem. Sollte die Skriptumgebung nicht isoliert sein von dem, was die IDLE für ihre eigenen Bedürfnisse verwendet? Und wenn ich 'tkinter' oder' tk' in IDLE schreibe, heißt es 'name'tkinter 'ist nicht definiert' oder' name'tk' ist nicht definiert', was definiert werden soll, wenn die Erklärung in diesem anderen Beitrag steht ist richtig. – mcu

+0

Ich habe die Close-Anfrage zurückgezogen, weil Sie nicht gefragt haben, "warum", was Sie herausgefunden haben, sondern "wie zu beheben". Ich habe das unten beantwortet. Und ja, die Skriptumgebung * sollte so weit wie möglich isoliert sein. Dies ist der Grund, Code in einem separaten Prozess auszuführen. Das IDLE-Dokument hat einen Abschnitt * 3.2. IDLE - Konsolen Unterschiede *, die einige auflisten, die unvermeidlich sind. Ich arbeite immer noch daran, die Anzahl der zusätzlichen Module in sys.modules auf ein Minimum zu reduzieren. (https://bugs.python.org/issue27534). Die aktuelle Reduzierung reduziert die Importzeit in run.py um 45% für mich. –

Antwort

1

Dies ist ein IDLE-Bug, den ich für zukünftige 3.5.3 und 3.6.0a4 Versionen behoben habe. Tracker issue.

Für eine vorhandene Version 3.5 oder 3.4 fügen Sie Folgendes zu idleLib/run.py direkt vor der LOCALHOST-Zeile hinzu.

for mod in ('simpledialog', 'messagebox', 'font', 
      'dialog', 'filedialog', 'commondialog', 
      'colorchooser'): 
    delattr(tkinter, mod) 
    del sys.modules['tkinter.' + mod] 

Ich nehme an, dass dies mit früheren 3.x-Versionen funktioniert, aber sie nicht zum Testen installiert haben. Ersetzen Sie für vorhandene 3.6.0a_-Versionen 'colorchooser' durch 'ttk'.

+0

Terry, danke für die Wartung der IDLE. Ich mag die Idee einer IDE, die mit einer Programmiersprache verpackt ist. Dies erleichtert die Bereitstellung auf Computern, an denen Sie nur selten arbeiten. Haben Sie Glück gehabt, eine Lösung für die CPU-Auslastung zu finden, die ich in http://stackoverflow.com/questions/32551405/python-shell-high-cpu-usage gefragt habe? Ich kann immer noch nicht herausfinden, was das Muster ist, das es auslöst, es passiert nicht die ganze Zeit. – mcu

+0

Danke für die positive Rückmeldung. –