Наведение объема над окном может быть выполнено несколькими способами: вы также можете навести 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:
_________ (по умолчанию) _________.________ (тематический ттк) ________
.. 
Пример кода:
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()