Python
Всплывающая подсказка при наведении курсора в python
Мне нужно сделать так, чтобы когда юзер наводил курсор, например на ткинтеровсую кнопку, появлялось маленькое окошко с текстом (подсказка). Как это сделать?
Сделал вот это:
(программа в 40 строк с документацией, см. ниже)
Это можно импортировать как модуль, чтобы использовать для себя или запустить напрямую, чтобы посмотреть как демо того, как оно работает
Там есть функция, которая переопределяет tkinterовские классы.
Например, сделав Button=popup(Button), можно получить кнопку со всплывающей подсказкой. Дальше работает как обычная кнопка с теми же функциями и методами.
Код с отступами: https://pastebin.com/PW86c0q9
def popup(cls):
'''Функция переделки класса
Передайте ей как аргумент нужный класс (Button, Label, Frame...),
чтобы получить класс Popup (нужный класс со всплывающим окном)'''
class Popup(cls):
'''Переделанный класс
При создании укажите popup_text (при желании и popup_font) для
настройки всплывабщего сообщения'''
def __init__(self,master,cnf={},**kw):
from tkinter import Label as l
self.master=master; self.tk=master.tk #Tkinter
#Получить настройки "всплывайки" и удалить их из настроек
PT,PF=(kw['popup_text']if'popup_text'in kw else''),(kw['popup_font']if'popup_font'in kw else(None,))
if 'popup_text' in kw:del kw['popup_text']
if 'popup_font' in kw:del kw['popup_font']
super().__init__(master=master,cnf=cnf,**kw)#Создать виджет выше
self.bind('',self.UP);self.bind('',self.UP);self.bind('',self.DN)#Реакция на движения
self.POPUP=l(self.master,text=PT,font=PF)#Создать "всплывайку"
self._conf=self.config;self.config=self.configure=self.nc #Подмена функций настройки
def nc(self,**kw):
#Настройка - текст/шрифт всплывайки? если да, передать всплывайке; если нет - родителю.
if 'popup_text' in kw:self.POPUP.config(text=kw['popup_text']);del kw['popup_text']
if 'popup_font' in kw:self.POPUP.config(font=kw['popup_font']);del kw['popup_font']
self._conf(**kw)
def UP(self,e):
self.POPUP.place(x=self.winfo_rootx()+e.x,y=self.winfo_rooty()+e.y,anchor='nw')
self.POPUP.lift()
#Это может вести себя странно
def DN(self,e):self.POPUP.place_forget()
return Popup
if __name__=='__main__':
from tkinter import Tk,Button,Entry,Label
tk=Tk()
tk.title('test Test TeStEs')
Button=popup(Button); Label=popup(Label); Entry=popup(Entry)
Label(tk,text='test',popup_text='test').place(x=34,y=25)
Button(tk,text='Test',popup_text='TeStEs',popup_font=('Times',16,'bold')).place(x=50,y=50)
Entry(tk,popup_text='TESTING').place(x=0,y=100)
tk.mainloop()
(программа в 40 строк с документацией, см. ниже)
Это можно импортировать как модуль, чтобы использовать для себя или запустить напрямую, чтобы посмотреть как демо того, как оно работает
Там есть функция, которая переопределяет tkinterовские классы.
Например, сделав Button=popup(Button), можно получить кнопку со всплывающей подсказкой. Дальше работает как обычная кнопка с теми же функциями и методами.
Код с отступами: https://pastebin.com/PW86c0q9
def popup(cls):
'''Функция переделки класса
Передайте ей как аргумент нужный класс (Button, Label, Frame...),
чтобы получить класс Popup (нужный класс со всплывающим окном)'''
class Popup(cls):
'''Переделанный класс
При создании укажите popup_text (при желании и popup_font) для
настройки всплывабщего сообщения'''
def __init__(self,master,cnf={},**kw):
from tkinter import Label as l
self.master=master; self.tk=master.tk #Tkinter
#Получить настройки "всплывайки" и удалить их из настроек
PT,PF=(kw['popup_text']if'popup_text'in kw else''),(kw['popup_font']if'popup_font'in kw else(None,))
if 'popup_text' in kw:del kw['popup_text']
if 'popup_font' in kw:del kw['popup_font']
super().__init__(master=master,cnf=cnf,**kw)#Создать виджет выше
self.bind('',self.UP);self.bind('',self.UP);self.bind('',self.DN)#Реакция на движения
self.POPUP=l(self.master,text=PT,font=PF)#Создать "всплывайку"
self._conf=self.config;self.config=self.configure=self.nc #Подмена функций настройки
def nc(self,**kw):
#Настройка - текст/шрифт всплывайки? если да, передать всплывайке; если нет - родителю.
if 'popup_text' in kw:self.POPUP.config(text=kw['popup_text']);del kw['popup_text']
if 'popup_font' in kw:self.POPUP.config(font=kw['popup_font']);del kw['popup_font']
self._conf(**kw)
def UP(self,e):
self.POPUP.place(x=self.winfo_rootx()+e.x,y=self.winfo_rooty()+e.y,anchor='nw')
self.POPUP.lift()
#Это может вести себя странно
def DN(self,e):self.POPUP.place_forget()
return Popup
if __name__=='__main__':
from tkinter import Tk,Button,Entry,Label
tk=Tk()
tk.title('test Test TeStEs')
Button=popup(Button); Label=popup(Label); Entry=popup(Entry)
Label(tk,text='test',popup_text='test').place(x=34,y=25)
Button(tk,text='Test',popup_text='TeStEs',popup_font=('Times',16,'bold')).place(x=50,y=50)
Entry(tk,popup_text='TESTING').place(x=0,y=100)
tk.mainloop()
Стелла - Гранит
Проверял, работает с Button, Label, Canvas, Frame, Entry. Не знаю, работает ли с Text или Scrollbar
Похожие вопросы
- Окончил курсы на степике по Python что делать дальше?
- Python программирование. Помогите написать программу.
- Нейронные сети на Python 3.4
- Помогите, как сделать авторизацию в программе на python?
- Что писать на Python?
- Есть ли смысл изучать python
- Подскажите ресурс\книги с примерами по высшей математике и их решений на языке Python
- Можете помочь! Нужен код для Python, что бы он заменял определенный текст в файле
- Программисты, расскажите, правильный StartUp? Python
- Почему Python такой сложный?