2013-08-05 45 views
4

首先,所有相關的代碼爲什麼我在python 3中無法調用'module'對象?

main.py

import string 
import app 
group1=[ "spc", "bspc",",","."]#letters, space, backspace(spans mult layers) 
# add in letters one at a time 
for s in string.ascii_lowercase: 
    group1.append(s) 
group2=[0,1,2,3,4,5,6,7,8,9, "tab ","ent","lAR" ,"rAR" , "uAR", "dAR"] 
group3= [] 
for s in string.punctuation: 
    group3.append(s)#punc(spans mult layers) 
group4=["copy","cut","paste","save","print","cmdW","quit","alf","sWDW"] #kb shortcut 
masterGroup=[group1,group2,group3,group4] 
myApp =app({"testFKey":[3,2,2]}) 

app.py

import tkinter as tk 
import static_keys 
import dynamic_keys 
import key_labels 
class app(tk.Frame): 

    def __init__(inputDict,self, master=None,): 
     tk.Frame.__init__(self, master) 
     self.grid(sticky=tk.N+tk.S+tk.E+tk.W) 
     self.createWidgets(self, inputDict) 
    def createWidgets(self,inDict): 
     top=self.winfo_toplevel() 
     top.rowconfigure(0, weight=1) 
     top.columnconfigure(0, weight=1) 
     self.rowconfigure(0, weight=1) 
     self.columnconfigure(0, weight=1) 
     tempDict = {} 
     for k,v in inDict.items(): 
       if 1<=v[0]<=3: 
        tempDict[k] = static_keys(*v[1:]) 
       elif v[0] ==4: 
        tempDict[k] = dynamic_keys(k,*v[1:]) 
       elif v[0]==5: 
        tempDict[k] = key_labels(*v[1:]) 
     for o in tempDict: 
      tempDict[o].grid() 
     return tempDict 

static_keys.py

import tkinter 
class static_keys(tkinter.Label): 
    """class for all keys that just are initiated then do nothing 
    there are 3 options 
    1= modifier (shift etc) 
    2 = layer 
    3 = fkey, eject/esc""" 
    def __init__(t,selector,r,c,parent,self): 
     if selector == 1: 
      tkinter.Label.__init__(master=parent, row=r, column=c, text= t, bg ='#676731') 
     if selector == 2: 
      tkinter.Label.__init__(master=parent, row=r, column=c, text= t, bg ='#1A6837') 
     if selector == 3: 
      tkinter.Label.__init__(master=parent, row=r, column=c, text= t, bg ='#6B6966') 

現在來描述問題。當我在python3運行main.py,我得到的錯誤

File "Desktop/kblMaker/main.py", line 13, in <module> 
myApp =app({"testFKey":[3,2,2]}) 
TypeError: 'module' object is not callable 
+0

至於你的問題,也可以使用代碼格式來查找錯誤/輸出。 –

+0

您向我們展示的回溯不可能來自您向我們展示的代碼。它也與您在問題標題中提到的錯誤不符。所以...請給我們一個代碼,追溯和描述,所有匹配,而不是讓我們猜測。 – abarnert

+0

@abarnert編輯不知道發生的事 – fozbstuios

回答

9

您有一個名爲app模塊包含一個類名爲app。如果你只在main.py中執行import app,則app將引用該模塊,而app.app將引用該類。這裏有幾個選項:

  • 留下你import語句獨自一人,並使用myApp = app.app({"testFKey":[3,2,2]}) main.py
  • 內與from app import app更換import app,現在app將指類myApp = app({"testFKey":[3,2,2]})做工精細
+0

我快了28秒:P但是你的回答也很好。 – Tadeck

+2

或者,更好的是,命名類App'而不是'app'來完全避免這種混淆(並且要符合PEP8的要求)。 – abarnert

+0

@abarnert:Upvote建議遵循PEP8並重新命名以避免混淆。我假設有使用該模塊的代碼,因此更改命名會引入問題。但是可以通過在'app.py'文件末尾添加以下行來簡單修復:'app = App#for backward compatibility'。 – Tadeck

2

main.py變化下聯:

from app import app 

的問題是你有app模塊,並在其中app類。但你從它導入模塊,而不是類:

myApp = app({"testFKey": [3, 2, 2]}) 

(也可以代替代替「app」內線以上爲「app.app」)

1

由於FJ和Tadeck已經解釋過,問題是app是模塊app,而app.app是在該模塊中定義的類app

讓您可以通過使用from app import app(或者,如果你一定要,甚至from app import *),如Tadeck的答案,或者通過明確提到app.app,而不是僅僅app,如F.J的答案。

如果您將該課程重命名爲App,那麼這不會奇蹟般地解決任何問題 - 您仍需要或者from app import App或參考app.App - 但它會使問題變得更加明顯。在解決問題後,也可以減少代碼的混淆。

這是部分原因是PEP 8建議:

模塊應該是短期的,全小寫的名字。

...

幾乎毫無例外,類名使用CapWords約定。

這樣,就沒有辦法混合起來。

相關問題