2016-03-22 9 views
1

Kodun, IDLE'nin run module f5 komutu aracılığıyla çalıştırıldığında, komut satırından çalıştırıldığında kodun hata vermesinin bir nedeni var mı?Neden tkinter modülü, komut satırı üzerinden çalıştırılırken öznitelik hatasını artırıyor, ancak IDLE yoluyla çalıştırılmıyor mu?

Geçtiğimiz günlerde kodumun okunabilirliğini ve sağlamlığını geliştirmeye çalışıyorum. Sonuç olarak, tüm from module import * satırlarını kaldırmaya çalışıyorum. Ben from tkinter import * kullanmak için kullanılan ve benim kod satırı mükemmel iyi çalıştı:

self.path = filedialog.askdirectory()

Ama şimdi import tkinter as tk için from tkinter import * değişti ve ben buna göre kod değişti:

self.path = tk.filedialog.askdirectory()

A GUI.py adlı dosya şu dosyayı şu şekilde içe aktarır: from lib.filesearch import * (belirtilen kod satırı dosya arama dosyasında bulunur.)

Kodumu IDLE aracılığıyla çalıştırıyorum ve her şey yolunda. Benim GUI hala çalışıyor ve ben pencere komut satırı kodu çalıştırdığınızda, ancak normale gibi çalışır self.path = tk.filedialog.askdirectory() hat hata alıyorum: my kodundan ilgili bitlerini İşte

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

şunlardır: FileSearch itibaren

. py thi aksine

import tkinter as tk 
    def get_path(self): 
     """Store user chosen path to search""" 
     self.paths = tk.filedialog.askdirectory(initialdir = FileSearch.DEFAULT) 
     return self.paths 

GUI.py

itibaren
from lib.filesearch import *  
    def Browse(self): 
     self.BrowseB['state']='disabled' 
     self.p=self.CrawlObj.get_path() 
     self.AddText('Searching from Path: ' + str(self.p)) 
     self.BrowseB['state']='normal' 

s question Sadece bir sürümü yüklü python var. Yani, Python34.

+1

Gerçekten neyi içe aktardığını görmek için basit bir hata ayıklama 'print (tk)' yazmayı deneyin. Başlangıçta farklı python yolları akla geliyor. –

+0

@Ilja'dan IDLE: '' ve komut satırından: ' ' – Dzhao

+0

Tamam, çizim tahtasına geri döndü. –

cevap

5

:

import tkinter as tk 
print(hasattr(tk,"filedialog")) 
import tkinter.filedialog 
print(hasattr(tk,"filedialog")) 
.kodunuz önce boşta aktarılır çünkü IDLE bunu gerekmez nedenidir

hiç IDLE kod yürütmesine zaman perde arkasında oluyor hepsi bir sürü var aslında, çalıştırın: boşta ait

>>> import inspect 
>>> my_frame = inspect.currentframe() 
>>> prev_frame = my_frame.f_back 
>>> prev_frame.f_globals["__file__"] 
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/idlelib/run.py' 
>>> prev_frame.f_locals 
{'self': <idlelib.run.Executive object at 0x10525b8d0>, 'code': <code object <module> at 0x1056874b0, file "<pyshell#1>", line 1>} 
>>> import sys 
>>> sys.stdout 
<idlelib.PyShell.PseudoOutputFile object at 0x1053089e8> 

programınızı kontrol alt işlemi zaten ithal etmiştir birçok alt modülleri ve bunlarınbirçoğu Boşta olduğundantinkter ile inşa edilmiştir.Aynı kodu yeni bir python yorumlayıcısında çalıştırıyorsanız:

>>> import inspect 
>>> my_frame = inspect.currentframe() 
>>> prev_frame = my_frame.f_back 
>>> print(prev_frame) 
None 
+1

OMG! Ben sadece en iyi boşta hack bulundu: 'sys.stdout.shell.write (" merhaba "," STRING ")' tkinter'in metin widget etiketlerini kullanabilirsiniz! –

+0

Yukarıdaki yorum hakkında daha fazla bilgi için http://stackoverflow.com/a/36183935/5827215 adresindeki cevabıma bakın –

4

Aslında, modülün filedialog özniteliğine sahip olmadığı, bir alt modülü olduğu ve kullanmadan önce onu import tkinter.filedialog olarak almanız gerektiği doğrudur. Önceden içe aktarıldığı için filedialog numaralı IDLE'yi açıkça içe aktarmadan tk.filedialog'u kullanabilirsiniz.

import sys 
sys.modules['tkinter.filedialog'] 

Yukarıdaki kod standart bir piton tercüman bir KeyError yükseltecek ama IDLE içinde <module 'tkinter.filedialog' from '/usr/lib/python3.5/tkinter/filedialog.py'> gibi bir şey dönecektir. Çünkü açıkça yüke onlar için submodules aktarmanız gerekir tkinter yapısı

İlgili konular