我正在构建一个计算器,我正在按按钮并在屏幕上显示该值。为此,我创建了两个不同的.py文件(我想使用模块)。按照您的要求,我将使用最简单的代码来更新帖子,以重现该问题。这是计算器的布局:
any
这是我正在使用的模块
from tkinter import *
from screenvalue import value
root=Tk()
frame=Frame(root) #frame for the buttons and other options
frame.config(background="#40798C")
frame.pack()
#------------------------ SCREEN ----------------------
screen=Text(frame, width=150, height=5)
screen.grid(row=1, column=1, padx=5, pady=5, columnspan=15)
screen.config(background="#E2E2E2", fg="black")
#--------button---------------------------------
button4=Button(frame, text="4", width=10, padx=0, pady=0, command=value)
button4.grid(row=4,column=11)
root.mainloop()
我将模块的名称从 typing.py 更改为 screenvalue.py 。你知道发生了什么吗?它们都在同一个文件夹中
非常感谢您,如果我的英语不太清楚,我深表歉意。
答案 0 :(得分:2)
Tkinter是一个多层的东西。尽管您是从Python使用它,但实际上它使用另一种语言Tcl来管理GUI。
您收到该错误消息
AttributeError: 'NoneType' object has no attribute '_root'
因为您要在启动Tcl解释器之前尝试创建Tkinter对象,这在您执行root=Tk()
时会发生。
所以您需要重新组织代码,以便
character = StringVar()
在执行root=Tk()
之前,不会执行。
导入character = StringVar()
时将执行screenvalue
。您可以将导入语句移动到root=Tk()
之后,但是最好更改screenvalue
,以便在导入时不运行代码。
FWIW,character.set("4")
返回None
,因此让函数返回该值没有多大意义。另外,回调函数没有返回有效值的意义,因为您无法访问回调返回的值。
答案 1 :(得分:0)
您在第二个文件中创建并导入的character = StringVar()
函数范围之外定义了type
。
在命令from typing import type
中,您仅导入具有其作用域的type
函数,并且未定义character
,这会导致您得到错误。
如果将character = StringVar()
移到该函数的作用域中,它将解决您的问题。
def type():
character = StringVar()
return character.set("4")
P.S强烈建议不要使用与python内置名称(例如'type')相似的变量和函数名称。