python tkinter附加列表

python tkinter附加列表,python,list,tkinter,append,Python,List,Tkinter,Append,我是一名业余python程序员,有2个月的经验。我正试图通过tkinter编写GUI待办事项列表。按钮的实际位置并不重要。之后我可以玩这些。我需要一些帮助来显示列表中的附加项。在程序中,它在数字上更新良好,但不会打印到列表上。我在控制台上仔细检查了它,它显示“0x102fa4048处的tkinter.StringVar对象”,但没有更新实际列表。我需要的帮助是如何更新标签列上的列表Main_Q?非常感谢一些指导和编码帮助。谢谢 Main_Q =["read","clean dishes", "w

我是一名业余python程序员,有2个月的经验。我正试图通过tkinter编写GUI待办事项列表。按钮的实际位置并不重要。之后我可以玩这些。我需要一些帮助来显示列表中的附加项。在程序中,它在数字上更新良好,但不会打印到列表上。我在控制台上仔细检查了它,它显示“0x102fa4048处的tkinter.StringVar对象”,但没有更新实际列表。我需要的帮助是如何更新标签列上的列表Main_Q?非常感谢一些指导和编码帮助。谢谢

Main_Q =["read","clean dishes", "wash car"]


from tkinter import*
root=Tk(className="total tasks in the Q")


#formula

def update():
global Main_Q
a=len(Main_Q)
num.set(a)

def add2list():
Main_Q.append(name)
a=len(Main_Q)
num.set(a)
print (Main_Q)


#output

num=StringVar()
y=Label(root, textvariable=num).grid(row=0, column=1)

#input

name=StringVar()
b=Entry(root, textvariable=name).grid(row=7,column=0)


#buttons
z=Button(root, text="update", command=update).grid(row=7, column=2)
add2list=Button(root,text="add", command=add2list).grid(row=7,         
column=1)


r = 0
for c in Main_Q:
Label(text=c, relief=RIDGE,width=15).grid(row=r,column=0)
r = r + 1

root.mainloop()

您的问题是,构建标签的for循环在每次输入新“任务”后都不会被调用。要轻松修复此问题,可以将此循环移动到更新函数中

如果您想防止每次在小部件之间循环,您可以创建一个包含所有已创建小部件的新列表:

createdWidgets = []
widgetsQueue = []
在更新函数中,您需要遍历
widgetsQueue
(例如widgetsquee.pop()),创建小部件并将小部件附加到
createdWidgetes
列表中

def update():
    global Main_Q
    r = 0
    for c in Main_Q:
        Label(text=c, relief=RIDGE,width=15).grid(row=r,column=0)
        r += 1 # shorthand for r = r + 1
一些补充说明:

  • 对于条目,更容易将定义和位置分开:

    b = Entry(root)
    b.grid(row=7,column=0)
    
    因为than Entry()返回其实例,您可以使用它来获取文本:

    b.get()
    
  • 如果你去购物,你会把所有东西都放在一个袋子里吗

    from tkinter import *
    
    确实如此(在本例中,globals()变量将是bag)。如果您想了解更多信息。要防止出现这种情况并缩短要键入的字母数量,请执行以下操作:

    import tkinter as t # or tk 
    root = t.Tk()
    

  • *但是可以肯定的是,如果你只需要一个小程序就可以了。

    你的问题是,每次你输入一个新的“任务”后,构建标签的for循环都不会被调用。要轻松修复此问题,可以将此循环移动到更新函数中

    如果您想防止每次在小部件之间循环,您可以创建一个包含所有已创建小部件的新列表:

    createdWidgets = []
    widgetsQueue = []
    
    在更新函数中,您需要遍历
    widgetsQueue
    (例如widgetsquee.pop()),创建小部件并将小部件附加到
    createdWidgetes
    列表中

    def update():
        global Main_Q
        r = 0
        for c in Main_Q:
            Label(text=c, relief=RIDGE,width=15).grid(row=r,column=0)
            r += 1 # shorthand for r = r + 1
    
    一些补充说明:

  • 对于条目,更容易将定义和位置分开:

    b = Entry(root)
    b.grid(row=7,column=0)
    
    因为than Entry()返回其实例,您可以使用它来获取文本:

    b.get()
    
  • 如果你去购物,你会把所有东西都放在一个袋子里吗

    from tkinter import *
    
    确实如此(在本例中,globals()变量将是bag)。如果您想了解更多信息。要防止出现这种情况并缩短要键入的字母数量,请执行以下操作:

    import tkinter as t # or tk 
    root = t.Tk()
    
  • *但可以肯定的是,如果你只需要一个小程序,那也没关系。

    Design: 要解决您的问题,您需要设计以下简单的解决方案:

  • 使用方法检索
    Tkinter.Entry
    小部件的文本
  • 使用方法将1中的文本添加到
    Main\Q
  • 使用方法绑定在单击
    Main\Q
    和GUI时更新的按钮
  • 创建一个新的Tkinter.Label小部件,将其文本设置为在1中获得的值,并在GUI中增加相应的行
  • 我更喜欢在包含构造函数的类中组织代码,在构造函数中初始化
    Main\u Q
    ,以便调用
    initialize\u user\u interface()

        def __init__(self, parent):
                Tkinter.Frame.__init__(self, parent)
                self.parent = parent
                self.Main_Q = ["read", "clean dishes", "wash car"]
                self.r = 0 # position of the row of each label
                self.initialize_user_interface()
    
    方法
    initialize\u user\u interface()
    按照其名称执行。我们主要绑定函数
    update\u gui()
    ,该函数使用
    command=self.update\u gui

    ef initialize_user_interface(self):
            self.parent.title("Update GUI")
            self.parent.grid_rowconfigure(0, weight = 1)
            self.parent.grid_columnconfigure(0, weight = 1)
    
            for e in self.Main_Q:
                Tkinter.Label(self.parent, anchor = Tkinter.W, text = e).grid(row = self.r, sticky = Tkinter.W)
                self.r+=1
            self.entry_text = Tkinter.Entry(self.parent)
            self.entry_text.grid(row = 0, column = 1)
            self.button_update = Tkinter.Button(self.parent, text = "Update", command = self.update_gui).grid(row = 1, column = 1, sticky = Tkinter.E)
    
    最后,没有什么比
    update\u gui()
    函数更简单的了:

    def update_gui(self):
            self.r+=1 # increment the row reserved to the new label
            self.Main_Q.append(self.entry_text.get())
            Tkinter.Label(self.parent, anchor = Tkinter.W, text = self.entry_text.get()).grid(row = self.r, sticky = Tkinter.W)
    
    编程应用程序: 以下是完整的程序:

    '''
    Created on Mar 11, 2016
    
    @author: Bill BEGUERADJ
    '''
    import Tkinter
    
    
    class Begueradj(Tkinter.Frame):
        def __init__(self, parent):
            Tkinter.Frame.__init__(self, parent)
            self.parent = parent
            self.main_queue = ["read", "clean dishes", "wash car"]
            self.r = 0
            self.initialize_user_interface()
    
    
        def initialize_user_interface(self):
            self.parent.title("Update GUI")
            self.parent.grid_rowconfigure(0, weight = 1)
            self.parent.grid_columnconfigure(0, weight = 1)
    
            for e in self.main_queue:
                Tkinter.Label(self.parent, anchor = Tkinter.W, text = e).grid(row = self.r, sticky = Tkinter.W)
                self.r+=1
            self.entry_text = Tkinter.Entry(self.parent)
            self.entry_text.grid(row = 0, column = 1)
            self.button_update = Tkinter.Button(self.parent, text = "Update", command = self.update_gui).grid(row = 1, column = 1, sticky = Tkinter.E)
    
        def update_gui(self):
            self.r+=1
            self.main_queue.append(self.entry_text.get())
            Tkinter.Label(self.parent, anchor = Tkinter.W, text = self.entry_text.get()).grid(row = self.r, sticky = Tkinter.W)
    
    
    def main():
        root = Tkinter.Tk()
        b = Begueradj(root)
        root.mainloop()
    
    if __name__ == "__main__":
        main()
    
    演示: 以下是正在运行的程序的屏幕截图:

    注: 我使用Python2.7编写了前面的程序,因此如果您想测试它,请将
    Tkinter
    更改为
    Tkinter
    。其他一切都保持不变。

    设计: 要解决您的问题,您需要设计以下简单的解决方案:

  • 使用方法检索
    Tkinter.Entry
    小部件的文本
  • 使用方法将1中的文本添加到
    Main\Q
  • 使用方法绑定在单击
    Main\Q
    和GUI时更新的按钮
  • 创建一个新的Tkinter.Label小部件,将其文本设置为在1中获得的值,并在GUI中增加相应的行
  • 我更喜欢在包含构造函数的类中组织代码,在构造函数中初始化
    Main\u Q
    ,以便调用
    initialize\u user\u interface()

        def __init__(self, parent):
                Tkinter.Frame.__init__(self, parent)
                self.parent = parent
                self.Main_Q = ["read", "clean dishes", "wash car"]
                self.r = 0 # position of the row of each label
                self.initialize_user_interface()
    
    方法
    initialize\u user\u interface()
    按照其名称执行。我们主要绑定函数
    update\u gui()
    ,该函数使用
    command=self.update\u gui

    ef initialize_user_interface(self):
            self.parent.title("Update GUI")
            self.parent.grid_rowconfigure(0, weight = 1)
            self.parent.grid_columnconfigure(0, weight = 1)
    
            for e in self.Main_Q:
                Tkinter.Label(self.parent, anchor = Tkinter.W, text = e).grid(row = self.r, sticky = Tkinter.W)
                self.r+=1
            self.entry_text = Tkinter.Entry(self.parent)
            self.entry_text.grid(row = 0, column = 1)
            self.button_update = Tkinter.Button(self.parent, text = "Update", command = self.update_gui).grid(row = 1, column = 1, sticky = Tkinter.E)
    
    最后,没有什么比
    update\u gui()
    函数更简单的了:

    def update_gui(self):
            self.r+=1 # increment the row reserved to the new label
            self.Main_Q.append(self.entry_text.get())
            Tkinter.Label(self.parent, anchor = Tkinter.W, text = self.entry_text.get()).grid(row = self.r, sticky = Tkinter.W)
    
    编程应用程序: 以下是完整的程序:

    '''
    Created on Mar 11, 2016
    
    @author: Bill BEGUERADJ
    '''
    import Tkinter
    
    
    class Begueradj(Tkinter.Frame):
        def __init__(self, parent):
            Tkinter.Frame.__init__(self, parent)
            self.parent = parent
            self.main_queue = ["read", "clean dishes", "wash car"]
            self.r = 0
            self.initialize_user_interface()
    
    
        def initialize_user_interface(self):
            self.parent.title("Update GUI")
            self.parent.grid_rowconfigure(0, weight = 1)
            self.parent.grid_columnconfigure(0, weight = 1)
    
            for e in self.main_queue:
                Tkinter.Label(self.parent, anchor = Tkinter.W, text = e).grid(row = self.r, sticky = Tkinter.W)
                self.r+=1
            self.entry_text = Tkinter.Entry(self.parent)
            self.entry_text.grid(row = 0, column = 1)
            self.button_update = Tkinter.Button(self.parent, text = "Update", command = self.update_gui).grid(row = 1, column = 1, sticky = Tkinter.E)
    
        def update_gui(self):
            self.r+=1
            self.main_queue.append(self.entry_text.get())
            Tkinter.Label(self.parent, anchor = Tkinter.W, text = self.entry_text.get()).grid(row = self.r, sticky = Tkinter.W)
    
    
    def main():
        root = Tkinter.Tk()
        b = Begueradj(root)
        root.mainloop()
    
    if __name__ == "__main__":
        main()
    
    演示: 以下是正在运行的程序的屏幕截图:

    注:
    我使用Python2.7编写了前面的程序,因此如果您想测试它,请将
    Tkinter
    更改为
    Tkinter
    。其他一切都一样。

    下午好,森斯4。谢谢你的评论和指导。我做了你让我做的,就是把for循环放到“update”按钮中。它现在正在for循环中更新,但仍然没有打印我输入的内容。例如,如果我输入“shower”,它将打印“PY_VAR1”。在空闲状态下,它正在打印”。再次感谢。在解决了这个问题之后,我将开始学习如何使用“销毁”功能和重新打印