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

如何用CustomTkinter在单个窗口内新增输入框而非弹出新窗口?

解决在同一窗口新增输入框的问题

你当前代码里使用的CTkInputDialog本身就是弹窗组件,所以点击后会弹出新窗口。要在原窗口新增输入框,需要直接在主窗口root下创建CTkEntry(输入框)和对应的标签,而非使用弹窗。

修改思路

  • 移除所有CTkInputDialog的调用,替换为在主窗口内动态创建输入框和提示标签
  • 修复原代码中root.geometry = ('400x200')的语法错误(正确写法是root.geometry('400x200'))
  • 添加确认按钮用于获取输入框的值并更新标签内容
  • 避免重复创建输入框,通过状态判断控制组件生成逻辑

修改后的完整代码

import yfinance as yf
import customtkinter

customtkinter.set_default_color_theme("dark-blue")

root = customtkinter.CTk()
root.title('Stock Input Tool')
root.geometry('400x300')  # 调整窗口高度以容纳新增输入框

# 全局变量存储输入框组件,用于后续获取值和判断是否已创建
ticker_entry = None
start_date_entry = None
end_date_entry = None

def add_input_fields():
    global ticker_entry, start_date_entry, end_date_entry
    
    # 如果输入框已存在,不再重复创建
    if ticker_entry is not None:
        return
    
    # 创建股票代码输入区域
    ticker_label = customtkinter.CTkLabel(root, text='股票代码:')
    ticker_label.pack(pady=(5, 0))
    ticker_entry = customtkinter.CTkEntry(root, placeholder_text='例如 AAPL')
    ticker_entry.pack(pady=(0, 10))
    
    # 创建开始日期输入区域
    start_label = customtkinter.CTkLabel(root, text='开始日期 (YYYY-MM-DD):')
    start_label.pack(pady=(5, 0))
    start_date_entry = customtkinter.CTkEntry(root, placeholder_text='2023-01-01')
    start_date_entry.pack(pady=(0, 10))
    
    # 创建结束日期输入区域
    end_label = customtkinter.CTkLabel(root, text='结束日期 (YYYY-MM-DD):')
    end_label.pack(pady=(5, 0))
    end_date_entry = customtkinter.CTkEntry(root, placeholder_text='2023-12-31')
    end_date_entry.pack(pady=(0, 10))
    
    # 添加确认按钮
    confirm_btn = customtkinter.CTkButton(root, text='确认输入', command=get_input_values)
    confirm_btn.pack(pady=10)

def get_input_values():
    # 获取输入框内容
    ticker = ticker_entry.get().strip() if ticker_entry else ''
    start_date = start_date_entry.get().strip() if start_date_entry else ''
    end_date = end_date_entry.get().strip() if end_date_entry else ''
    
    # 更新标签内容,给出明确反馈
    if ticker and start_date and end_date:
        my_label.configure(text=f"已输入信息:\n股票代码: {ticker}\n开始日期: {start_date}\n结束日期: {end_date}")
    else:
        missing_items = []
        if not ticker:
            missing_items.append('股票代码')
        if not start_date:
            missing_items.append('开始日期')
        if not end_date:
            missing_items.append('结束日期')
        my_label.configure(text=f"请补充输入: {', '.join(missing_items)}")

# 初始按钮:点击后在当前窗口添加输入框
my_button = customtkinter.CTkButton(root, text="添加输入框", command=add_input_fields)
my_button.pack(pady=40)

# 结果展示标签
my_label = customtkinter.CTkLabel(root, text='')
my_label.pack(pady=10)

root.mainloop()

关键修改说明

  1. 替换弹窗组件:用CTkEntry替代弹窗式的CTkInputDialog,直接在主窗口内生成输入区域,完全避免新窗口弹出。
  2. 拆分功能逻辑:将原input函数拆分为创建输入框和获取输入值两个独立函数,代码结构更清晰,便于维护。
  3. 防止重复创建:通过全局变量记录输入框状态,避免多次点击按钮重复生成相同组件。
  4. 优化用户反馈:确认输入后,在标签中展示完整输入信息,或明确提示缺失的必填项,提升交互体验。

内容的提问来源于stack exchange,提问作者ben Stiller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:23:14