python tkinter追加清单

时间:2016-02-27 07:40:14

标签: python list tkinter append

我是一位有两个月经验的业余python程序员。我试图通过tkinter编写GUI待办事项列表。按钮的实际位置并不重要。我可以跟那些玩。我需要一些帮助,将附加项目显示在列表中。在程序中,它在数字上很好地更新,但它不会打印到列表上。我在控制台上仔细检查了它,它在" tkinter.StringVar对象位于0x102fa4048"但没有更新实际列表。我需要帮助的是如何在标签栏上更新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()

2 个答案:

答案 0 :(得分:0)

您的问题是,每次输入新的"任务"后,您的for循环会构建您的标签。要轻松解决此问题,您可以将此循环移动到更新功能中。

如果您希望每次都能阻止循环访问窗口小部件,您可以创建一个包含已创建的所有窗口小部件的新列表:

createdWidgets = []
widgetsQueue = []

在您的更新功能中,您不必遍历widgetsQueue(例如widgetsQueue.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

一些附加说明:

  1. 对于条目,更容易分离定义和放置:

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

    因为Entry()返回其实例,您可以使用它来获取文本:

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

    from tkinter import *
    

    确实是(在这种情况下,globals()变量将是包)。如果你想了解更多关于Importing Python Modules的信息。为了防止这种情况并缩短要输入的字母数量:

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

答案 1 :(得分:0)

设计

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

  1. 使用get()方法检索Tkinter.Entry窗口小部件的文本。
  2. 使用append()方法将 1 中的文字添加到Main_Q
  3. 使用command方法绑定更新的按钮Main_Q和您的GUI。
  4. 创建一个新的Tkinter.Label小部件,将其文本设置为1中的值,并在GUI中增加其对应的行。
  5. 我更喜欢在包含构造函数的类中组织代码,其中Main_Q已初始化,以便我们调用initialize_user_interface()以使用其三个元素初始化GUI:

        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_user_interface()正如其名称所说的那样。我们主要绑定函数update_gui(),该函数将文本集插入新标签,使用Tkinter.Entry

    将用户在command = self.update_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_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()
    

    演示:

    以下是正在运行的程序的屏幕截图:

    enter image description here

    注意:

    我使用Python 2.7编写了以前的程序,因此如果您想对其进行测试,请将Tkinter更改为tkinter。其他一切都是一样的。