创建带有列表项的文本框-tkinter Python
我有一个列表创建带有列表项的文本框-tkinter Python,python,user-interface,tkinter,textbox,tkinter-entry,Python,User Interface,Tkinter,Textbox,Tkinter Entry,我有一个列表out\u list=[“item1”、“item2”、“item3”、…]我正试图为每个项目添加文本框和条目,如下所示: 但是当我试图从文本框中获取时,text\u box.get(“1.0”,“end-1c”),我将所有列表作为一个字符串获取 谢谢你的帮助 for i in range(0,len(out_list)): text_box.window_create(text_box.index("end"), win
out\u list=[“item1”、“item2”、“item3”、…]
我正试图为每个项目添加文本框和条目,如下所示:
但是当我试图从文本框中获取时,text\u box.get(“1.0”,“end-1c”)
,我将所有列表作为一个字符串获取
谢谢你的帮助
for i in range(0,len(out_list)):
text_box.window_create(text_box.index("end"), window=tk.Button(text_box, text="Copy Variable",command=buttonClick))
text_box.window_create(text_box.index("end"), window=tk.Entry(text_box, text=str(out_list[i])))
text_box.window_create(text_box.index("end"),text_box.insert(END, out_list[i]), window=text_box_value)
text_box.insert(END,'\n') # adds text to text box
您应该首先创建条目
entry = tk.Entry(text_box)
entry.insert("end", item)
以后你可以在家里用它
command=lambda:button_click(entry))
但它位于for
-循环内,lambda
不会将值从条目
复制到code按钮(条目)
因此它只保留对条目的引用
,而这个条目
在循环中发生变化-最后所有lambda都引用了具有最后一个值的同一个变量。您必须使用额外的变量来复制对象
command=lambda x=entry:button_click(x))
最小工作代码
import tkinter as tk # PEP8: `import *` not preferred
# --- functions --- (PEP8: lower_case_names)
def button_click(entry):
print('ENTRY:', entry.get())
# --- main ---
out_list = ["item1", "item2", "item3", ] # PEP8: spaces after comma
root = tk.Tk()
text_box = tk.Text(root)
text_box.pack()
for item in out_list:
print(item)
entry = tk.Entry(text_box)
entry.insert("end", item)
button = tk.Button(text_box, text="Copy Variable", command=lambda x=entry:button_click(x))
text_box.window_create(text_box.index("end"), window=button)
text_box.window_create(text_box.index("end"), window=entry)
#text_box.window_create(text_box.index("end"), text_box.insert('end', item), window=text_box_value)
text_box.insert("end", item)
text_box.insert("end", '\n') # adds text to text box
root.mainloop()
编辑:
您还可以使用Frame
构建自己的小部件,其中包含按钮
、条目
、标签
和按钮,然后单击
,然后使用此小部件
添加或隐藏小部件可能更简单
import tkinter as tk # PEP8: `import *` not preferred
# --- classes --- (PEP8: CamelCaseNames)
class MyWidget(tk.Frame):
def __init__(self, master, text, *args, **kwargs):
super().__init__(master, *args, **kwargs)
self.button = tk.Button(self, text="Copy Variable", command=self.button_click)
self.button.pack(side="left")
self.entry = tk.Entry(self)
self.entry.insert("end", text)
self.entry.pack(side="left")
self.label = tk.Label(self, text=text)
self.label.pack(side="left")
def button_click(self):
print('ENTRY:', self.entry.get())
#self.button["text"] = self.entry.get()
# --- functions --- (PEP8: lower_case_names)
def copy_all_variables():
for widget in all_widgets:
print(widget.entry.get())
#widget.button_copy()
def add_widget():
item = "item" + str(len(all_widgets)+1)
widget = MyWidget(frame_widget, text=item)
widget.pack(fill='x')
all_widgets.append(widget)
def remove_widget():
if all_widgets:
all_widgets[-1].destroy()
del all_widgets[-1]
# --- main ---
out_list = ["item1", "item2", "item3", ] # PEP8: spaces after comma
root = tk.Tk()
# - version 1 -
tk.Label(root, text="Text Box + window_create()", bg="#8080ff").pack(fill='x', expand=True)
text_box = tk.Text(root)
text_box.pack()
all_widgets_1 = []
for item in out_list:
widget = MyWidget(text_box, text=item)
text_box.window_create(text_box.index("end"), window=widget)
text_box.insert("end", '\n') # adds text to text box
all_widgets_1.append(widget)
# - version 2 -
tk.Label(root, text="Frame + pack()", bg="#8080ff").pack(fill='x', expand=True)
all_widgets = []
frame_widget = tk.Frame(root)
frame_widget.pack(fill='x')
for item in out_list:
widget = MyWidget(frame_widget, text=item)
widget.pack(fill='x')
all_widgets.append(widget)
frame_buttons = tk.Frame(root)
frame_buttons.pack()
button_copy = tk.Button(frame_buttons, text="Copy All Variables", command=copy_all_variables)
button_copy.pack(side="left")
button_add = tk.Button(frame_buttons, text="Add Widget", command=add_widget)
button_add.pack(side="left")
button_remove = tk.Button(frame_buttons, text="Remove Widget", command=remove_widget)
button_remove.pack(side="left")
# -
root.mainloop()
当您将按钮
和条目
直接放入文本
时,您可以在小部件之间写入文本
我已将滚动添加到根帧,但无法使其向上/向下滚动
root = tk.Tk()
scrollbar = tk.Scrollbar(root)
scrollbar.pack( side = RIGHT,fill = Y )
text1\u id=text\u box.window\u create(..)
现在您可以使用text1\u id
访问第一个文本框,或者您应该首先创建entry\u 1=tk.entry(..)
并将其保留在列表中-以访问此条目,或者使用命令=lambda:button单击(entry\u 1)
或者您应该使用Frame
对元素按钮
、条目
、文本
进行分组,并创建自己的小部件(具有单行所需的所有功能),并在for
-循环中使用此小部件,而不是for i in range(0,len(out_list))
您可以学习使用处理输入/输出列表中的项目:
Hi furas,这确实是我的意思,工作非常完美,我在该列表中添加了一个搜索,但我正在尝试在更新列表后“清理”小部件。我尝试了以下操作:“在根目录下为label.pack\u slaves():if label.pack\u fo print(label)label.destroy()“我不知道我是否理解示例代码。如果您想从所有标签中删除文本,则为所有小部件中的小部件分配空字符串-。label[“text”]=”
。如果您想删除所有小部件,则为所有小部件中的小部件分配:widget.destroy()
和所有小部件=[]
。我注意到我插入了错误的代码-没有按钮添加小部件
和删除小部件
-但我用这些按钮放置了图像。现在代码有了这些按钮。非常感谢,这确实有效