使用 tkinter 创建二维码
create a qrcode using tkinter
我试图在 python 中使用 tkinter 创建一个 QRcode 生成应用程序,你输入颜色,然后输入文本,它会生成一个 QRcode,但它会在启动时立即关闭。 (当我没有颜色部分时,问题没有发生),(以后我也打算添加一个保存二维码为png按钮)
这是我的:
from tkinter import *
from tkinter import messagebox
import pyqrcode
from tkinter import colorchooser
import re
def choose_color():
x = 0
# variable to store hexadecimal code of color
color_code = colorchooser.askcolor(title ="Choose color")
print(color_code)
x = 1
root = Tk()
button = Button(root, text = "Select color",
command = choose_color)
button.pack()
if 'x' == 1:
str = 'color_code' # Your Hex
match = re.search(r'^#(?:[0-9a-fA-F]{3}){1,2}$', str)
if match:
print('Hex is valid')
ws = Tk()
ws.title("PythonGuides")
ws.config(bg='color_code')
def generate_QR():
if len(user_input.get())!=0 :
global qr,img
qr = pyqrcode.create(user_input.get())
img = BitmapImage(data = qr.xbm(scale=8))
else:
messagebox.showwarning('warning', 'All Fields are Required!')
try:
display_code()
except:
pass
def display_code():
img_lbl.config(image = img)
output.config(text="QR code of " + user_input.get())
lbl = Label(
ws,
text="Enter message or URL",
bg='color_code'
)
lbl.pack()
user_input = StringVar()
entry = Entry(
ws,
textvariable = user_input
)
entry.pack(padx=10)
button = Button(
ws,
text = "generate_QR",
width=15,
command = generate_QR
)
button.pack(pady=10)
img_lbl = Label(
ws,
bg='color_code')
img_lbl.pack()
output = Label(
ws,
text="",
bg='color_code'
)
output.pack()
ws.mainloop()
else:
print('Hex is not valid')
程序立即关闭的原因是没有root.mainloop()
。即使有,也有很多其他错误会阻止程序运行。
第一个问题是if 'x' == 1
。在这里,您将文字字符串“x”与数字 1 进行比较。它们永远不会相等,因此另一个 window 永远不会出现。我可以看到你想用 x
做什么,但它不会像你期望的那样工作。最好完全摆脱 x
并在用户选择颜色后调用函数。我将此函数称为 show_qr_window
.
第二个问题是如何获得十六进制代码。您使用 colorchooser.askcolor
的输出,它是一个元组,其中包含一个代表颜色的 rgb 元组及其十六进制值。你只想要十六进制值,所以你想要 color_code[1]
,因为十六进制值是第二项。我还添加了 if
语句以确保 color_code
不是 None。如果用户不选择颜色而只是关闭 window,color_code
将是 None。如果用户选择了一种颜色,它会被传递给 show_qr_window
。因为我们已经检查过用户选择了一种颜色,所以您可以去掉所有其他验证,因为 colorchooser
总是 return 一个有效的十六进制值。您也不再需要导入 re
.
第三个问题是您使用了 Tk
两次。这将导致您的程序无法正常运行。而是把ws = Tk()
改为ws = Toplevel()
。
下一期是str = 'color_code'
。这不是您定义变量的方式。你想做 color_code = 'a string'
。在这种情况下,字符串作为变量 color
传递给 show_qr_window
,因此您可以使用 color_code = color
。您还必须将所有 bg = 'color_code'
更改为 bg = color_code
,因为 color_code
是一个变量,而不是字符串。
您的其余代码似乎有效(我没有测试二维码生成,因为我没有安装该模块)。这是包含所有修复的代码:
from tkinter import *
from tkinter import messagebox
import pyqrcode
from tkinter import colorchooser
def choose_color():
# variable to store hexadecimal code of color
color_code = colorchooser.askcolor(title ="Choose color")
if color_code != None:
show_qr_window(color_code[1])
root = Tk()
button = Button(root, text = "Select color",
command = choose_color)
button.pack()
root.mainloop()
def show_qr_window(color):
ws = Toplevel()
color_code = color
ws.config(bg = color_code)
def generate_QR():
if len(user_input.get())!=0 :
global qr,img
qr = pyqrcode.create(user_input.get())
img = BitmapImage(data = qr.xbm(scale=8))
else:
messagebox.showwarning('warning', 'All Fields are Required!')
try:
display_code()
except:
pass
def display_code():
global img
img_lbl.config(image = img)
output.config(text="QR code of " + user_input.get())
lbl = Label(
ws,
text="Enter message or URL",
bg=color_code
)
lbl.pack()
user_input = StringVar()
entry = Entry(
ws,
textvariable = user_input
)
entry.pack(padx=10)
button = Button(
ws,
text = "generate_QR",
width=15,
command = generate_QR
)
button.pack(pady=10)
img_lbl = Label(
ws,
bg=color_code)
img_lbl.pack()
output = Label(
ws,
text="",
bg=color_code
)
output.pack()
ws.mainloop()
假设 generate_QR()
和 display_code()
正常工作(我没有测试过它们,但它们看起来不错),此代码将 运行 符合预期。
我试图在 python 中使用 tkinter 创建一个 QRcode 生成应用程序,你输入颜色,然后输入文本,它会生成一个 QRcode,但它会在启动时立即关闭。 (当我没有颜色部分时,问题没有发生),(以后我也打算添加一个保存二维码为png按钮) 这是我的:
from tkinter import *
from tkinter import messagebox
import pyqrcode
from tkinter import colorchooser
import re
def choose_color():
x = 0
# variable to store hexadecimal code of color
color_code = colorchooser.askcolor(title ="Choose color")
print(color_code)
x = 1
root = Tk()
button = Button(root, text = "Select color",
command = choose_color)
button.pack()
if 'x' == 1:
str = 'color_code' # Your Hex
match = re.search(r'^#(?:[0-9a-fA-F]{3}){1,2}$', str)
if match:
print('Hex is valid')
ws = Tk()
ws.title("PythonGuides")
ws.config(bg='color_code')
def generate_QR():
if len(user_input.get())!=0 :
global qr,img
qr = pyqrcode.create(user_input.get())
img = BitmapImage(data = qr.xbm(scale=8))
else:
messagebox.showwarning('warning', 'All Fields are Required!')
try:
display_code()
except:
pass
def display_code():
img_lbl.config(image = img)
output.config(text="QR code of " + user_input.get())
lbl = Label(
ws,
text="Enter message or URL",
bg='color_code'
)
lbl.pack()
user_input = StringVar()
entry = Entry(
ws,
textvariable = user_input
)
entry.pack(padx=10)
button = Button(
ws,
text = "generate_QR",
width=15,
command = generate_QR
)
button.pack(pady=10)
img_lbl = Label(
ws,
bg='color_code')
img_lbl.pack()
output = Label(
ws,
text="",
bg='color_code'
)
output.pack()
ws.mainloop()
else:
print('Hex is not valid')
程序立即关闭的原因是没有root.mainloop()
。即使有,也有很多其他错误会阻止程序运行。
第一个问题是if 'x' == 1
。在这里,您将文字字符串“x”与数字 1 进行比较。它们永远不会相等,因此另一个 window 永远不会出现。我可以看到你想用 x
做什么,但它不会像你期望的那样工作。最好完全摆脱 x
并在用户选择颜色后调用函数。我将此函数称为 show_qr_window
.
第二个问题是如何获得十六进制代码。您使用 colorchooser.askcolor
的输出,它是一个元组,其中包含一个代表颜色的 rgb 元组及其十六进制值。你只想要十六进制值,所以你想要 color_code[1]
,因为十六进制值是第二项。我还添加了 if
语句以确保 color_code
不是 None。如果用户不选择颜色而只是关闭 window,color_code
将是 None。如果用户选择了一种颜色,它会被传递给 show_qr_window
。因为我们已经检查过用户选择了一种颜色,所以您可以去掉所有其他验证,因为 colorchooser
总是 return 一个有效的十六进制值。您也不再需要导入 re
.
第三个问题是您使用了 Tk
两次。这将导致您的程序无法正常运行。而是把ws = Tk()
改为ws = Toplevel()
。
下一期是str = 'color_code'
。这不是您定义变量的方式。你想做 color_code = 'a string'
。在这种情况下,字符串作为变量 color
传递给 show_qr_window
,因此您可以使用 color_code = color
。您还必须将所有 bg = 'color_code'
更改为 bg = color_code
,因为 color_code
是一个变量,而不是字符串。
您的其余代码似乎有效(我没有测试二维码生成,因为我没有安装该模块)。这是包含所有修复的代码:
from tkinter import *
from tkinter import messagebox
import pyqrcode
from tkinter import colorchooser
def choose_color():
# variable to store hexadecimal code of color
color_code = colorchooser.askcolor(title ="Choose color")
if color_code != None:
show_qr_window(color_code[1])
root = Tk()
button = Button(root, text = "Select color",
command = choose_color)
button.pack()
root.mainloop()
def show_qr_window(color):
ws = Toplevel()
color_code = color
ws.config(bg = color_code)
def generate_QR():
if len(user_input.get())!=0 :
global qr,img
qr = pyqrcode.create(user_input.get())
img = BitmapImage(data = qr.xbm(scale=8))
else:
messagebox.showwarning('warning', 'All Fields are Required!')
try:
display_code()
except:
pass
def display_code():
global img
img_lbl.config(image = img)
output.config(text="QR code of " + user_input.get())
lbl = Label(
ws,
text="Enter message or URL",
bg=color_code
)
lbl.pack()
user_input = StringVar()
entry = Entry(
ws,
textvariable = user_input
)
entry.pack(padx=10)
button = Button(
ws,
text = "generate_QR",
width=15,
command = generate_QR
)
button.pack(pady=10)
img_lbl = Label(
ws,
bg=color_code)
img_lbl.pack()
output = Label(
ws,
text="",
bg=color_code
)
output.pack()
ws.mainloop()
假设 generate_QR()
和 display_code()
正常工作(我没有测试过它们,但它们看起来不错),此代码将 运行 符合预期。