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

Tkinter循环无法退出及光标无法自动跳转问题求助

Tkinter双输入框问题解决:自动光标跳转与避免重复追加

一、实现光标自动跳转

在创建输入框时,为第一个Entry绑定<Return>事件,触发光标跳转到第二个输入框;第二个Entry绑定<Return>事件直接触发提交逻辑,同时移除原代码中全局重复绑定的<Return>事件,避免冲突。

修改jql_query方法的关键代码:

self._output = []
row = self.greetings(2)
for ind, line in enumerate(self._summary):
    # ... 标签、输入框、按钮创建代码保持不变 ...
    
    self._output.append(en)
    
    # 绑定光标跳转与提交事件
    if ind == 0:
        # 第一个输入框按回车跳转到第二个
        en.bind("<Return>", lambda e: self._output[1].focus())
    else:
        # 第二个输入框按回车直接提交
        en.bind("<Return>", lambda e: self.print_output())

    row += 1
# 默认聚焦第一个输入框
self._output[0].focus()

二、解决循环重复追加与退出逻辑

原print_output方法的嵌套循环冗余且会重复收集数据,直接通过绑定的StringVar获取输入值,检查两个输入均非空后,禁用输入框和提交按钮防止重复提交,完成输入状态的退出。

修改print_output方法:

def print_output(self, *args):
    """ Getting input to jql """
    # 直接获取两个输入值并去除首尾空格
    main_folder = self.head.get().strip()
    sub_folder = self.sub.get().strip()
    
    self._bits = [main_folder, sub_folder]
    
    # 检查两个输入均非空时锁定输入
    if main_folder and sub_folder:
        # 禁用所有输入框
        for en in self._output:
            en.config(state=DISABLED)
        # 禁用所有提交按钮
        for child in self.mainframe.winfo_children():
            if isinstance(child, ttk.Button) and child["text"] == "Submit":
                child.config(state=DISABLED)
        print("输入完成,已锁定输入状态")
    return self._bits

完整修改后的关键代码片段

from tkinter import *
from tkinter import ttk


class Gui:

    _output: list
    _bits: list

    def __init__(self, root):
        """ Initiating root and reused variables"""
        self.root = root
        self.root.title("Folder Input")
        self.root.configure(background='#2E3135')

        mainframe = ttk.Frame(self.root, padding="8 8 24 24", relief="groove")
        mainframe.grid(column=0, row=0, sticky=EW)
        self.mainframe = mainframe
        mainframe.configure(background='#2E3135')

        self.greetings(0)
        self.jql_query()
        self.__exit__()


    def greetings(self, n):
        """ Creates a greeting's textbox at top """
        base = 1 + n
        greeting_label = ttk.Label(self.mainframe, text="Folder Input Tool", background='#2E3135', foreground='white', font=('Arial',12,'bold'))
        greeting_label.grid(column=1, row=base-1, columnspan=3, pady=10)
        return base

    def jql_query(self):
        """ Entry widget for creating jql-query """
        input1 = "Enter name of main folder in summary:"
        input2 = "Enter name of sub folder in summary:"
        inputs = [input1, input2]

        font1 = ('Arial',10)
        font2 = ('Arial',10)

        self.head = StringVar()
        self.sub = StringVar()
        self._summary = [self.head, self.sub]
        self._output = []

        row = self.greetings(2)
        for ind, line in enumerate(self._summary):
            sum_label = ttk.Label(self.mainframe, text=inputs[ind], background='#2E3135', foreground='white', font=font1)
            sum_label.grid(column=1, row=row, padx=10, pady=5, sticky=EW)

            en = Entry(self.mainframe, textvariable=line, bd=3, background="#484D51", fg='white', font=font2, width=20, relief='flat')
            en.grid(column=2, row=row, sticky=EW)
            en.columnconfigure(0, weight=0)

            butt = ttk.Button(self.mainframe, text="Submit", command=self.print_output)
            butt.grid(column=3, row=row, padx=10, sticky=W)

            self._output.append(en)
            
            # 绑定光标跳转与提交事件
            if ind == 0:
                en.bind("<Return>", lambda e: self._output[1].focus())
            else:
                en.bind("<Return>", lambda e: self.print_output())

            row += 1
        self._output[0].focus()

    def print_output(self, *args):
        """ Getting input to jql """
        main_folder = self.head.get().strip()
        sub_folder = self.sub.get().strip()
        
        self._bits = [main_folder, sub_folder]
        
        if main_folder and sub_folder:
            for en in self._output:
                en.config(state=DISABLED)
            for child in self.mainframe.winfo_children():
                if isinstance(child, ttk.Button) and child["text"] == "Submit":
                    child.config(state=DISABLED)
            print("输入完成,已锁定输入")
        return self._bits


    def __exit__(self):
        """ Exit program"""
        row = self.greetings(4)
        ttk.Button(self.mainframe, text="Quit", command=self.root.destroy).grid(column=9, row=row)


root = Tk()
gui = Gui(root)
root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:07:03