导入功能-模块时的错误消息

时间:2018-09-20 21:32:15

标签: python tkinter module attributes

我正在构建一个计算器,我正在按按钮并在屏幕上显示该值。为此,我创建了两个不同的.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 。你知道发生了什么吗?它们都在同一个文件夹中

非常感谢您,如果我的英语不太清楚,我深表歉意。

2 个答案:

答案 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')相似的变量和函数名称。