tkinter - 我不能在程序函数中使用变量
问题描述
有一个带有 GUI 的程序,代码是在 PyCharm 中用 python 3.7 编写的。 问题:您不能在函数 encrypt() 和 create_mask() 中使用变量 degree。我会让鉴赏家更容易提供帮助,因为我自己的 python 编程为零。我将非常感谢您的帮助。 程序代码:
import os
from tkinter import
from tkinter import filedialog as fd
from tkinter import messagebox as mb
global degree1
def variable():
l = encrypt_st.get()
if I == 1:
degree1 = 1
elif I == 2:
degree1 = 2
elif I == 3:
degree1 = 4
elif I == 4:
degree1 = 8
return degree1
def encrypt(degree1):
f = fd.askopenfilename(title="Select text file")
text = open(f, 'r')
d = fd.askopenfilename(title="Select stegocontainer")
start_bmp = open(d, 'rb')
encode_bmp = open('encode_bmp', 'wb')
text_len = os.stat(f).st_size
img_len = os.stat(d).st_size
if text_len >= (img_len * degree1 / 8) - 54:
mb.showerror("It is not possible to hide the data select a larger container")
return
first54 = start_bmp.read(54)
# print(first54) # show the first 54 bytes
encode_bmp.write(first54)
text_mask, img_mask = create_masks(degree1)
while True:
symbol = text.read(1)
if not symbol:
mb.showerror("Can't read the file")
break
symbol = ord(symbol)
for byte_amount in range (0, 8, degree):
img_byte = int.from_bytes(start_bmp.read(1), sys.byteorder) & img_mask
bits = symbol & text_mask
bits >> 8-degree
img_byte |= bits
encode_bmp.write(img_byte.to_bytes(1, sys.byteorder))
symbol <<= degree
def decrypt():
pass
def create_masks(degree1):
text_mask = 0b1111111111[enter image description here][1]
img_mask = 0b1111111111
text_mask <<= (8 - degree1)
text_mask %=256
img_mask >>= degree1
img_mask <<= degree1
return text_mask, img_mask
root = Tk()
root.title
root.geometry("400x90")
button1 = Button(text = "Hide data", command=encrypt)
button1.place(x=1, y=1)
lab1 = Label(text="Select degree of coding:")
encrypt_st = IntVar()
encrypt_st.set(0)
var1 = Radiobutton(text="1", value=1, variable=encrypt_st, command=encrypt)
var2 = Radiobutton(text="2", value=2, variable=encrypt_st, command=encrypt)
var3 = Radiobutton(text="4", value=3, variable=encrypt_st, command=encrypt)
var4 = Radiobutton(text="8", value=4, variable=encrypt_st, command=encrypt)
lab1.place(x=100, y=1)
var1.place(x=100, y=20)
var2.place(x=135, y=20)
var3.place(x=170, y=20)
var4.place(x=205, y=20)
root.mainloop()
错误代码:文件“C:\Users\1\AppData\Local\Programs\Python\Python38-32\lib\tkinter__init__.py”,第 1883 行,在call_ return self.func(*args) TypeError: encrypt() missing 1 个必需的位置参数:'degree1'
使用 www.DeepL.com/Translator 翻译(免费版)
解决方案
两件事情:
在全局范围内使用
global
没有效果。您应该将变量声明为global
在内部范围内,如函数或类定义。要解决此问题,您应该添加global degree1
到任何使用您的degree1
变量的函数。作为旁注,使用global
有点不受欢迎,因为有更好的方法来实现“共享”变量的效果。最常见的方法是使用类方法。tkinter
不提供一种开箱即用的方式将参数传递给事件的命令。但是,我可以想出两种方法来解决这个问题。第一个(可能也是最常用的)是使用lambda
返回函数句柄的 a 。这是由
var1 = Radiobutton(text="1",
value=1,
variable=encrypt_st,
command=lambda: encrypt(degree1))
另一种方法是使用部分函数,您可以在使用functools
库时创建它。
from functools import partial
partial_encrypt = partial(encrypt, degree1)
# partial_encrypt is now a partial object which will call
# encrypt(degree1) when called. We can pass this as a command
# to your tkinter widget.
var1 = Radiobutton(text="1",
value=1,
variable=encrypt_st,
command=partial_encrypt)