Pourquoi suis-je 'module' objet n'est pas appelable en python 3?
D'abord, tous les code
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')
Maintenant pour une description du problème. Quand je lance main.py
en python3, j'obtiens l'erreur
File "Desktop/kblMaker/main.py", line 13, in <module>
myApp =app({"testFKey":[3,2,2]})
TypeError: 'module' object is not callable
Que, de votre côté de la question, utilisez le code de mise en forme pour les erreurs/de sortie.
Le traceback tu nous ne pouvons pas être dans le code tu nous. Et il ne correspond pas à l'erreur que vous mentionnez dans la question du titre. Donc... merci de nous donner un code, de rétro, et une description qui correspond au lieu de nous faire deviner.
édité aucune idée de tout qui s'est passé
Le traceback tu nous ne pouvons pas être dans le code tu nous. Et il ne correspond pas à l'erreur que vous mentionnez dans la question du titre. Donc... merci de nous donner un code, de rétro, et une description qui correspond au lieu de nous faire deviner.
édité aucune idée de tout qui s'est passé
OriginalL'auteur fozbstuios | 2013-08-05
Vous devez vous connecter pour publier un commentaire.
Vous avez un module nommé
app
qui contient une classe nomméeapp
. Si vous venez de le faireimport app
dans main.py puisapp
permettra de vous référer au module, etapp.app
fera référence à la classe. Voici quelques options:myApp = app.app({"testFKey":[3,2,2]})
à l'intérieur de main.pyimport app
avecfrom app import app
, maintenantapp
fera référence à la classe etmyApp = app({"testFKey":[3,2,2]})
sera beau travailOu, mieux, le nom de la classe
App
au lieu deapp
pour éviter cette confusion entièrement (et pour être PEP8 conforme, pour les points de bonus).Upvote pour la suggestion de suivre PEP8 et le renommer pour éviter toute confusion. Je suppose qu'il n'y est code à l'aide de ce module, afin de changer la dénomination serait introduire les questions. Mais cela peut être simplement fixé en ajoutant la ligne suivante à la fin de
app.py
fichier:app = App # for backward compatibility
.si vous postez une réponse, je vais vous donner les points
Je pense que F. J réponse déjà dit tout ce qui doit être dit, et le commentaire a été suffisante pour couvrir la désignation de la confusion... mais puisque vous l'avez demandé, j'ai ajouté une réponse.
OriginalL'auteur Andrew Clark
Dans
main.py
modifier la deuxième ligne:Le problème est que vous avez
app
module etapp
classe à l'intérieur. Mais vous êtes module d'importation, et non pas la classe:(vous pouvez également, au lieu de remplacer "
app
" à l'intérieur de la ligne ci-dessus dans "app.app
")OriginalL'auteur Tadeck
Le problème, à la fois comme F. J et Tadeck déjà expliqué, est que
app
est le moduleapp
, etapp.app
est la classeapp
définies dans ce module.Vous pouvez le contourner en utilisant
from app import app
(ou, si vous devez, mêmefrom app import *
), comme dans Tadeck réponse, ou en se référant expressément auxapp.app
au lieu de simplementapp
, comme dans F. J réponse.Si vous renommez la classe
App
, ce n'est pas comme par magie fixer quoi que ce soit—que vous aurez encore à soitfrom app import App
ou reportez-vous àapp.App
—mais c'est le problème d'un ensemble beaucoup plus évident. Et de rendre votre code plus clair. après que vous avez fixé le problème, trop.C'est en partie la raison que PEP 8 recommande que:
De cette façon, il n'y a aucun moyen de les mélanger.
OriginalL'auteur abarnert