五笔打字通主页
这篇文章要先讲一个导入模块的问题,因为有不少的朋友都搞不清楚,如何导入模块,或者无法搞清楚导入模块方法不同的区别。
下一篇文章,我还开始讲解ttk组件了,这需要再导入另外一个模块,所以,这个时候我来讲一下导入模块的问题,以及各种导入方式的区别很有必要。
我们在编写tkinter程序时,首先就写:from tkinter import * 那么,这个tkinter模块到底在哪个位置呢?我们以前编程曾经导入的random, messagebox模块又在哪个位置呢?
我来帮大家找到它。
首先,大家要先找到你电脑里python的安装目录。
你在你的电脑桌面,任务栏,或开始菜单里找到pyhton图标 ,鼠标右键点这个图标,再点属性或相关菜单,找到文件的位置,就找到了python的安装目录。
在python的安装目录下,有一个文件夹叫Lib,进入这个目录,你会发现,你想找到的模块很多都在这里,如模块tkinter,这个Lib文件夹里对应就有一个文件夹叫tkinter,这个tkinter文件夹里,有你以前用过,或听过的模块在里面: messagebox.py font.py colorchooser.py ttk.py .......
我的python安装在C:\Python39\
我打开python安装目录文件夹下的Lib子文件夹图示如下: 丶丌皛
再打开tkinter子文件夹,有我们比较熟悉的模块文件:
好了,进入这个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()
运行结果:
说明:当导入包里,__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()
运行结果:
由于上面的代码,在导入tkinter,ttk都使用通配符,那后面导入ttk的组件类,变量就会覆盖前面导入的tkinter的组件类,变量,正因为这个原因,这2个按钮都是显示ttk风格。
稍大的程序,导入的模块可能有很多个模块,如果都用通配符来导入,方便是方便,但只要后面有相同名称的组件类名,变量名,后面就会覆盖前面的,就会引起不同的麻烦及错误,可能你还找不到问题所在,所以,稍小的程序,用通配符*没有问题,稍大的程序,导入太多的模块,就不要用通配符*了。
大家根据实际情况,决定用什么方式导入模块。
我接下来的文章会讲解ttk知识,由于我的程序一般短小,也没有导入别的什么模块,不太担心由于组件名,变量名重名而出现问题,于是,我就用:
from tkinter import * from tkinter.ttk import *
这样做,一来,不用写前缀,二来,无论是Button组件,还是后来要讲解的新组件,都是ttk风格,在风格上是统一。
如果你想区分tkinter, ttk组件,只要不用通配符,这样,只要写了前缀,就可以区分是是引用由哪一个包的哪一个模块。
此文章来自:wb98.com 网站还有相关的系列课程文章,感兴趣的可以前往。
下一篇文章,我来讲解ttk基础知识
来源:济亨网
本文链接:http://wb86.com/post/334.html