我是一位有两个月经验的业余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()
答案 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
一些附加说明:
对于条目,更容易分离定义和放置:
b = Entry(root)
b.grid(row=7,column=0)
因为Entry()返回其实例,您可以使用它来获取文本:
b.get()
如果你去购物,你会把所有东西放在一个袋子里吗?
from tkinter import *
确实是(在这种情况下,globals()变量将是包)。如果你想了解更多关于Importing Python Modules的信息。为了防止这种情况并缩短要输入的字母数量:
import tkinter as t # or tk
root = t.Tk()
*但是可以肯定的是,如果你只想要一个小程序,那就没关系。
答案 1 :(得分:0)
要解决您的问题,您需要设计这个简单的解决方案:
get()
方法检索Tkinter.Entry
窗口小部件的文本。append()
方法将 1 中的文字添加到Main_Q
。command
方法绑定更新的按钮Main_Q
和您的GUI。我更喜欢在包含构造函数的类中组织代码,其中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()
以下是正在运行的程序的屏幕截图:
我使用Python 2.7编写了以前的程序,因此如果您想对其进行测试,请将Tkinter
更改为tkinter
。其他一切都是一样的。