Как изменить курсор виджета 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()
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *