11

一、所有相关代码

主文件

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]})

应用程序.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

静态键.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
4

4 回答 4

29

您有一个名为的模块app,其中包含一个名为 的类app。如果您只是import app在 main.py 中执行,app则将引用该模块,app.app并将引用该类。这里有几个选项:

  • 不理会你的 import 语句,并myApp = app.app({"testFKey":[3,2,2]})在 main.py 中使用
  • 替换import appfrom app import app,现在app将引用该类并且myApp = app({"testFKey":[3,2,2]})可以正常工作
于 2013-08-06T00:02:25.560 回答
9

main.py将第二行更改为:

from app import app

问题是你里面有app模块和app类。但是您正在导入模块,而不是其中的类:

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

(您也可以将上面的“”替换app为“ app.app”)

于 2013-08-06T00:01:57.370 回答
2

正如 FJ 和 Tadeck 已经解释的那样,问题在于app模块app,并且是该模块中定义app.app的类。app

您可以通过使用from app import app(或者,如果必须,甚至from app import *)来解决这个问题,如 Tadeck 的回答,或者通过明确引用app.app而不是只是app,如 FJ 的回答。

如果您将类重命名为App,那不会神奇地解决任何问题——您仍然必须要么from app import App或引用app.App- 但它会使问题更加明显。并且在你解决了问题之后让你的代码不那么混乱。

这是PEP 8建议的部分原因:

模块应该有简短的全小写名称。

…</p>

几乎无一例外,类名都使用 CapWords 约定。

这样一来,就没有办法把它们混在一起了。

于 2013-08-06T01:53:00.307 回答
0

解决此问题的最佳方法是:转到 Gradle build(Madulus) 并在 下方buildTypes,键入以下代码并同步项目。

viewBinding {
    enabled = true
}

现在您可以访问绑定。如果xml布局是activity_main.xml,则表示绑定是ActivityMainBinding

于 2021-09-24T20:43:57.683 回答