首页 > 技术文章 > 在使用三引号时容易犯的小错误

hyyx 2020-08-12 18:57 原文

请看如下代码,执行后,思考生成的两个二维码为什么不一样?

 1 # -*- coding:utf-8 -*-
 2 from tkinter import *
 3 from tkinter import ttk
 4 from PIL import ImageTk
 5 import qrcode
 6 class QRcodeImage(object):
 7     '''生成二维码图片类'''
 8 
 9     def __init__(self, content, fcolor=None, bcolor=None, size=None):
10         '''
11         参数说明:
12         content:二维码图片的文本内容
13         fcolor:二维码图片的前景色
14         bcolor:二维码图片的背景色
15         size:二维码大小
16         '''
17         qr = qrcode.QRCode(version=2,
18                            error_correction=qrcode.constants.ERROR_CORRECT_L, #容错率
19                            box_size=8,
20                            border=2)  # 实例化QRCode类,得到qr对象
21         qr.add_data(content)  # 二维码内容添加到图片中
22         qr.make(fit=True)  # 图片中的二维码大小自适应,以保证二维码内容能完整绘制
23         if fcolor == None: fcolor = 'black' #默认前景色为黑色
24         if bcolor == None:bcolor = 'white' #默认背景色为白色
25         img = qr.make_image(fill_color=fcolor,
26                             back_color=bcolor)  #生成彩色二维码图片
27         img = img.convert(mode="RGBA")  # 将图片的模式转换为彩色透明模式
28         if size == None: size = 150 #默认图片大小
29         self.img = img.resize((size, size))
30 
31     def getPhotoImage(self):
32         '''转换为PhotoImage'''
33         tkimg = ImageTk.PhotoImage(self.img)
34         return tkimg
35 def cvfill():
36     cv.create_window(200, 50, window=lbimg1, width=155, height=155,
37                      anchor=NW,
38                      )
39     cv.create_window(50, 50, window=lbimg2, width=155, height=155,
40                  anchor=NW,
41                  )
42     global img1
43     img1 = QRcodeImage(content).getPhotoImage()
44     lbimg1.config(image=img1)
45     content1='''BEGIN:VCARD
46     FN:steven
47     TITLE:Drector
48     TEL;TYPE=CELL:15201011234
49     NOTE:
50     END:VCARD '''   
51     global img2 
52     img2=QRcodeImage(content1).getPhotoImage()
53     lbimg2.config(image=img2)
54 root = Tk()
55 
56 
57 cv = Canvas(root, width='94m', height='54m', bg='#F0F8FF',
58         highlightbackground='gold',
59         highlightthickness=2,
60         )
61 cv.pack(pady=10)
62 
63 lbimg1 = Label()
64 lbimg2 = Label()
65 content='''BEGIN:VCARD
66 FN:steven
67 TITLE:Drector
68 TEL;TYPE=CELL:15201011234
69 NOTE:
70 END:VCARD '''
71 cvfill()
72 mainloop()

执行上述代码,结果如下图所示:

明显两个二维码图片不同,而出现这样的差异的原因就出现在全局变量content和局部变量content1的赋值上。

content的赋值后的结果为:

content = BEGIN:VCARD\nFN:steven\nTITLE:Drector\nTEL;TYPE=CELL:15201011234\nNOTE:\nEND:VCARD 

 而content1的赋值后的结果为:

content1 = BEGIN:VCARD\n    FN:steven\n    TITLE:Drector\n    TEL;TYPE=CELL:15201011234\n    NOTE:\n    END:VCARD 

明显content和content1的值的内容不一样,content1多了很多空格字符。造成这样结果的原因就是因为在函数cvfill()中,三引号'''中的内容从第二行开始进行了缩进,导致增加了很多缩进的空格,这是很容易犯的一个小错误,并且不易被注意到。

 

推荐阅读