2013-08-05 4 views
4

Во-первых, все соответствующие кодПочему я получаю объект 'module' не вызываемый в python 3?

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') 

Теперь для описания проблемы. Когда я бег main.py в Python3, я получаю ошибку

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. Если вы просто сделаете import app в main.py, то app будет ссылаться на модуль, а app.app будет ссылаться на класс. Вот несколько вариантов:

  • Оставьте свой оператор импорта в одиночку, и использовать myApp = app.app({"testFKey":[3,2,2]}) внутри main.py
  • Заменить import app с from app import app, теперь app будет относиться к классу и myApp = app({"testFKey":[3,2,2]}) будет работать нормально
+0

Я был на 28 секунд быстрее: P Но ваш ответ тоже хорош. – Tadeck

+2

Или, лучше, назовите класс 'App' вместо' app', чтобы полностью избежать этой путаницы (и быть совместимым с PEP8, для бонусных очков). – abarnert

+0

@abarnert: Приготовьтесь к предложению следовать PEP8 и переименуйте его, чтобы избежать путаницы. Я предположил, что есть код с использованием этого модуля, поэтому изменение названия приведет к возникновению проблем. Но это можно просто устранить, добавив следующую строку в конец файла 'app.py':' app = App # для обратной совместимости'. – 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.

Таким образом, их невозможно смешивать.

Смежные вопросы