首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tkinter treeview python中列标题的工具提示

Tkinter treeview python中列标题的工具提示
EN

Stack Overflow用户
提问于 2022-08-02 12:06:13
回答 1查看 333关注 0票数 2

当用户在treeview(工具提示)中的列标题上方盘旋时,我试图显示完整的标题名称。我让它在按钮/标签窗口小部件上显示文本,但列标题没有显示结果。你能帮我举几个例子吗?下面的代码没有出现错误,但它没有显示标题中使用lambda命令的标题的全名.

代码语言:javascript
运行
复制
import re
import webbrowser
from tkinter.tix import Balloon
import pandas as pd
import psycopg2
import os.path
from tkinter import *
from tkinter import ttk, messagebox
from tkinter import tix
from idlelib.tooltip import Hovertip
from datetime import datetime
import pyperclip
import sys

path = r'G:\MOTOR\EC\MOTOR-2909415798-Blast contacts book GUI'
os.chdir(path)
cwd = os.getcwd()
print(cwd)

# Create a GUI frame
root = Tk()
root.title('Blast Contacts')
root.iconbitmap(r'G:\MOTOR\EC\MOTOR-2909415798-Blast contacts book GUI\download.ico')
root.geometry("1000x800")

# Add style
style = ttk.Style()
style.theme_use('clam')

# Configure the Treeview colors
style.configure("Treeview",
                background="lightblue",
                foreground="black",
                rowheight=35,
                fieldbackground="D3D3D3")
# Change selected color
style.map('Treeview', background=[('selected', '#347083')])

# Connect to the Contact DB
conn = psycopg2.connect(host='rr18xz3319w4czb.cydjxinfag3j.us-east-1.rds.amazonaws.com', database='DPCAMOTR',
                        user='echoi', password='lfwr941jfJ', options="-c search_path=dbo,public")
cursor = conn.cursor()


# Query the Contacts on initialization and refresh
def query_contacts():

    # Connect to the Contact DB
    conn = psycopg2.connect(host='rr18xz3319w4czb.cydjxinfag3j.us-east-1.rds.amazonaws.com', database='DPCAMOTR',
                            user='echoi', password='lfwr941jfJ', options="-c search_path=dbo,public")
    cursor = conn.cursor()

    # clear the Treeview
    for record in my_tree.get_children():
        my_tree.delete(record)
    # retrieve the contact sql
    sql_file = open('Blast_Contacts_scripts_for GUI_v2.sql')
    query = sql_file.read()
    contacts_query = pd.read_sql_query(query, conn)

    # change df to list
    records = contacts_query.values.tolist()

    # add the contacts sql output to the screen
    global count
    count = 1
    for record in records:
        if count % 2 == 0:
            my_tree.insert(parent='', index='end', iid=count, text="", values=(
                count, record[0], record[1], record[2], record[3], record[4], record[5], record[6], record[7],
                record[8], record[9], record[10],
                record[11], record[12], record[13], record[14], record[15], record[16], record[17], record[18],
                record[19], record[20]),
                           tags=('evenrow',))
        else:
            my_tree.insert(parent='', index='end', iid=count, text="", values=(
                count, record[0], record[1], record[2], record[3], record[4], record[5], record[6], record[7],
                record[8], record[9], record[10],
                record[11], record[12], record[13], record[14], record[15], record[16], record[17], record[18],
                record[19], record[20]),
                           tags=('oddrow',))
        count += 1

    conn.close()

def tooltip(tv, col):
    print("clicked")
    if col == 'TB':
        tooltip = Hovertip(col, 'TEST BLAST', hover_delay=100)
    elif col == 'AP':
        tooltip = Hovertip(col, 'AFFIRM PEND', hover_delay=100)
    elif col == 'GU':
        tooltip = Hovertip(col, 'GSCC UNCOMPARED', hover_delay=100)
    elif col == 'CB':
        tooltip = Hovertip(col, 'CLIENT BLAST', hover_delay=100)
    elif col == 'DB':
        tooltip = Hovertip(col, 'DEALER BLAST', hover_delay=100)
    elif col == 'CD':
        tooltip = Hovertip(col, 'CMU DEALER', hover_delay=100)
    elif col == 'PE':
        tooltip = Hovertip(col, 'PREMATCH ECLR', hover_delay=100)
    elif col == 'PF':
        tooltip = Hovertip(col, 'PREMATCH FED', hover_delay=100)
    elif col == 'FT':
        tooltip = Hovertip(col, 'FAIL TRADES', hover_delay=100)
    elif col == 'PB':
        tooltip = Hovertip(col, 'PARTIALS BLAST', hover_delay=100)
    elif col == 'DK':
        tooltip = Hovertip(col, 'DTCC_DK BLAST', hover_delay=100)
    elif col == 'SE':
        tooltip = Hovertip(col, 'SALES ESCALATION', hover_delay=100)


    # blastname_tooltip = Button(root)
    # tooltip = Hovertip(blastname_tooltip, 'GSCC Uncompared', hover_delay=100)
    # blastname_tooltip.place(x=1140, y=160)
    # bc = my_tree.identify_column(event.x)
    # print(bc)
    #region = my_tree.identify("region", event.x, event.y)

    # x, y = event.x, event.y
    # if 1000 < x < 1030 and 0 < y < 30:
    # popup_blastName = Menu(my_tree, tearoff=0)
    # popup_blastName.add_command(label="Test Blast")
    # popup_blastName.tk_popup(event.x_root, event.y_root)


    #my_tree.bind('<Double-1>', tooltip)
    #tv.heading(col, text=col, command=lambda _col=col: tooltip(tv, _col, event))


# Create a Treeview frame
tree_frame = Frame(root)
tree_frame.pack(side=BOTTOM)

# Create a right Treeview scrollbar
tree_scroll = Scrollbar(tree_frame)
tree_scroll.pack(side=RIGHT, fill=Y)
# Create a bottom Treeview scrollbar
tree_scroll_bottom = Scrollbar(tree_frame, orient='horizontal')
tree_scroll_bottom.pack(side=BOTTOM, fill=X)

# Create the Treeview
my_tree = ttk.Treeview(tree_frame, xscrollcommand=tree_scroll_bottom.set, yscrollcommand=tree_scroll.set,
                       selectmode="extended", show='headings', height=11)
my_tree.pack()
# Configure the scrollbar
tree_scroll.config(command=my_tree.yview)
tree_scroll_bottom.config(command=my_tree.xview)

# Make a function for sorting columns by ascending/descending
def sort_column(tv, col, reverse: bool):
    try:
        data_list = [(int(my_tree.set(k, col).replace(',', '')), k) for k in my_tree.get_children("")]
    except Exception:
        data_list = [(my_tree.set(k, col), k) for k in my_tree.get_children("")]

    data_list.sort(reverse=reverse)

    for index, (val, k) in enumerate(data_list):
        my_tree.move(k, "", index)

    # reverse sort next time
    tv.heading(col, text=col, command=lambda _col=col: sort_column(tv, _col, not reverse))

    # retag rows after sorting
    tag = 'oddrow'
    for k in my_tree.get_children(""):
        tag = 'oddrow' if tag == 'evenrow' else 'evenrow'
        my_tree.item(k, tags=(tag,))

    # reindexing after sorting
    global count
    count = 1
    for k in my_tree.get_children(""):
        reindex = my_tree.item(k, 'values')
        # save new data
        my_tree.item(k, values=(
            count, reindex[1], reindex[2], reindex[3], reindex[4], reindex[5], reindex[6], reindex[7], reindex[8],
            reindex[9], reindex[10], reindex[11], reindex[12], reindex[13], reindex[14], reindex[15], reindex[16],
            reindex[17], reindex[18], reindex[19], reindex[20], reindex[21]))
        count += 1


# Define columns
my_tree['columns'] = ("ID",
                      "CC",
                      "ACCOUNT_NAME",
                      "BLAST_EMAIL",
                      "SALES_EMAIL",
                      "TB",
                      "AP",
                      "GU",
                      "CB",
                      "DB",
                      "CD",
                      "M_S",
                      "PE",
                      "PF",
                      "FT",
                      "PB",
                      "DK",
                      "SE",
                      "COMMENTS",
                      "AUDIT",
                      "A",
                      "CONTACTS_ID"
                      )
# Format columns
my_tree.column("#0", width=0, stretch=NO)
my_tree.column("ID", anchor=CENTER, width=40)
my_tree.column("CC", anchor=CENTER, width=50)
my_tree.column("ACCOUNT_NAME", anchor=W, width=400)
my_tree.column("BLAST_EMAIL", anchor=W, width=300)
my_tree.column("SALES_EMAIL", anchor=W, width=300)
my_tree.column("TB", anchor=CENTER, width=30)
my_tree.column("AP", anchor=CENTER, width=30)
my_tree.column("GU", anchor=CENTER, width=30)
my_tree.column("CB", anchor=CENTER, width=30)
my_tree.column("DB", anchor=CENTER, width=30)
my_tree.column("CD", anchor=CENTER, width=30)
my_tree.column("M_S", anchor=CENTER, width=35)
my_tree.column("PE", anchor=CENTER, width=30)
my_tree.column("PF", anchor=CENTER, width=30)
my_tree.column("FT", anchor=CENTER, width=30)
my_tree.column("PB", anchor=CENTER, width=30)
my_tree.column("DK", anchor=CENTER, width=30)
my_tree.column("SE", anchor=CENTER, width=30)
my_tree.column("COMMENTS", anchor=W, width=300)
my_tree.column("AUDIT", anchor=W, width=200)
my_tree.column("A", anchor=CENTER, width=40)
my_tree.column("CONTACTS_ID", anchor=CENTER, width=100)

# Create headings
my_tree.heading("#0", text="", anchor=CENTER)
my_tree.heading("ID", text="ID", anchor=CENTER)
my_tree.heading("CC", text="CC", anchor=CENTER,
                command=lambda _col="CC": sort_column(my_tree, _col, False))
my_tree.heading("ACCOUNT_NAME", text="ACCOUNT_NAME", anchor=CENTER,
                command=lambda _col="ACCOUNT_NAME": sort_column(my_tree, _col, False))
my_tree.heading("BLAST_EMAIL", text="BLAST_EMAIL", anchor=CENTER,
                command=lambda _col="BLAST_EMAIL": sort_column(my_tree, _col, False))
my_tree.heading("SALES_EMAIL", text="SALES_EMAIL", anchor=CENTER,
                command=lambda _col="SALES_EMAIL": sort_column(my_tree, _col, False))
my_tree.heading("TB", text="TB", anchor=CENTER,
                command=lambda _col="TB": tooltip(my_tree, _col))
my_tree.heading("AP", text="AP", anchor=CENTER,
                command=lambda _col="AP": tooltip(my_tree, _col))
my_tree.heading("GU", text="GU", anchor=CENTER,
                command=lambda _col="GU": tooltip(my_tree, _col))
my_tree.heading("CB", text="CB", anchor=CENTER,
                command=lambda _col="CB": tooltip(my_tree, _col))
my_tree.heading("DB", text="DB", anchor=CENTER,
                command=lambda _col="DB": tooltip(my_tree, _col))
my_tree.heading("CD", text="CD", anchor=CENTER,
                command=lambda _col="CD": tooltip(my_tree, _col))
my_tree.heading("M_S", text="M_S", anchor=CENTER)
my_tree.heading("PE", text="PE", anchor=CENTER,
                command=lambda _col="PE": tooltip(my_tree, _col))
my_tree.heading("PF", text="PF", anchor=CENTER,
                command=lambda _col="PF": tooltip(my_tree, _col))
my_tree.heading("FT", text="FT", anchor=CENTER,
                command=lambda _col="FT": tooltip(my_tree, _col))
my_tree.heading("PB", text="PB", anchor=CENTER,
                command=lambda _col="PB": tooltip(my_tree, _col))
my_tree.heading("DK", text="DK", anchor=CENTER,
                command=lambda _col="DK": tooltip(my_tree, _col))
my_tree.heading("SE", text="SE", anchor=CENTER,
                command=lambda _col="SE": tooltip(my_tree, _col))
my_tree.heading("COMMENTS", text="COMMENTS", anchor=CENTER,
                command=lambda _col="COMMENTS": sort_column(my_tree, _col, False))
my_tree.heading("AUDIT", text="AUDIT", anchor=CENTER,
                command=lambda _col="AUDIT": sort_column(my_tree, _col, False))
my_tree.heading("A", text="A", anchor=CENTER)
my_tree.heading("CONTACTS_ID", text="CONTACTS_ID", anchor=CENTER)

# Run to pull the SR data from the SQLIte on start
query_contacts()
root.mainloop()
EN

回答 1

Stack Overflow用户

发布于 2022-08-02 18:42:19

像这样的东西对你有用吗?当鼠标越过标题时,我只需打印坐标就可以找到感兴趣的区域,然后根据标题的坐标使用回调函数bind“工具提示”。

代码语言:javascript
运行
复制
from tkinter import ttk
from tkinter import tix

root = tix.Tk()
root.geometry('600x600')

columns = 'something'

tip = tix.Balloon(root)

tree = ttk.Treeview(root, columns=columns, show='headings')
tree.grid(row=0, column=0, sticky='nsew')

tree.heading('something', text='something title')
    
    
def manage_tooltip(event):
    x, y = event.x, event.y
    if 0 < x < 200 and 0 < y < 25:
        tip.bind_widget(tree, balloonmsg="tooltip message goes here")
    else:
        tip.unbind_widget(tree)
        

root.bind('<Motion>', manage_tooltip)

root.mainloop()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73207267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档