问题描述
我不是菜鸟,但也不是很有经验。我正在使用 PyCharm 和 python 3.8。我正在尝试为我们的客户拼凑一个快速而肮脏的实用程序,以验证生产应用程序的输入文件。我听说过 python Tk,所以我在网上找到了一些代码,借用了它,并根据我的目的进行了修改。代码示例是业余的,但是数据没有显示在 ttk.TreeView 对象中。如果在 populate_data 函数结束时停止 PyCharm 调试器,代码段
for child in tree.get_children():
print(tree.item(child)["values"])
在 PyCharm 评估器中显示 TreeView 对象有子项。
我不明白为什么 TreeView 子项没有正确显示。这是我的丑陋代码示例。提供函数只是为了使代码可执行。 提前致谢。
存在问题的部分在 main() 和 populate_data 函数中。
from tkinter import ttk
from tkinter import messageBox
from tkinter import filedialog
from tkinter import simpledialog
from tkinter import *
import sys
import os
# designate default test environment
global execution_env
global db_server
execution_env = "Integration"
db_server = "autv-bitest01"
global header_list
header_list = ["Entity HCC ID","Entity Type","Issue Code","OE Flag","Effective Date","Override","Requestor","Date Dropped","Note"]
global base_window
base_window = None
global tree_frame
tree_frame = None
global tree
tree = None
global btn_env_text
btn_env_text = None
global btn_env
btn_env = None
global test_data
test_data = [
["A","val2","val3","x1","x2","x3","x3"],["B","asd2","asd3",["C","bbb3","bbb4",["D","ccc3","ccc4",["E","ddd3","ddd4",["F","Abb3","Abb4",["G","Bcc3","Bcc4",["H","Cdd3","Cdd4",["I","Dbb3","Dbb4",["J","Ecc3","Ecc4",["L","eee3","eee4","x3"]
]
def main():
"""
MAIN code
:return: NA
"""
# MAIN CODE -- function main -- MAIN CODE
global base_window
global tree_frame
global tree
global btn_env
global btn_env_text
global execution_env
global db_server
if (len(db_server) == 0) and (len(execution_env) == 0):
info_title = "OE Mass Order GUI"
msg = "Execution environment is required"
messageBox.showinfo(info_title,msg)
sys.exit()
base_window = Tk()
base_window.geometry("1400x500")
base_window.option_add('*background','yellow')
base_window.title("OE Mass Order GUI")
# label_text = StringVar()
# label_text.set("ENVIRONMENT: " + execution_env + " (" + db_server + ")")
# label = Label(base_window,textvariable=label_text,relief=RAISED)
# label.pack(padx=10,pady=20,side=TOP)
btn_env_text = StringVar()
btn_env_text = "Set environment: " + execution_env + " (" + db_server + ")"
btn_env = Button(base_window,text=btn_env_text,command=perform_choose,height=2)
btn_env.pack(padx=10,side=TOP)
tree_frame = Frame(base_window)
tree_frame.pack(pady=20)
tree = ttk.Treeview(base_window,columns=(1,2,3,4,5,6,7,8,9),height=10,show="headings")
tree.heading(1,text="Entity HCC ID")
tree.heading(2,text="Entity Type")
tree.heading(3,text="Issue Code")
tree.heading(4,text="OE Flag")
tree.heading(5,text="Effective Date")
tree.heading(6,text="Override")
tree.heading(7,text="Requestor")
tree.heading(8,text="Date Dropped")
tree.heading(9,text="Note")
tree.column(1,width=150)
tree.column(2,width=150)
tree.column(3,width=150)
tree.column(4,width=150)
tree.column(5,width=150)
tree.column(6,width=150)
tree.column(7,width=150)
tree.column(8,width=150)
y_scroll = ttk.Scrollbar(base_window,orient=VERTICAL,command=tree.yview)
y_scroll.pack(side='right',fill='y')
tree.configure(yscrollcommand=y_scroll.set)
# wrap it up by loading data frame contents with test_data
populate_data(test_data) # populate tree data from test_data list
btn_frame = Frame(base_window)
btn_quit = Button(btn_frame,text="Quit",height=2,command=base_window.destroy)
btn_quit.pack(padx=10,side=LEFT)
btn_submit = Button(btn_frame,text="Submit")
btn_submit["command"] = perform_submit
btn_submit.pack(padx=10,side=LEFT)
btn_append = Button(btn_frame,text="Append")
btn_append["command"] = perform_append
btn_append.pack(padx=10,side=LEFT)
btn_import = Button(btn_frame,text="Import")
btn_import["command"] = perform_import
btn_import.pack(padx=10,side=LEFT)
btn_clear = Button(btn_frame,text="Clear")
btn_clear["command"] = perform_clear
btn_clear.pack(padx=10,side=LEFT)
btn_frame.pack(side=BottOM)
base_window.mainloop()
return
def populate_data(data_to_insert,debug_print=False):
global tree
my_data = data_to_insert
if len(data_to_insert) > 0:
for val in my_data:
tree.insert(parent='',index='end',values=(val[0],val[1],val[2],val[3],val[4],val[5],val[6],val[7],val[8])
)
# DEBUG BLOCK TO VIEW CONTENT OF treeview FRAME
if debug_print:
print("\n==========================")
for child in tree.get_children():
print(tree.item(child)["values"])
return
def perform_choose():
return
def perform_import():
return
def perform_clear():
return
def perform_append():
return
def perform_submit():
return
# --- THE REAL MAIN CODE ---
if __name__ == "__main__":
main()
# terminate
sys.exit()
解决方法
您尚未调用 tree.pack()
或 tree.grid()
,因此不会显示 tree
。另外我认为 tree
和 y_scroll
应该是 tree_frame
的孩子,而不是 base_window
。
...
# used tree_frame as parent instead of base_window
tree = ttk.Treeview(tree_frame,columns=(1,2,3,4,5,6,7,8,9),height=15,show="headings")
tree.pack(side="left",fill="both",expand=1)
...
# used tree_frame as parent instead of base_window
y_scroll = ttk.Scrollbar(tree_frame,orient=VERTICAL,command=tree.yview)
y_scroll.pack(side='right',fill='y')
...