Python Tkinter Treeview具有可变SQL查询的固定宽度

时间:2018-10-25 11:26:19

标签: python sql python-3.x tkinter treeview

很抱歉,如果以前已回答过这个问题,但我找不到这些细节。

我正在为与我合作的团队准备一个查询工具,他们可以在其中选择字段以查询数据库并搜索字符串(以及其他选项)。

结果将发送到Tkinter TreeView小部件(发现这是事件控制和可视化方面的最佳方法)。

我有一个主要问题,就是无论用户选择多少字段,都将Treeview的大小限制为一定的宽度。由于完整的GUI不可扩展,因此我希望Treeview具有最大大小。

我试图在定义列时包括宽度,但是似乎绕过了它。

Treeview是LabelFrame的子级,其位置由网格定义。

这是我正在设置TreeView的代码示例(由于这是公司应用程序,因此在公开某些字段名称时必须格外小心):

CoreQuery.groupResults = LabelFrame(CoreQuery.root, text="Query Result", padx=5, pady=5, height=470,width=960)
CoreQuery.tree = ttk.Treeview(CoreQuery.groupResults, selectmode='browse')
CoreQuery.tree.bind("<Double-1>", CoreQuery.OnTreeDoubleClick)

CoreQuery.scrollbar_horizontal = ttk.Scrollbar(CoreQuery.root, orient='horizontal', command=CoreQuery.tree.xview)
CoreQuery.scrollbar_vertical = ttk.Scrollbar(CoreQuery.root, orient='vertical', command=CoreQuery.tree.yview)
CoreQuery.tree.config(height=18, xscrollcommand=CoreQuery.scrollbar_horizontal.set, yscrollcommand=CoreQuery.scrollbar_vertical.set)

CoreQuery.tree.grid(row=0, sticky="w")
CoreQuery.scrollbar_horizontal.grid(row=1,column=0, sticky='ns')
CoreQuery.scrollbar_vertical.grid(row=0, column=2, sticky='ew')

CoreQuery.scrollbar_horizontal.configure(command=CoreQuery.tree.xview)
CoreQuery.scrollbar_vertical.configure(command=CoreQuery.tree.yview)

CoreQuery.tree.configure(yscroll=CoreQuery.scrollbar_vertical, xscroll=CoreQuery.scrollbar_horizontal)

以下是接收SQL查询结果并将数据放置在TreeView中的方法:

    def ScreenPrintResults(header,rows):

        columns=len(header)
        minColumnsize=math.ceil(965/columns)

        #Clear Treeview
        CoreQuery.tree.delete(*CoreQuery.tree.get_children())

        for values in rows:
            values[0] = str(values[0]).replace(".0", "")
            if (values[0].isdigit()):
                values[0] = int(values[0])

        auxCount=0

        CoreQuery.tree['columns']=header

        for value in header:
            CoreQuery.tree.heading(value, text=str(value))
            CoreQuery.tree.column(value, stretch=tk.NO)

        for items in rows:
            if auxCount==0:
                CoreQuery.tree.column('#0', width=30, stretch=tk.NO)
            else:
                CoreQuery.tree.column(value, width=minColumnsize)

            CoreQuery.tree.insert('',tk.END,auxCount+1,text=str(auxCount+1),
            values=list(items))
            auxCount=auxCount+1

        CoreQuery.updateMessage.config(foreground="Black", font="Verdana 10 bold")
        CoreQuery.message.set("...")

我可以添加TreeView的宽度以使其不超过一定宽度吗? 还是我需要将可用宽度划分为从查询中获得的列数?

老实说,我不在乎是否所有信息都在屏幕上,因此我放置了滚动条。

以下是问题的屏幕截图: Just a few columns Expands beyond the interface

感谢您的帮助!

编辑:更改了For循环代码,并添加了更多澄清该问题的屏幕截图

1 个答案:

答案 0 :(得分:0)

下面的示例演示如何为columnsminwith设置maxwidth的宽度。另外,您可以使用integers属性设置行的高度,以使文本在树中良好显示。

rowheight