首先,所有相关代码
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 :(得分:15)
您有一个名为app
的模块,其中包含一个名为app
的类。如果您只是在main.py中执行import app
,那么app
将引用该模块,app.app
将引用该类。以下是几个选项:
myApp = app.app({"testFKey":[3,2,2]})
import app
替换为from app import app
,现在app
将引用该课程,myApp = app({"testFKey":[3,2,2]})
将正常工作答案 1 :(得分:5)
在main.py
中将第二行更改为:
from app import app
问题是你有app
个模块和app
类。但是你要导入模块,而不是它的类:
myApp = app({"testFKey": [3, 2, 2]})
(您也可以将上面一行中的“app
”替换为“app.app
”)
答案 2 :(得分:1)
正如FJ和Tadeck已经解释的那样,问题是app
是模块app
,而app.app
是该模块中定义的类app
。 / p>
您可以使用from app import app
(或者,如果必须,甚至是from app import *
)来解决这个问题,就像在Tadeck的回答中一样,或明确指代app.app
只有app
,就像F.J的回答一样。
如果您将课程重命名为App
,那就不会神奇地修复任何内容 - 您仍然需要from app import App
或参考app.App
- 但它会使问题更加明显。在你解决问题之后,让你的代码更容易混淆。
这是PEP 8建议:
的部分原因模块应该有简短的全小写名称。
...
几乎无一例外,类名都使用CapWords惯例。
这样,就没有办法把它们搞混了。