Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建带有列表项的文本框-tkinter Python_Python_User Interface_Tkinter_Textbox_Tkinter Entry - Fatal编程技术网

创建带有列表项的文本框-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()
所有小部件=[]
。我注意到我插入了错误的代码-没有按钮
添加小部件
删除小部件
-但我用这些按钮放置了图像。现在代码有了这些按钮。非常感谢,这确实有效