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
相关产品推荐
相关产品推荐

