Python Tkinter Treeview未显示新插入的项目,未给出错误
我正在构建一个桌面应用程序,它允许您在表单中插入一些数据,然后数据将显示在一系列Treeview小部件中。 这是我用来输入新数据的表单: 它位于顶级小部件中。当按下Add按钮时,新数据存储在一个文件中,它还应该将新数据插入相应的Treeview小部件中。 这是根窗口: 它由3个Treeview小部件组成。应用程序的目的是让用户有机会将候选项排序到正确的Treeview小部件中。 我面临的问题是,当按下Add按钮时,新数据不会显示在Treeview小部件中,也不会给出错误。我认为这可能是类实例化的问题这是我的应用程序的摘录,请参见下面一个简单、完整且可验证的示例Python Tkinter Treeview未显示新插入的项目,未给出错误,python,tkinter,treeview,Python,Tkinter,Treeview,我正在构建一个桌面应用程序,它允许您在表单中插入一些数据,然后数据将显示在一系列Treeview小部件中。 这是我用来输入新数据的表单: 它位于顶级小部件中。当按下Add按钮时,新数据存储在一个文件中,它还应该将新数据插入相应的Treeview小部件中。 这是根窗口: 它由3个Treeview小部件组成。应用程序的目的是让用户有机会将候选项排序到正确的Treeview小部件中。 我面临的问题是,当按下Add按钮时,新数据不会显示在Treeview小部件中,也不会给出错误。我认为这可能是类实例
class MainApp(tk.Tk):
def __init__(self, *args, **kwargs):
...
# frame and menu classes are instantiated here
self.FrameList = {ViableCandidates: ViableCandidates(self),
NotViableCandidates: NotViableCandidates(self),
InProgressCandidates: InProgressCandidates(self)}
...
def InstanceLinker(self, frame):
link = self.FrameList[frame]
return link
class GUIMenu(tk.Menu):
def __init__(self, parent):
...
# menu code is here
addcandidates.add_command(label='Quick Add', command=lambda: QuickAdd(parent))
class QuickAdd(tk.Toplevel):
def __init__(self, parent):
...
# code for the small Toplevel window
...
# this is the code that I use to add the new item to Treeview when the Add button is pressed
if CandidateInfo['status'] == 'Viable':
app.InstanceLinker(ViableCandidates).AddtoList()
elif CandidateInfo['status'] == 'Not Viable':
app.InstanceLinker(NotViableCandidates).AddtoList()
else:
app.InstanceLinker(InProgressCandidates).AddtoList()
# ViableCandidates, NotViableCandidates, InProgressCandidates are created with the same pattern
class InProgressCandidates(tk.Frame):
def __init__(self, parent):
global Counter
tk.Frame.__init__(self, parent)
self.columnconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
title = tk.Label(self, text="Candidates In Progress", font="Verdana 10 bold")
title.grid(row=0, column=0, sticky='nesw')
self.tree = ttk.Treeview(self)
self.tree.grid(row=1, column=0, sticky='nesw')
scrollbar = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
scrollbar.grid(row=1, column=1, sticky='nws')
self.tree.config(columns=('Name', 'Date'), selectmode='browse', height=20, yscrollcommand=scrollbar.set)
self.tree.column('#0', width=20, minwidth=10, stretch=tk.YES)
self.tree.column('Name', width=150, minwidth=10, stretch=tk.YES)
self.tree.column('Date', width=80, minwidth=10, stretch=tk.YES)
self.tree.heading('#0', text='#', anchor=tk.W)
self.tree.heading('Name', text='Name', anchor=tk.W)
self.tree.heading('Date', text='Date', anchor=tk.W)
if Counter < 4:
Counter += 1
self.PopulateList()
def PopulateList(self):
selection = Database().SelectFromDB('name, date', "status = 'In progress'")
for i in range(len(selection)):
name = list(selection[i])[0]
date = adjusttotimezone(list(selection[i])[1])
self.tree.insert("", i, name, text=i + 1)
self.tree.set(name, 'Name', name)
self.tree.set(name, 'Date', date)
CandidateCounter['InProgressCandidates'] = i
def AddtoList(self):
CandidateCounter['InProgressCandidates'] += 1
print('I was here')
self.tree.insert("", CandidateCounter['InProgressCandidates'], CandidateInfo['name'],
text=CandidateCounter['InProgressCandidates'])
self.tree.set(CandidateInfo['name'], 'Name', CandidateInfo['name'])
selection = Database().SelectFromDB('date', "name = '" + CandidateInfo['name'] + "'")
date = adjusttotimezone(list(selection[0])[0])
self.tree.set(CandidateInfo['name'], 'Date', date)
app = MainApp()
app.mainloop()
问题是您正在创建两个treeview小部件,然后将项目添加到不可见的小部件中 您可以在此处创建一个:
frame = InProgressCandidates(self)
self.FrameList = {InProgressCandidates:InProgressCandidates(self)}
然后在此处创建另一个:
frame = InProgressCandidates(self)
self.FrameList = {InProgressCandidates:InProgressCandidates(self)}
因为您已经创建了一个,所以您创建的应该是self.FrameList
:
self.FrameList = {InProgressCandidates:frame}
问题是您正在创建两个treeview小部件,然后将项目添加到不可见的小部件中 您可以在此处创建一个:
frame = InProgressCandidates(self)
self.FrameList = {InProgressCandidates:InProgressCandidates(self)}
然后在此处创建另一个:
frame = InProgressCandidates(self)
self.FrameList = {InProgressCandidates:InProgressCandidates(self)}
因为您已经创建了一个,所以您创建的应该是self.FrameList
:
self.FrameList = {InProgressCandidates:frame}
这不是一个真正的答案,但我把这个问题投了赞成票,因为它解决了我的一个问题。我想向小部件添加项目,但在完成填充树之前不想向用户显示它。但每一个插页都立即显示出来。现在,我创建了两个相同的小部件,一个可见,另一个不可见,一旦填充,我就在它们之间进行更改。因此,即使是一个错误也有好处。这不是一个真正的答案,但我把这个问题投了赞成票,因为它解决了我的一个问题。我想向小部件添加项目,但在完成填充树之前不想向用户显示它。但每一个插页都立即显示出来。现在,我创建了两个相同的小部件,一个可见,另一个不可见,一旦填充,我就在它们之间进行更改。因此,即使是一个错误也有好处。验证您的
滚动条是否正常工作*工作正常。当我添加新项目时,它不会做出反应,但在我重新运行代码并重新填充列表后,它工作正常。抱歉,我刚刚看到我上传的treeview图片中的项目数接近于激活滚动条。滚动条很好。当按下“Add”(添加)按钮时,无法将新项目添加到treeview的问题一直在发生(即使treeview中有1-2个项目),在发布的代码中至少存在一个缩进问题。我们还需要你发布一个。你发布的代码将不会运行,即使缩进是固定的。谢谢你的回复,我将使我的代码最小和可验证。我发布的代码是我认为与我的较大代码最相关的代码的摘录。请验证您的滚动条
是否正常工作*工作正常。当我添加新项目时,它不会做出反应,但在我重新运行代码并重新填充列表后,它工作正常。抱歉,我刚刚看到我上传的treeview图片中的项目数接近于激活滚动条。滚动条很好。当按下“Add”(添加)按钮时,无法将新项目添加到treeview的问题一直在发生(即使treeview中有1-2个项目),在发布的代码中至少存在一个缩进问题。我们还需要你发布一个。你发布的代码将不会运行,即使缩进是固定的。谢谢你的回复,我将使我的代码最小和可验证。我发布的代码是我认为与我的大代码最相关的内容的摘录。非常感谢。成功了。我是Python新手,刚才我意识到,当在字典中将类用作值时,它实际上会创建一个新实例。我认为它实际上会使用刚才实例化的实例。非常感谢,非常感谢。成功了。我是Python新手,刚才我意识到,当在字典中将类用作值时,它实际上会创建一个新实例。我认为它实际上会使用刚才实例化的实例。非常感谢。如果这不是一个答案,就写下来作为评论。如果这不是一个答案,就写下来作为评论。