当前位置:首页 » tkinter » 正文

模块导入方法import的不同方式的区别

这篇文章要先讲一个导入模块的问题,因为有不少的朋友都搞不清楚,如何导入模块,或者无法搞清楚导入模块方法不同的区别。

下一篇文章,我还开始讲解ttk组件了,这需要再导入另外一个模块,所以,这个时候我来讲一下导入模块的问题,以及各种导入方式的区别很有必要。

 

我们在编写tkinter程序时,首先就写:from tkinter import *  那么,这个tkinter模块到底在哪个位置呢?我们以前编程曾经导入的random,  messagebox模块又在哪个位置呢?

我来帮大家找到它。

 

首先,大家要先找到你电脑里python的安装目录。

你在你的电脑桌面,任务栏,或开始菜单里找到pyhton图标  2.PNG鼠标右键点这个图标,再点属性或相关菜单,找到文件的位置,就找到了python的安装目录。

在python的安装目录下,有一个文件夹叫Lib,进入这个目录,你会发现,你想找到的模块很多都在这里,如模块tkinter,这个Lib文件夹里对应就有一个文件夹叫tkinter,这个tkinter文件夹里,有你以前用过,或听过的模块在里面: messagebox.py   font.py  colorchooser.py  ttk.py .......

我的python安装在C:\Python39\

我打开python安装目录文件夹下的Lib子文件夹图示如下:    丶丌皛

1.PNG 

 再打开tkinter子文件夹,有我们比较熟悉的模块文件:

3.PNG

 

好了,进入这个tkinter文件夹,看看里面的文件,有__init__.py  ttk.py 等文件,好,现在我来讲模块,导入方式等问题了。

 

1.  tkinter是一个文件夹,由于文件夹有__init__.py 这个文件,在python知识中,把这个有__init__.py的文件夹叫“包”

 

2.  当我们导入包时,__init__.py就会自动执行,__init__.py也是一个模块文件,模块名就是对应的包名。

 

3.  我们在前面写代码时,开始就会写:  from tkinter import * 这是导入方式之一,当导入tkinter这个包时,__init__.py已经自动自动执行了。

 

下面我们讲一下从包里导入模块的方法,一般有3种方式:

tkinter这个包里,有ttk这个模块,现在我先假定ttk这个模块有abc这个变量。

 

1>  import 包名.模块名

  如:import  tkinter.ttk

  要调用abc变量时,要加包和模块的前缀: print( tkinter.ttk.abc )

 

2>  from  包名  import  模块名

  如:from  tkinter  import  ttk

  要调用abc变量时,加前缀不用包的前缀: print( ttk.abc )

 

3>  from 包名.模块名 import 定义名

  如 from  tkinter.ttk  import  abc

要调用abc变量时,不用加前缀: print( abc )

 

有些前缀太长,或前缀不太好记,我们可以另取名称:

 

我们可以在导入模块的时候,为包改名,因为有时候,有些包名太长,码字太累,而有些包名,你认为取得并不好,我们想为它改一个更好的名字。

1>  import 包名.模块名 as  改的包名

   如:import  tkinter.ttk  as  t1

   要调用abc变量时,要加包和模块的前缀: print( t1.abc )

 

2>  from  包名  import  模块名 as  改的包名

   如:from  tkinter  import  ttk  as  t2

   要调用abc变量时,加前缀不用包的前缀: print( t2.abc )

 

通配符:

3>  from 包名.模块名 import 定义名

   如 from  tkinter.ttk  import  abc

要调用abc变量时,不用加前缀: print( abc )

如果要调用这个模块内的另外一个变量名cde ,怎么办,没有办法,因为你只是导入了abc这个变量,并没有导入cde这个变量。如果你想模块内的组件类,变量等都一次导入,又不想写前缀,那么可以用通配符 *  如:

from  tkinter.ttk  import  *

 

下面以实例来检测上面说的导入方式: 

在tkinter包里,有ttk这个模块,这个模块的也有按钮Button组件,但ttk模块里的按钮组件可以跟系统主题有一样的外观,而之前的tkinter模块里的按钮Button组件只有灰色经典的外观,显得有点土。

 

下面以实例,来检测以上的导入方式:

第1种方式:

# import tkinter.__init__
import tkinter
import tkinter.ttk
 
root=tkinter.Tk()
 
but1=tkinter.Button(root,text="  测 试 按 钮 1 ")
but1.pack(padx=50,pady=10)
 
but2=tkinter.ttk.Button(root,text="  测 试 按 钮 2 ")
but2.pack(padx=50,pady=10)
 
root.mainloop()

运行结果:

4.PNG

说明:当导入包里,__init__.py就会自动执行,所以 import tkinter 就行,不用写成 import tkinter.__init__ (但这样写,也一样可以)

 

第1种方式,包改名:

import tkinter as AAA  # tkinter另取名:AAA
import tkinter.ttk as BBB # tkinter.ttk另取名:BBB
 
root=AAA.Tk()
 
but1=AAA.Button(root,text="  测 试 按 钮 1 "
but1.pack(padx=50,pady=10)
 
but2=BBB.Button(root,text="  测 试 按 钮 2 ")
but2.pack(padx=50,pady=10)
 
root.mainloop()

运行结果跟上面的完全一样。

  

第2种导入方式导入ttk:

import tkinter
from tkinter import ttk
 
root=tkinter.Tk()
 
but1=tkinter.Button(root,text="  测 试 按 钮 1 ")
but1.pack(padx=50,pady=10)
 
but2=ttk.Button(root,text="  测 试 按 钮 2 ")
but2.pack(padx=50,pady=10)
 
root.mainloop()

运行结果跟上面的一样。

 

 第2种导入方式导入ttk并改包名:

import tkinter
from tkinter import ttk as CCC # ttk另取名:CCC
 
root=tkinter.Tk()
 
but1=tkinter.Button(root,text="  测 试 按 钮 1 ")
but1.pack(padx=50,pady=10)
 
but2=CCC.Button(root,text="  测 试 按 钮 2 ")
but2.pack(padx=50,pady=10)
 
root.mainloop()

运行结果跟上面的一样。

  

第3种导入模块方式:

import tkinter
from tkinter.ttk import Button # ttk模块只导入Button类
 
root=tkinter.Tk()
 
but1=tkinter.Button(root,text="  测 试 按 钮 1 ")
but1.pack(padx=50,pady=10)
 
but2=Button(root,text="  测 试 按 钮 2 ")
but2.pack(padx=50,pady=10)
 
root.mainloop()

运行结果跟上面一样。


但上面这个代码,由于ttk模块只导入Button类,所以你想创建个ttk风格标签或别的组件就不行了,因为你并没有导入标签类和别的组件类,如果你一方面想在输入代码时轻松些,不加前缀,另一方面也想随时创建其它的组件,那么可以用通配符*

import tkinter
from tkinter.ttk import * # 用通配符导入所有组件类,变量等
 
root=tkinter.Tk()
 
but1=tkinter.Button(root,text="  测 试 按 钮 1 ")
but1.pack(padx=50,pady=10)
 
but2=Button(root,text="  测 试 按 钮 2 ")
but2.pack(padx=50,pady=10)
 
root.mainloop() # 源码来自  wb86.com

以上代码,就可以自由创建各种ttk风格的组件了。

看上去用通配符很是方便呀,我之前的讲解用的模块导入方式是:

from tkinter import *

用这种方式不用加前缀,也可以自由创建tkinter风格的各种组件,在输入方面的确很方便。但是,但是…… 关键是还有一些方面的问题:

   

看运行下面的代码:

from tkinter import  *
from tkinter.ttk import *
 
root=Tk()
 
but1=Button(root,text="  测 试 按 钮 1 ")
but1.pack(padx=50,pady=10)
 
but2=Button(root,text="  测 试 按 钮 2 ")
but2.pack(padx=50,pady=10)
 
root.mainloop()

运行结果:

5.PNG

由于上面的代码,在导入tkinter,ttk都使用通配符,那后面导入ttk的组件类,变量就会覆盖前面导入的tkinter的组件类,变量,正因为这个原因,这2个按钮都是显示ttk风格。

稍大的程序,导入的模块可能有很多个模块,如果都用通配符来导入,方便是方便,但只要后面有相同名称的组件类名,变量名,后面就会覆盖前面的,就会引起不同的麻烦及错误,可能你还找不到问题所在,所以,稍小的程序,用通配符*没有问题,稍大的程序,导入太多的模块,就不要用通配符*了。

大家根据实际情况,决定用什么方式导入模块。

我接下来的文章会讲解ttk知识,由于我的程序一般短小,也没有导入别的什么模块,不太担心由于组件名,变量名重名而出现问题,于是,我就用:

from tkinter import  *
from tkinter.ttk import *

这样做,一来,不用写前缀,二来,无论是Button组件,还是后来要讲解的新组件,都是ttk风格,在风格上是统一。

 

如果你想区分tkinter, ttk组件,只要不用通配符,这样,只要写了前缀,就可以区分是是引用由哪一个包的哪一个模块。

      此文章来自:wb98.com  网站还有相关的系列课程文章,感兴趣的可以前往。

下一篇文章,我来讲解ttk基础知识


打赏 支付宝打赏 微信打赏

来源:济亨网

本文链接:https://wb98.com/post/334.html

    << 上一篇 下一篇 >>

    湘公网安备 43011102000514号 - 湘ICP备08100508号