ttk菜单不支持

2024-06-25 22:42:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个简单的弹出消息,当鼠标进入图标时显示图标表示的选项的名称,当鼠标离开时隐藏。你知道吗

这些图标是按钮中的图像,我已经能够在使用菜单小部件输入按钮时显示消息,但是当鼠标离开按钮时,它不会取消粘贴,除非出现咔嚓声。你知道吗

我试着删除层叠,但同样的情况发生了,不同的是,他菜单在那一刻没有文本。你知道吗

我也尝试过.destroy()菜单对象,但它什么也没做。你知道吗


from tkinter import *           
from tkinter import ttk         
from pyautogui import position  

Raiz = Tk()                                         
Raiz.title("Mi app")    
Ancho = Raiz.winfo_screenwidth()                    
Alto = Raiz.winfo_screenheight()                    
Raiz.geometry("{}x{}".format(Ancho, Alto))          
Raiz.config(bg="#F4F4F4")                           


def Despliega(Texto):
    global MenuDesplegable

    MenuDesplegable = Menu(master=None, tearoff=0, activebackground='#F0F0F0')
    MenuDesplegable.add_cascade(label=Texto)
    MenuDesplegable.post(position().x, position().y)


def Repliega():
    global MenuDesplegable
    #MenuDesplegable.delete(0) -- dosen't work
    #MenuDesplegable.unpost() -- dosen't work
    #MenuDesplegable.destroy() -- dosen't work




Raiz.columnconfigure(0, weight=1)

BarraMenu = Frame(Raiz, bg="light grey", height=50, width="{}".format(Ancho),               
                    bd="4", relief="groove")

BarraMenu.grid(row=0, column=0, sticky="nsew")

I_Abrir = PhotoImage(file="Abrir.png")
B_Abrir = Button(BarraMenu, bg="light grey", image=I_Abrir, bd=0)
B_Abrir.grid(row=0, column=0, padx=10)
B_Abrir.bind('<Enter>', lambda event: Despliega('Abrir'))
B_Abrir.bind('<Leave>', lambda event: Repliega())


I_Nuevo = PhotoImage(file="Nuevo.png")
B_Nuevo = Button(BarraMenu, bg="light grey", image=I_Nuevo, bd=0)
B_Nuevo.grid(row=0, column=1, padx=10)
B_Nuevo.bind('<Enter>', lambda event: Despliega('Nuevo'))
B_Nuevo.bind('<Leave>', lambda event: Repliega())


Raiz.mainloop()

如果有人能理解为什么它不能像我描述的那样工作,那就太好了。 另外,如果有人知道一种方式来显示消息有点延迟,请给我看。你知道吗


Tags: lambdafromevent消息bind菜单按钮图标
2条回答

您可以创建一个类,将小部件和消息作为参数,然后应用于任何需要该信息的小部件。你知道吗

import tkinter as tk

root = tk.Tk()

class CreateToolTip:
    def __init__(self, widget, text='widget info'):
        self.waittime = 100 #500     #miliseconds
        self.wraplength = 180   #pixels
        self.widget = widget
        self.text = text
        self.widget.bind("<Enter>", self.enter)
        self.widget.bind("<Leave>", self.leave)
        self.widget.bind("<ButtonPress>", self.leave)
        self.id = None
        self.tw = None

    def enter(self, event=None):
        self.schedule()

    def leave(self, event=None):
        self.unschedule()
        self.hidetip()

    def schedule(self):
        self.unschedule()
        self.id = self.widget.after(self.waittime, self.showtip)

    def unschedule(self):
        id = self.id
        self.id = None
        if id:
            self.widget.after_cancel(id)

    def showtip(self, event=None):
        x = y = 0
        x, y, cx, cy = self.widget.bbox("insert")
        x += self.widget.winfo_rootx() + 25
        y += self.widget.winfo_rooty() + 40
        # creates a toplevel window
        self.tw = tk.Toplevel(self.widget)
        # Leaves only the label and removes the app window
        self.tw.wm_overrideredirect(True)
        self.tw.wm_geometry("+%d+%d" % (x, y))
        label = tk.Label(self.tw, text=self.text, justify='left',
                       background="#ffffff", relief='solid', borderwidth=1,
                       wraplength = self.wraplength)
        label.pack(ipadx=1)

    def hidetip(self):
        tw = self.tw
        self.tw= None
        if tw:
            tw.destroy()

a = tk.Button(root,text="Something")
a.pack()
CreateToolTip(a,"This is something button")
b = tk.Button(root,text="Another")
b.pack()
CreateToolTip(b,"This is another button")

root.mainloop()

通常Windows不识别unpost命令(有关详细信息:https://www.tcl.tk/man/tcl8.6/TkCmd/menu.htm#M45&;https://wiki.tcl-lang.org/page/How+do+you+unpost+a+menu

我提出的解决方案如下:

def Despliega(Texto):
    global MenuDesplegable
    MenuDesplegable = Label(master=None, bg="#F4F4F4", text=str(Texto),relief='ridge', bd=3, width=len(Texto)+2)
    x = Raiz.winfo_pointerx()
    y = Raiz.winfo_pointery()
    abs_coord_x = Raiz.winfo_pointerx() - Raiz.winfo_rootx()
    abs_coord_y = Raiz.winfo_pointery() - Raiz.winfo_rooty()
    MenuDesplegable.place(x = abs_coord_x, y = abs_coord_y)


def Repliega():
    global MenuDesplegable

    MenuDesplegable.destroy()

这两个方法在coursor进入其中一个按钮时将Tkinter.Label放置在鼠标位置,并在释放该按钮时将其解除锁定。你知道吗

它工作得很好,但当鼠标放在标签上时,它很少做事情。你知道吗

相关问题 更多 >