Как изменить курсор виджета Tkinter в Python
В этом уроке вы узнаете, как устанавливать и изменять курсоры для виджетов в приложении Tkinter в Python.
Изменение курсора для корневого окна
В корневом окне всего два курсора:
- Обычный курсор (normal)
- Курсор busy
Обычный курсор имеет значение «», а курсор busy имеет значение «watch».
Следующая программа показывает, как изменить курсор корневого окна с normal на busy:
import tkinter as tk root = tk.Tk() root.geometry("300x300") root.config(cursor="watch") root.mainloop()
Как это работает.
- Сначала установите ширину и высоту корневых окон равными 300×300.
- Во-вторых, измените курсор на busy, используя параметр cursor.
Если вы хотите изменить курсор для области корневого окна, вы можете использовать событие и отслеживать координату x(и/или y) курсора. Например:
import tkinter as tk root = tk.Tk() root.geometry("300x300") def change_cursor(event): if event.x in range(100, 300): root.config(cursor="watch") else: root.config(cursor="") root.bind("<Motion>", change_cursor) root.mainloop()
В этом примере курсор становится busy, когда мышь находится в точке с координатами x от 100 до 300.
Изменение курсора для виджетов
Все виджеты ttk имеют параметр cursor, который позволяет изменять курсор при наведении на них мыши.
Например, если вы хотите изменить курсор кнопки, вы можете задать имя курсора с помощью параметра cursor следующим образом:
from tkinter import ttk #... button = ttk.Button(cursor=cursor_name)
Имя курсора может иметь одно из следующих значений:
- arrow
- based_arrow_down
- based_arrow_up
- boat
- bogosity
- bottom_left_corner
- bottom_right_corner
- bottom_side
- bottom_tee
- box_spiral
- center_ptr
- circle
- clock
- coffee_mug
- cross
- cross_reverse
- crosshair
- diamond_cross
- dot
- dotbox
- double_arrow
- draft_large
- draft_small
- draped_box
- exchange
- fleur
- gobbler
- gumby
- hand1
- hand2
- heart
- icon
- iron_cross
- left_ptr
- left_side
- left_tee
- leftbutton
- ll_angle
- lr_angle
- man
- middlebutton
- mouse
- pencil
- pirate
- plus
- question_arrow
- right_ptr
- right_side
- right_tee
- rightbutton
- rtl_logo
- sailboat
- sb_down_arrow
- sb_h_double_arrow
- sb_left_arrow
- sb_right_arrow
- sb_up_arrow
- sb_v_double_arrow
- shuttle
- sizing
- spider
- spraycan
- star
- target
- tcross
- top_left_arrow
- top_left_corner
- top_right_corner
- top_side
- top_tee
- trek
- ul_angle
- umbrella
- ur_angle
- watch
- xterm
- X_cursor
Следующая программа позволяет изменить курсор, выбрав его в раскрывающемся списке:
from tkinter import ttk import tkinter as tk root = tk.Tk() # config the root window root.geometry('600x400') root.resizable(False, False) root.title('Tkinter Cursors') frame = ttk.Frame(root) # label label = ttk.Label(frame, text="Cursor:") label.pack(fill=tk.X, padx=5, pady=5) # cursor list selected_cursor = tk.StringVar() cursor_list = ttk.Combobox(frame, textvariable=selected_cursor, cursor='arrow') cursors = ['arrow', 'man', 'based_arrow_down', 'middlebutton', 'based_arrow_up', 'mouse', 'boat', 'pencil', 'bogosity', 'pirate', 'bottom_left_corner', 'plus', 'bottom_right_corner', 'question_arrow', 'bottom_side', 'right_ptr', 'bottom_tee', 'right_side', 'box_spiral', 'right_tee', 'center_ptr', 'rightbutton', 'circle', 'rtl_logo', 'clock', 'sailboat', 'coffee_mug', 'sb_down_arrow', 'cross', 'sb_h_double_arrow', 'cross_reverse', 'sb_left_arrow', 'crosshair', 'sb_right_arrow', 'diamond_cross', 'sb_up_arrow', 'dot', 'sb_v_double_arrow', 'dotbox', 'shuttle', 'double_arrow', 'sizing', 'draft_large', 'spider', 'draft_small', 'spraycan', 'draped_box', 'star', 'exchange', 'target', 'fleur', 'tcross', 'gobbler', 'top_left_arrow', 'gumby', 'top_left_corner', 'hand1', 'top_right_corner', 'hand2', 'top_side', 'heart', 'top_tee', 'icon', 'trek', 'iron_cross', 'ul_angle', 'left_ptr', 'umbrella', 'left_side', 'ur_angle', 'left_tee', 'watch', 'leftbutton', 'xterm', 'll_angle', 'X_cursor', 'lr_angle'] cursor_list['values'] = cursors cursor_list['state'] = 'readonly' cursor_list.pack(fill=tk.X, padx=5, pady=5) frame.pack(expand=True, fill=tk.BOTH) # bind the selected value changes def cursor_changed(event): frame.config(cursor=selected_cursor.get()) cursor_list.bind('<<ComboboxSelected>>', cursor_changed) root.mainloop()