Tkinter 我不能在程序函数中使用变量

Tkinter 我不能在程序函数中使用变量,tkinter,Tkinter,有一个带有GUI的程序,代码是用PyCharm中的python 3.7编写的。 问题:不能在函数encrypt和create_mask中使用变量degree。 我会让鉴赏家们很容易帮上忙,因为我自己在python编程方面一无所获。 我将非常感谢你的帮助。 程序代码: 错误代码: 文件C:\Users\1\AppData\Local\Programs\Python38-32\lib\tkinter\uuuu init\uuuuuu.py,第1883行,在调用中_ 返回self.func*参数 Ty

有一个带有GUI的程序,代码是用PyCharm中的python 3.7编写的。 问题:不能在函数encrypt和create_mask中使用变量degree。 我会让鉴赏家们很容易帮上忙,因为我自己在python编程方面一无所获。 我将非常感谢你的帮助。 程序代码:

错误代码: 文件C:\Users\1\AppData\Local\Programs\Python38-32\lib\tkinter\uuuu init\uuuuuu.py,第1883行,在调用中_ 返回self.func*参数 TypeError:加密缺少1个必需的位置参数:“degree1”

使用www.DeepL.com/Translator-free-version翻译两件事:

在全局范围内使用global无效。当变量位于内部作用域(如函数或类定义)内时,应将其声明为全局变量。要解决此问题,应将全局degree1添加到使用degree1变量的任何函数中。作为旁注,使用global有点不受欢迎,因为有更好的方法来实现共享变量的效果。最常见的方法是使用类方法

tkinter不提供一种开箱即用的方式将参数传递给事件上的命令。然而,我可以想出两种方法来解决这个问题。第一种可能也是最常用的方法是使用lambda,它返回函数的句柄。这是由

var1=Radiobuttontext=1, 值=1, 变量=加密\u st, 命令=lambda:encryptdegree1 另一种方法是使用分部函数,可以在使用库时创建分部函数

从functools导入部分 部分加密=部分加密,degree1 partial_encrypt现在是一个将调用 调用时加密1。我们可以将其作为命令传递 到您的tkinter小部件。 var1=Radiobuttontext=1, 值=1, 变量=加密\u st, 命令=部分加密 本网站仅提供英文版本。=>
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()