如何通过Tkinter按钮获取Text组件的用户输入?
问题原因
你在StartPage类的初始化阶段就执行了url = user_entry.get(),此时用户还未在文本框中输入任何内容,url会被赋值为空字符串。而且这个变量不会随着后续用户输入自动更新,所以点击按钮时传递给add_product_link的始终是初始的空值,自然无法获取到用户输入的链接。
另外需要注意:你使用的是tk.Text组件,它的get()方法需要传入起始和结束索引参数(比如"1.0"代表第一行第0个字符位置,tk.END代表文本末尾),直接调用user_entry.get()会报错,这也是问题之一。
解决方案
有两种可行的修正方式,根据你的输入需求选择:
方式一:修正Text组件的取值逻辑
直接在按钮点击时才获取文本框内容,并且使用正确的Text取值语法:
class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = tk.Label(self, text=('Enter the product links below !'), font=MEDIUM_FONT) label.grid(row=0, column=0, columnspan=2, padx=10, pady=10) user_entry_text = tk.Label(self, text=('Link: '), font=MEDIUM_FONT) user_entry_text.grid(row=1, column=0, sticky=tk.W, padx=10, pady=10) user_entry = tk.Text(self, width=30, height=2) user_entry.grid(row=1, column=1, sticky=tk.E, padx=10, pady=10) quit_button = tk.Button(self, text=('Quit'), command=self.destroy) quit_button.grid(row=2, column=1, sticky=tk.E, padx=10, pady=10) # 移除提前赋值的url变量,点击按钮时实时获取输入 add_button = tk.Button(self, text=('Add Item'), command=lambda: add_product_link(user_entry.get("1.0", tk.END).strip())) add_button.grid(row=2, column=0, sticky=tk.W, padx=10, pady=10)
user_entry.get("1.0", tk.END)获取文本框内所有内容.strip()用于去除首尾的换行符和空格,避免无效内容
方式二:改用Entry组件(推荐单行输入场景)
如果只需要单行输入链接,tk.Entry比tk.Text更合适,它的get()方法无需额外参数:
class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = tk.Label(self, text=('Enter the product links below !'), font=MEDIUM_FONT) label.grid(row=0, column=0, columnspan=2, padx=10, pady=10) user_entry_text = tk.Label(self, text=('Link: '), font=MEDIUM_FONT) user_entry_text.grid(row=1, column=0, sticky=tk.W, padx=10, pady=10) # 替换为Entry组件 user_entry = tk.Entry(self, width=30) user_entry.grid(row=1, column=1, sticky=tk.E, padx=10, pady=10) quit_button = tk.Button(self, text=('Quit'), command=self.destroy) quit_button.grid(row=2, column=1, sticky=tk.E, padx=10, pady=10) # 点击按钮时实时获取输入 add_button = tk.Button(self, text=('Add Item'), command=lambda: add_product_link(user_entry.get().strip())) add_button.grid(row=2, column=0, sticky=tk.W, padx=10, pady=10)
额外优化建议
尽量避免使用全局变量tag_list,可以将其封装到StartPage类中作为实例属性,比如:
class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.tag_list = [] # 实例化属性替代全局变量 # ... 其他代码 ... # 修改按钮command,调用类内方法 add_button = tk.Button(self, text=('Add Item'), command=self.add_product_link) add_button.grid(row=2, column=0, sticky=tk.W, padx=10, pady=10) def add_product_link(self): # 获取输入并处理 link = user_entry.get("1.0", tk.END).strip() # 或Entry的get方法 product_tag = link[32:] self.tag_list.append(product_tag) print(self.tag_list)
内容的提问来源于stack exchange,提问作者bsaoptima
相关产品推荐
相关产品推荐

