Трехуровневое окно с наведением на кнопку и само окно верхнего уровня - PullRequest
1 голос

Я nooby для Python и для практики, я пытаюсь создать аудиоплеер с Tkinter Сейчас я пытаюсь создать окно Toplevel для изменения громкости, как во многих плеерах или браузерах. Основная идея и сложность заключается в том, что окно должно появляться при наведении курсора на «кнопку» и исчезать, когда курсор покидает кнопку и само диалоговое окно (пример: как на Youtube) Я знаю, что есть событие Bind, такое как Motion или Enter / Leave. Но как сделать так, чтобы учитывалось пространство виджета Toplevel, а не только кнопка?

1 Ответ

0 голосов
/ 20 мая 2019

Наведение объема над окном может быть выполнено несколькими способами: вы также можете навести Frame вместо окна Toplevel, но идея использования Toplevel() дает вам больше возможностей для настройки и делает его более приятнымкак и я

  • Я сделал функцию, которую можно назначить любой кнопке, просто независимо Button.bind("<Enter>", change_volume).

  • В функции окно Toplevel будет создано при "" и destroy() on "" соответственно.

  • Я использовал wm_overrideredirect(True), чтобы удалить украшения из окна Toplevel, такие как границы заголовков по краям окна.

  • Я также использовал немного атрибута -alpha , чтобы придать окну некоторую прозрачность attributes('-alpha', 0.6).

  • Вы также можете использовать ttk themed Scale, он имеет круглую ручку и выглядит лучше, чем по умолчанию, а также предварительно установлен ttk, как и tkinter.Но он возвращает значение с плавающей запятой , где, как обычно, Scale возвращает целое число .

Restuls:

_________ (по умолчанию) _________.________ (тематический ттк) ________

HoverVolume .. enter image description here

Пример кода:

from tkinter import *
from tkinter import ttk  # for round knob scale widget

root = Tk()
root['bg'] = 'lightyellow'
root.geometry('200x200+100+100')
volvar = IntVar(value=5)

def change_volume(evt=None):
    global vol_wid
    wid = evt.widget  # Get the widget the instance
    # Try / except to avoid errors like AttributeError.. 
    try: 
        # Returns if a window alrealy present
        if vol_wid.winfo_exists(): return 
    except: pass
    vol_wid = Toplevel(root)
    vol_wid.wm_overrideredirect(True)  # Removes the titlrbar and borders
    vol_wid.update()   # Don't need if not on macos
    vol_wid.lift()
    vol_wid.attributes('-alpha', 0.6) # Makes the window transparent
    vol_wid.attributes('-topmost', 1) # Be on top of every window
    scale = Scale(vol_wid, from_=0, to=10, variable=volvar, orient='horizontal', 
               bg='black', fg='white')    # NORMAL DEFAULT SCALE
    # scale = ttk.Scale(vol_wid, from_=0, to=10, variable=volvar, 
    #           orient='horizontal')    # ROUND KNOB SCALE
    scale.pack()
    # Set the window just above the button 
    width = int((scale.winfo_reqwidth() - wid.winfo_width()) / 2)
    vol_wid.geometry('+%s+%s' %(wid.winfo_rootx()-width, 
            wid.winfo_rooty()-scale.winfo_reqheight()))
    vol_wid.focus()  # Gives focus
    vol_wid.bind("<Leave>", lambda e: vol_wid.destroy()) # Bind to destroy window

Label(root, textvariable=volvar, font=('',16)).pack(pady=25)
B = Button(root, text='Volume',bg='lightpink', padx=10)
B.pack(pady=25)
B.bind("<Enter>", change_volume)
mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...