python tkinter附加列表
我是一名业余python程序员,有2个月的经验。我正试图通过tkinter编写GUI待办事项列表。按钮的实际位置并不重要。之后我可以玩这些。我需要一些帮助来显示列表中的附加项。在程序中,它在数字上更新良好,但不会打印到列表上。我在控制台上仔细检查了它,它显示“0x102fa4048处的tkinter.StringVar对象”,但没有更新实际列表。我需要的帮助是如何更新标签列上的列表Main_Q?非常感谢一些指导和编码帮助。谢谢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
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()
Tkinter.Entry
小部件的文本Main\Q
Main\Q
和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”。在空闲状态下,它正在打印”。再次感谢。在解决了这个问题之后,我将开始学习如何使用“销毁”功能和重新打印