query_entry = tk.Entry(self.container1) query_entry.pack(side=tk.LEFT, padx=5, pady=5) query_button = tk.Button(self.container1, text='查询', command=lambda: self.query_data(query_entry.get(), table2)) query_button.pack(side=tk.LEFT, padx=5, pady=5) def on_return_key(event): query_button.invoke() query_entry.bind('<Return>', on_return_key) def query_data(self, query_str, table): # 清空表格内容 table.delete(*table.get_children()) # 获取查询条件 query_col = 8 # 遍历表格数据,找到符合条件的数据 for row in self.data_sheet.iter_rows(min_row=2, values_only=True): if str(row[query_col - 1]).startswith(query_str): row_values = [str(cell) if cell is not None else "" for cell in row] table.insert("", tk.END, values=row_values)這個代碼運行一次就會再建一個按鈕和文本框,怎麽解決
时间: 2024-03-23 16:42:26 浏览: 103
这个问题可能是因为你的代码在每次运行时都会重新创建一个新的文本框和按钮,而不是复用已经创建的组件。解决方法是在创建文本框和按钮之前,先检查一下是否已经创建过了,如果已经创建过了就不再创建,而是直接使用已有的组件。你可以将创建文本框和按钮的代码放在一个单独的方法中,然后在初始化方法中先检查一下是否已经创建过了,如果没有才调用创建方法。例如:
```
def __init__(self, parent):
self.parent = parent
self.query_entry = None
self.query_button = None
self.create_widgets()
def create_widgets(self):
if self.query_entry is None:
self.query_entry = tk.Entry(self.container1)
self.query_entry.pack(side=tk.LEFT, padx=5, pady=5)
self.query_entry.bind('<Return>', self.on_return_key)
if self.query_button is None:
self.query_button = tk.Button(self.container1, text='查询', command=lambda: self.query_data(self.query_entry.get(), table2))
self.query_button.pack(side=tk.LEFT, padx=5, pady=5)
def on_return_key(self, event):
self.query_button.invoke()
def query_data(self, query_str, table):
# 清空表格内容
table.delete(*table.get_children())
# 获取查询条件
query_col = 8
# 遍历表格数据,找到符合条件的数据
for row in self.data_sheet.iter_rows(min_row=2, values_only=True):
if str(row[query_col - 1]).startswith(query_str):
row_values = [str(cell) if cell is not None else "" for cell in row]
table.insert("", tk.END, values=row_values)
```
这样每次运行时都会检查是否已经创建了文本框和按钮,如果已经创建了就不会再创建,而是直接使用已有的组件。
阅读全文