"Resetting" 变量的参数

"Resetting" the arguments of a variable

我正在尝试在用户输入无效序列时重置变量 def 序列中的参数。否则我会得到一个 RuntimeError: maximum recursion depth exceeded 错误,因为存储在 def 序列中的参数仍然无效。有什么建议么?我正在考虑将 "self.sequence(None)" 放入 else: 但这似乎只是为 def 序列添加了另一个参数。

from tkinter import *

class AT_content_calculator:

    def __init__(self, master):
        #initialising various widgets
        frame_1 = Frame(master)
        frame_1.pack()

        self.varoutput_1 = StringVar()

        self.label_1 = Label(frame_1, text="Please enter a DNA sequence:")
        self.label_1.pack()
        self.entry_1 = Entry(frame_1, textvariable=self.sequence)
        self.entry_1.pack()
        self.output_1 = Label(frame_1, textvariable=self.varoutput_1)
        self.output_1.pack()
        self.button_1 = Button(frame_1, text="Calculate", command=self.validation_check)
        self.button_1.pack()

    def sequence(self):
     self.dna_sequence = self.entry_1.get()
     return self.dna_sequence

    def validation_check(self):
        #used to validate that self.dna_sequence only contains letters G, C, A, T
        valid = 'GCAT'
        condition = all(i in valid for i in self.sequence())
        if condition:
            self.at_calculate()
        else:
            self.varoutput_1.set("Invalid DNA sequence. Please enter again.")
            self.validation_check()

    def at_calculate(self):
        #used to calculate AT content of string stored in self.dna_sequence
        self.dna_sequence = self.entry_1.get()
        self.total_bases = len(self.dna_sequence)
        self.a_bases = self.dna_sequence.count("A")
        self.b_bases = self.dna_sequence.count("T")
        self.at_content = "%.2f" % ((self.a_bases + self.b_bases) / self.total_bases)
        self.varoutput_1.set("AT content percentage: " + self.at_content)

root = Tk()
root.title("AT content calculator")
root.geometry("320x320")
b = AT_content_calculator(root)
root.mainloop()

问题与 "resetting" 变量的值无关。问题只是您从自身内部重复调用 validation_check 而没有更改正在验证的值,因此您自然会遇到递归错误。您根本不应该再次调用该方法:您已经显示一条消息告诉用户验证失败,所以什么都不做,等待他们更改值并再次按下按钮。

(无论如何,这里循环比递归要好得多;但正如我所说,你不需要做任何一个,只需让方法结束即可。)