如何遍历Tkinter中的Frame并获取Entry组件的值
问题描述
我用for循环构建了Tkinter应用界面,希望用户在Entry组件中输入核苷酸(每个Entry输入一个字母),点击按钮后自动生成互补的核苷酸链,但现在不知道怎么获取Entry组件里存储的值。
原实现代码如下:
import tkinter as tk def generate_other_chains(): nucleotides_list = [] for triplet in dna1: if triplet != '-': for nucleotide in triplet: if triplet.get(): nucleotides_list.append(triplet.get()) window = tk.Tk() #<-------complementary nucleotides dictionary-------> complementary_nucleotides_dna = {'a': 't', 't': 'a', 'c': 'g', 'g': 'c'} complementary_nucleotides_rna = {'a': 'u', 'u': 'a', 'c': 'g', 'g': 'c'} #<-------instruction label-------> enter_label = tk.Label(text='Fill one of the chains with nucleotides') enter_label.grid() #<-------first DNA chain-------> #<-------outer frame containing frames with Entry widgets on the first line-------> dna1 = tk.Frame(master=window) for i in range(1, 10, 2): #<-------inner frame containing 3 Entry widgets-------> triplet = tk.Frame(master=dna1) triplet.grid(row=1, column=i, pady=5) #<-------chain's name-------> if i == 1: dna1_label = tk.Label(master=triplet, text='DNA-1') dna1_label.pack(side=tk.LEFT) #<-------creating 3 Entry widgets-------> for j in range(0, 3): nucleotide = tk.Entry(master=triplet, width=1, font=('Helvetica', 14)) nucleotide.pack(side=tk.LEFT) #<-------creating separators between triplets-------> if i != 9: separator_frame = tk.Frame(master=dna1) separator_frame.grid(row=1, column=i+1, pady=5) separator = tk.Label(master=separator_frame, text='-') separator.pack() dna1.grid(row=1, column=0) #<-------second DNA chain-------> #<-------outer frame containing frames with Entry widgets on the second line-------> dna2 = tk.Frame(master=window) for i in range(1, 10, 2): #<-------inner frame containing 3 Entry widgets-------> triplet = tk.Frame(master=dna2) triplet.grid(row=2, column=i, pady=5) #<-------chain's name-------> if i == 1: dna2_label = tk.Label(master=triplet, text='DNA-2') dna2_label.pack(side=tk.LEFT) #<-------creating 3 Entry widgets-------> for j in range(0, 3): nucleotide = tk.Entry(master=triplet, width=1, font=('Helvetica', 14)) nucleotide.pack(side=tk.LEFT) #<-------creating separators between triplets-------> if i != 9: separator_frame = tk.Frame(master=dna2) separator_frame.grid(row=2, column=i+1, pady=5) separator = tk.Label(master=separator_frame, text='-') separator.pack() dna2.grid(row=2, column=0) #<-------mRNA chain-------> #<-------outer frame containing frames with Entry widgets on the second line-------> mrna = tk.Frame(master=window) for i in range(1, 10, 2): #<-------inner frame containing 3 Entry widgets-------> triplet = tk.Frame(master=mrna) triplet.grid(row=3, column=i, pady=5) #<-------chain's name-------> if i == 1: dna2_label = tk.Label(master=triplet, text='MRNA') dna2_label.pack(side=tk.LEFT) #<-------creating 3 Entry widgets-------> for j in range(0, 3): nucleotide = tk.Entry(master=triplet, width=1, font=('Helvetica', 14)) nucleotide.pack(side=tk.LEFT) #<-------creating separators between triplets-------> if i != 9: separator_frame = tk.Frame(master=mrna) separator_frame.grid(row=3, column=i+1, pady=5) separator = tk.Label(master=separator_frame, text='-') separator.pack() mrna.grid(row=3, column=0) #<-------tRNA chain-------> #<-------outer frame containing frames with Entry widgets on the second line-------> trna = tk.Frame(master=window) for i in range(1, 10, 2): #<-------inner frame containing 3 Entry widgets-------> triplet = tk.Frame(master=trna) triplet.grid(row=4, column=i, pady=5) #<-------chain's name-------> if i == 1: dna2_label = tk.Label(master=triplet, text='TRNA') dna2_label.pack(side=tk.LEFT) #<-------creating 3 Entry widgets-------> for j in range(0, 3): nucleotide = tk.Entry(master=triplet, width=1, font=('Helvetica', 14)) nucleotide.pack(side=tk.LEFT) #<-------creating separators between triplets-------> if i != 9: separator_frame = tk.Frame(master=trna) separator_frame.grid(row=4, column=i+1, pady=5) separator = tk.Label(master=separator_frame, text='-') separator.pack() trna.grid(row=4, column=0) #<-------button generating other chains of triplets-------> generate_button = tk.Button(text='Generate other chains', command=generate_other_chains) generate_button.grid()
解决方案
核心问题是创建Entry后未保存引用,导致无法调用.get()获取值。我们可以用列表存储各链的Entry组件,后续通过列表遍历读取和写入值。修改后的代码如下:
import tkinter as tk def generate_other_chains(): # 获取DNA-1的所有核苷酸值(转为小写匹配字典) dna1_sequence = [entry.get().lower() for entry in dna1_entries] # 生成DNA-2互补链 dna2_sequence = [complementary_nucleotides_dna[nt] if nt in complementary_nucleotides_dna else '' for nt in dna1_sequence] # 生成mRNA(以DNA-1为模板,A→U、T→A、C→G、G→C) mrna_sequence = [complementary_nucleotides_rna[nt] if nt in complementary_nucleotides_rna else '' for nt in dna1_sequence] # 生成tRNA(与mRNA互补) trna_sequence = [complementary_nucleotides_rna[nt] if nt in complementary_nucleotides_rna else '' for nt in mrna_sequence] # 将生成的序列写入对应Entry(转为大写显示) for entry, val in zip(dna2_entries, dna2_sequence): entry.delete(0, tk.END) entry.insert(0, val.upper()) for entry, val in zip(mrna_entries, mrna_sequence): entry.delete(0, tk.END) entry.insert(0, val.upper()) for entry, val in zip(trna_entries, trna_sequence): entry.delete(0, tk.END) entry.insert(0, val.upper()) window = tk.Tk() window.title("核苷酸链生成工具") # 互补核苷酸映射字典 complementary_nucleotides_dna = {'a': 't', 't': 'a', 'c': 'g', 'g': 'c'} complementary_nucleotides_rna = {'a': 'u', 'u': 'a', 'c': 'g', 'g': 'c'} # 提示标签 enter_label = tk.Label(text='在DNA-1链中输入核苷酸,点击按钮生成其他互补链') enter_label.grid(row=0, column=0, padx=10, pady=10) # 存储各链Entry组件的列表 dna1_entries = [] dna2_entries = [] mrna_entries = [] trna_entries = [] # 构建DNA-1链 dna1_frame = tk.Frame(master=window) dna1_frame.grid(row=1, column=0, padx=10, pady=5) tk.Label(master=dna1_frame, text='DNA-1').pack(side=tk.LEFT, padx=5) # 生成3个密码子组,每组3个Entry for triplet_idx in range(3): triplet_frame = tk.Frame(master=dna1_frame) triplet_frame.pack(side=tk.LEFT, padx=2) for _ in range(3): entry = tk.Entry(master=triplet_frame, width=1, font=('Helvetica', 14), justify='center') entry.pack(side=tk.LEFT) dna1_entries.append(entry) # 密码子间添加分隔符,最后一组不加 if triplet_idx != 2: tk.Label(master=dna1_frame, text='-').pack(side=tk.LEFT) # 构建DNA-2链 dna2_frame = tk.Frame(master=window) dna2_frame.grid(row=2, column=0, padx=10, pady=5) tk.Label(master=dna2_frame, text='DNA-2').pack(side=tk.LEFT, padx=5) for triplet_idx in range(3): triplet_frame = tk.Frame(master=dna2_frame) triplet_frame.pack(side=tk.LEFT, padx=2) for _ in range(3): entry = tk.Entry(master=triplet_frame, width=1, font=('Helvetica', 14), justify='center', state='readonly') entry.pack(side=tk.LEFT) dna2_entries.append(entry) if triplet_idx != 2: tk.Label(master=dna2_frame, text='-').pack(side=tk.LEFT) # 构建mRNA链 mrna_frame = tk.Frame(master=window) mrna_frame.grid(row=3, column=0, padx=10, pady=5) tk.Label(master=mrna_frame, text='mRNA').pack(side=tk.LEFT, padx=5) for triplet_idx in range(3): triplet_frame = tk.Frame(master=mrna_frame) triplet_frame.pack(side=tk.LEFT, padx=2) for _ in range(3): entry = tk.Entry(master=triplet_frame, width=1, font=('Helvetica', 14), justify='center', state='readonly') entry.pack(side=tk.LEFT) mrna_entries.append(entry) if triplet_idx != 2: tk.Label(master=mrna_frame, text='-').pack(side=tk.LEFT) # 构建tRNA链 trna_frame = tk.Frame(master=window) trna_frame.grid(row=4, column=0, padx=10, pady=5) tk.Label(master=trna_frame, text='tRNA').pack(side=tk.LEFT, padx=5) for triplet_idx in range(3): triplet_frame = tk.Frame(master=trna_frame) triplet_frame.pack(side=tk.LEFT, padx=2) for _ in range(3): entry = tk.Entry(master=triplet_frame, width=1, font=('Helvetica', 14), justify='center', state='readonly') entry.pack(side=tk.LEFT) trna_entries.append(entry) if triplet_idx != 2: tk.Label(master=trna_frame, text='-').pack(side=tk.LEFT) # 生成按钮 generate_button = tk.Button(text='生成其他链', command=generate_other_chains) generate_button.grid(row=5, column=0, padx=10, pady=15) window.mainloop()
关键改动说明
- 新增四个列表存储各链的Entry组件引用,确保后续能直接遍历操作这些组件。
- 重构链的构建逻辑,简化代码结构,同时保证每个Entry都被添加到对应列表。
- 给自动生成的链的Entry设置
state='readonly',防止用户手动修改(代码仍可对其进行写入操作)。 - 在生成函数中,先读取输入链的核苷酸值,再通过互补字典生成其他链的序列,最后遍历Entry列表完成写入。
内容的提问来源于stack exchange,提问作者mies
相关产品推荐
相关产品推荐

