You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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-------&gt;
complementary_nucleotides_dna = {'a': 't', 't': 'a', 'c': 'g', 'g': 'c'}
complementary_nucleotides_rna = {'a': 'u', 'u': 'a', 'c': 'g', 'g': 'c'}

#<-------instruction label-------&gt;
enter_label = tk.Label(text='Fill one of the chains with nucleotides')
enter_label.grid()

#<-------first DNA chain-------&gt;
#<-------outer frame containing frames with Entry widgets on the first line-------&gt;
dna1 = tk.Frame(master=window)
for i in range(1, 10, 2):
#<-------inner frame containing 3 Entry widgets-------&gt;    
    triplet = tk.Frame(master=dna1)
    triplet.grid(row=1, column=i, pady=5)
#<-------chain's name-------&gt;
    if i == 1:
        dna1_label = tk.Label(master=triplet, text='DNA-1')
        dna1_label.pack(side=tk.LEFT)
#<-------creating 3 Entry widgets-------&gt;
    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-------&gt;
    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-------&gt;
#<-------outer frame containing frames with Entry widgets on the second line-------&gt;
dna2 = tk.Frame(master=window)
for i in range(1, 10, 2):
#<-------inner frame containing 3 Entry widgets-------&gt;  
    triplet = tk.Frame(master=dna2)
    triplet.grid(row=2, column=i, pady=5)
#<-------chain's name-------&gt;
    if i == 1:
        dna2_label = tk.Label(master=triplet, text='DNA-2')
        dna2_label.pack(side=tk.LEFT)
#<-------creating 3 Entry widgets-------&gt;
    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-------&gt;       
    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-------&gt;
#<-------outer frame containing frames with Entry widgets on the second line-------&gt;
mrna = tk.Frame(master=window)
for i in range(1, 10, 2):
#<-------inner frame containing 3 Entry widgets-------&gt;  
    triplet = tk.Frame(master=mrna)
    triplet.grid(row=3, column=i, pady=5)
#<-------chain's name-------&gt;
    if i == 1:
        dna2_label = tk.Label(master=triplet, text='MRNA')
        dna2_label.pack(side=tk.LEFT)
#<-------creating 3 Entry widgets-------&gt;
    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-------&gt;
    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-------&gt;
#<-------outer frame containing frames with Entry widgets on the second line-------&gt;
trna = tk.Frame(master=window)
for i in range(1, 10, 2):
#<-------inner frame containing 3 Entry widgets-------&gt; 
    triplet = tk.Frame(master=trna)
    triplet.grid(row=4, column=i, pady=5)
#<-------chain's name-------&gt;
    if i == 1:
        dna2_label = tk.Label(master=triplet, text='TRNA')
        dna2_label.pack(side=tk.LEFT)
#<-------creating 3 Entry widgets-------&gt;
    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-------&gt;
    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-------&gt;
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:18:40