【问题标题】:Python Tkinter Treeview fixed width with variable SQL queryPython Tkinter Treeview 固定宽度和可变 SQL 查询
【发布时间】:2018-10-25 11:26:18
【问题描述】:

抱歉,如果之前已经回答过这个问题,但我找不到任何关于这些细节的信息。

我正在为我正在工作的团队完成一个查询工具,他们可以选择字段来查询数据库和搜索字符串(以及其他选项)。

结果被发送到 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 的宽度,使其不超过某个宽度? 还是我需要将可用宽度拆分为从查询中获得的列数?

我真的不在乎所有信息是否都显示在屏幕上,因此我放置了滚动条。

以下是问题的截图:

感谢您的帮助!

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

【问题讨论】:

  • 问题已解决。事实证明,列大小变量使用的是固定宽度,基本上是应用程序的宽度,因此它会扩展到该大小之外。因此,对于 Treeview,您确实需要注意列的大小。

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


【解决方案1】:

下面的示例演示了如何为columnsminwithmaxwidth 设置宽度,这需要integers。您还可以使用rowheight 属性设置行的高度,以便您的文本在树中很好地显示。

import tkinter as tk
from tkinter import ttk


root = tk.Tk()


tree = ttk.Treeview(root, column=("col1","col2"), show="headings")

style = ttk.Style(root)
style.configure('my.Treeview', rowheight=50)
tree.configure(style='my.Treeview')



tree.heading("#0", text="COMPANY NAME")
tree.heading("#1", text="DEPARTMENT")
tree.heading("#2", text="BRANCH")

tree.column("#0", stretch=tk.NO, minwidth=100, width=000)
tree.column("#1", stretch=tk.NO, minwidth=100, width=400)
tree.column("#2", stretch=tk.NO, minwidth=100, width=400)

tree.insert("", tk.END, values=("Am using python version 3.6.1 \n on windows machine  ", "This an example Tkinter Treeview in Python, which is from \nttk class make"))
tree.insert("", tk.END, values=("This an example Tkinter Treeview in Python, which is from \nttk class make sure #import ttk\n also from tkinter import *", "Apologies if this was answered before but I cannot find "))


tree.pack()
root.mainloop()

【讨论】:

  • 感谢您的意见。我确实使用您的代码进行了一些更改,主要是按照标题->列->插入的出现顺序,这似乎使它更具可读性。问题仍然存在于 Treeview 扩展到 LabelFrame 之外,我认为这与我使用 for 循环在 Treeeview 中插入行的事实有关。我添加了滚动条,但据我所知,它们的尺寸最小,我只能向上/向下滚动。
  • 如果它超出labelframe,则最小化column的宽度
猜你喜欢
  • 1970-01-01
  • 2012-02-25
  • 2018-10-08
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
相关资源
最近更新 更多