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

CustomTkinter动态生成输入框及读取存储输入值的技术问询

解决CustomTkinter动态生成输入框及取值问题

一、动态生成CTkEntry与标签的正确实现

核心思路是保存CTkEntry控件实例,而非生成时直接获取输入值(此时用户尚未输入,必然得到空值)。用列表存储所有生成的输入框,后续需要取值时再调用控件的get()方法。

示例代码:

import customtkinter as ctk

ctk.set_appearance_mode("light")
ctk.set_default_color_theme("blue")

class App(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.title("动态输入框示例")
        self.geometry("400x500")

        # 存储所有动态生成的CTkEntry实例
        self.entry_list = []
        # 放置动态控件的容器
        self.entry_frame = ctk.CTkFrame(self)
        self.entry_frame.pack(pady=20, padx=20, fill="both", expand=True)

        # 添加输入框按钮
        self.add_btn = ctk.CTkButton(self, text="添加输入框", command=self.add_entry)
        self.add_btn.pack(pady=10)

        # 保存输入值按钮
        self.save_btn = ctk.CTkButton(self, text="保存所有输入", command=self.save_entries)
        self.save_btn.pack(pady=10)

    def add_entry(self):
        # 生成标签和输入框
        label = ctk.CTkLabel(self.entry_frame, text=f"输入框 {len(self.entry_list)+1}:")
        label.pack(pady=5, padx=10, anchor="w")
        
        entry = ctk.CTkEntry(self.entry_frame, placeholder_text="请输入内容")
        entry.pack(pady=5, padx=10, fill="x")
        
        # 将输入框实例加入列表
        self.entry_list.append(entry)

    def save_entries(self):
        # 遍历输入框列表,获取实时输入值
        input_values = [entry.get().strip() for entry in self.entry_list]
        print("所有输入内容:", input_values)
        # 此处可将input_values写入文件、数据库或做其他业务处理

if __name__ == "__main__":
    app = App()
    app.mainloop()

二、之前代码取不到值的原因

你之前的问题出在生成输入框时直接调用get()并保存——此时用户还未输入任何内容,自然得到空字符串。正确的做法是先保存输入框的控件对象,等用户输入完成、触发保存操作时,再逐个调用get()获取实时输入值。

三、HTML表单配合Python的替代方案

如果桌面GUI不是硬性要求,完全可以用HTML表单+Python后端实现类似功能,适合需要跨设备网页访问的场景。以下用Flask举个简单示例:

后端Python代码(Flask)

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # 获取表单中所有输入值(输入框name属性为input_1, input_2...)
        input_values = []
        i = 1
        while f'input_{i}' in request.form:
            input_values.append(request.form[f'input_{i}'].strip())
            i += 1
        print("提交的输入内容:", input_values)
        # 此处可处理或保存数据
        return "数据已提交!"
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)

前端HTML模板(templates/index.html)

<!DOCTYPE html>
<html>
<head>
    <title>动态表单示例</title>
</head>
<body>
    <form method="POST">
        <div id="input-container">
            <!-- 初始输入框 -->
            <div>
                <label>输入框 1:</label>
                <input type="text" name="input_1">
            </div>
        </div>
        <button type="button" onclick="addInput()">添加输入框</button>
        <button type="submit">提交</button>
    </form>

    <script>
        let count = 1;
        function addInput() {
            count++;
            const container = document.getElementById('input-container');
            const div = document.createElement('div');
            div.innerHTML = `<label>输入框 ${count}:</label><input type="text" name="input_${count}">`;
            container.appendChild(div);
        }
    </script>
</body>
</html>

这种方案的优势是支持跨设备访问,而CustomTkinter更适合桌面端本地应用,可根据实际需求选择。

内容的提问来源于stack exchange,提问作者Okitha Vithanage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:20:16