问题
First, all relevant 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')
Now for a description of the problem. When I run main.py in python3, I get the error
File "Desktop/kblMaker/main.py", line 13, in <module>
myApp =app({"testFKey":[3,2,2]})
TypeError: 'module' object is not callable
回答1:
You have a module named app that contains a class named app. If you just do import app in main.py then app will refer to the module, and app.app will refer to the class. Here are a couple of options:
- Leave your import statement alone, and use
myApp = app.app({"testFKey":[3,2,2]})inside of main.py - Replace
import appwithfrom app import app, nowappwill refer to the class andmyApp = app({"testFKey":[3,2,2]})will work fine
回答2:
In main.py change second line to:
from app import app
The issue is you have app module and app class within it. But you are importing module, not the class from it:
myApp = app({"testFKey": [3, 2, 2]})
(you can also instead replace "app" inside line above into "app.app")
回答3:
The problem, as both F.J and Tadeck already explained, is that app is the module app, and app.app is the class app defined in that module.
You can get around that by using from app import app (or, if you must, even from app import *), as in Tadeck's answer, or by explicitly referring to app.app instead of just app, as in F.J's answer.
If you rename the class to App, that won't magically fix anything—you will still have to either from app import App or refer to app.App—but it will make the problem a whole lot more obvious. And make your code less confusing after you've fixed the problem, too.
This is part of the reason that PEP 8 recommends that:
Modules should have short, all-lowercase names.
…
Almost without exception, class names use the CapWords convention.
That way, there's no way to mix them up.
来源:https://stackoverflow.com/questions/18069716/why-am-i-getting-module-object-is-not-callable-in-python-3