Получить позицию мыши python

pygame how to check mouse coordinates [duplicate]

I am making a multiple choice quiz game with python and pygame. I have circles and what a want is when you click on the circle it will change the width and make the circle full. But I don’t know of a python function that can do that Heres my code so far:

 # Controls the width of the circles width_1 = 2 width_2 = 2 width_3 = 2 width_4 = 2 # Circles pygame.draw.circle(screen, BLACK, [250, 230], 7, width_1) pygame.draw.circle(screen, BLACK, [250, 260], 7, width_2) pygame.draw.circle(screen, BLACK, [250, 290], 7, width_3) pygame.draw.circle(screen, BLACK, [250, 320], 7, width_4) for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: 

I want to have something so that if the mouse is hovering over the circles AND mousebuttondown AND event.button == 1 then change the width to 0 (Fill it in) Thanks in advance! P.S. This is not all my code

3 Answers 3

you can just do x, y = pygame.mouse.get_pos() then print(x, y)

Lets say we wanted to make some Flying blocks from one position to another. We could do something like this

import pygame from pygame import * import sys, random, math, fractions pygame.init() Screen_Width = 800 Screen_Height = 600 Total_Display = pygame.display.set_mode((Screen_Width, Screen_Height)) clock = pygame.time.Clock() class Blocks(pygame.sprite.Sprite): def __init__(self, width, height): super().__init__() all_sprite_list.add(self) block_list.add(self) self.image = pygame.Surface((32,32)) self.rect = self.image.get_rect() self.change_y = 0 self.change_x = 0 def blockMove (self, cursor_pos_x, cursor_pos_y, player_pos_x, player_pos_y): block_vec_x = cursor_pos_x - player_pos_x block_vec_y = cursor_pos_y - player_pos_y vec_length = math.sqrt(block_vec_x ** 2 + block_vec_y ** 2) block_vec_y = (block_vec_y / vec_length) * 5 block_vec_x = (block_vec_x / vec_length) * 5 self.change_y += block_vec_y self.change_x += block_vec_x def update(self): self.rect.y += self.change_y self.rect.x += self.change_x 

Now well make a simple player class just for a position to fire the blocks to the mouse position well place this right in the middle of the window!

class Player(pygame.sprite.Sprite): def __init__(self): player_list.add(self) self.rect = Rect(400,300,16,16) self.image = pygame.surface((16,16)) all_sprite_list = pygame.sprite.Group() player_list = pygame.sprite.Group() block_list = pygame.sprite.Group() block = Blocks(16,16) player = Player() running = True while running: clock.tick(60) for e in pygame.event.get() if e == pygame.Quit: running = False if e.type == pygame.KEYDOWN and e.type == pygame.K_ESCAPE: running = False 

Here is where we get the mouse position we set Mouse_X and Mouse_Y = mouse.get_pos() which will output (x, y) or Mouse_X = mouse pos x and Mouse_Y = mouse pos y. You can also out put the position of the mouse by adding a print(Mouse_x & » » & Mouse_y)

 Mouse_x, Mouse_y = pygame.mouse.get_pos() key = pygame.key.get_pressed() if key[pygame.K_SPACE]: block = Blocks(16,16) block.blockMove(Mouse_x, Mouse_y, player.rect.x, player.rect.y) block.rect.x = player.rect.x block.rect.y = player.rect.y block.update() Total_Display.fill((255,0,0)) for sprite in all_sprite_list: pygame.draw.rect(Total_Display,(0,0,0), sprite) for blocks in block_list: pygame.draw.rect(Total_Display, (0,0,0), block) pygame.display.flip() 

I probably went a little overboard but hey hope this helps someone out there! And here’s the entire thing just to make sure I didn’t make a mistake

import pygame from pygame import * import sys, random, math, fractions pygame.init() Screen_Width = 800 Screen_Height = 600 Total_Display = pygame.display.set_mode((Screen_Width, Screen_Height)) clock = pygame.time.Clock() class Blocks(pygame.sprite.Sprite): def __init__(self, width, height): super().__init__() all_sprite_list.add(self) block_list.add(self) self.image = pygame.Surface((32,32)) self.rect = self.image.get_rect() self.change_y = 0 self.change_x = 0 def blockMove (self, cursor_pos_x, cursor_pos_y, player_pos_x, player_pos_y): block_vec_x = cursor_pos_x - player_pos_x block_vec_y = cursor_pos_y - player_pos_y vec_length = math.sqrt(block_vec_x ** 2 + block_vec_y ** 2) block_vec_y = (block_vec_y / vec_length) * 5 block_vec_x = (block_vec_x / vec_length) * 5 self.change_y += block_vec_y self.change_x += block_vec_x def update(self): self.rect.y += self.change_y self.rect.x += self.change_x class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() player_list.add(self) all_sprite_list.add(self) self.rect = Rect(400,300,16,16) self.image = pygame.Surface((16,16)) all_sprite_list = pygame.sprite.Group() player_list = pygame.sprite.GroupSingle() block_list = pygame.sprite.Group() block = Blocks(16,16) player = Player() running = True while running: clock.tick(60) for e in pygame.event.get(): if e == pygame.QUIT: Running = False if e.type == pygame.KEYDOWN and e.type == pygame.K_ESCAPE: running = False Mouse_x, Mouse_y = pygame.mouse.get_pos() key = pygame.key.get_pressed() if key[pygame.K_SPACE]: block = Blocks(16,16) block.update() block.blockMove(Mouse_x, Mouse_y, player.rect.x, player.rect.y) block.rect.x = player.rect.x block.rect.y = player.rect.y block.update() Total_Display.fill((255,0,0)) for sprite in all_sprite_list: pygame.draw.rect(Total_Display,(0,0,0), sprite) for blocks in block_list: pygame.draw.rect(Total_Display, (0,0,0), block) pygame.display.flip() 

Источник

Читайте также:  Python разделить строку разделителем

Определяем текущее положение курсора мыши с Python

Определяем текущее положение курсора мыши с Python

В прошлой статье мы говорили об автоматизации графического интерфейса с Python и библиотекой pyautogui, что предполагает симуляцию действий с клавиатурой, мышью и не только. И для написания скрипта симуляции мыши важно найти координаты курсора в текущий момент, и постоянно отображать их. В данной статье мы напишем простой скрипт для решения данной задачи.

Для этого нам нужно во первых отобразить текущие координаты мыши, во вторых обновить их в соответствии с перемещением курсора по экрану. На уровне кода мы должны вызвать функцию position(), для получения текущих координат, затем при перемещении курсора стереть предыдущие координаты используя символ \b и обработать исключение KeyboardInterrupt так чтобы сочетание клавиш CTRL-C вызвало выход.

Откроем текстовый редактор и создадим файл с именем Mouse_now.py. Поместим в него наш код:

# На первом этапе импортируем модули pyautogui, time. Также напечатаем напоминание пользователю, о возможности выхода из программы нажав CTRL-C
import pyautogui
import time
print(«Press CTRL-C to quit»)

»’
Для постоянного вывода текущих координат из mouse.position() можно использовать бесконечный цикл. А для кода завершающего программу нужно будет перехватить исключение KeyboardInterrupt, которое возникает всякий раз, когда пользователь нажимает CTRL-C.
Если этого не сделать то try/exept отобразит уродливую строку сообщения об ошибке.
И чтобы обработать цикл заключим его в оператор try »’

try:
while True:
# получение текущих координат
x, y = pyautogui.position()
# метод str(x) превращает число в строку а rjust(4) сдвигает его на четыре позиции вправо
positionStr = ‘X:’+ str(x).rjust(4) +’ Y:’+ str(y).rjust(4)
# end предотвращает добавление символа новой строки, без этого старые координаты удалить не получится
print(positionStr, end = »)

# escape-символ \ b стирает конец строки и чтобы удалить всю строку умножаем его на длину строки
print(‘\b’*len(positionStr), end = », flush = True)

# для предотвращения мигания при выполнении цикла используем засыпание
time.sleep(0.01)

# Когда пользователь нажимает CTRL-C, выполнение программы переходит к разделу except и # Done будет напечатан с новой строки

except KeyboardInterrupt:
print(‘\nDone’)

Когда программа запустится, будут напечатаны только две строки. Они должны выглядеть примерно так:

# вывод
Press Ctrl-C to quit
X: 165 Y: 144

Таким образом с помощью данного скрипта, вы можете определить координаты мыши для ваших сценариев автоматизации графического интерфейса.

Создано 05.01.2021 09:20:12

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Mouse Position Python Tkinter

    You could set up a callback to react to events:

    import Tkinter as tk root = tk.Tk() def motion(event): x, y = event.x, event.y print('<>, <>'.format(x, y)) root.bind('', motion) root.mainloop() 

    I’m not sure what kind of variable you want. Above, I set local variables x and y to the mouse coordinates.

    If you make motion a class method, then you could set instance attributes self.x and self.y to the mouse coordinates, which could then be accessible from other class methods.

    Well, nothing receives the return value of the callback, so it would not be useful to return it from motion .

    Get the following error with above script tkinter.TclError: no display name and no $DISPLAY environment variable

    The problem with this is that if you’re trying to use self.x and self.y in another event handler, it’ll be the mouse position at the time of the previous event, which could be off by quite a distance. If the current event doesn’t have pointer position, I think Bryan Oakley’s answer is a better solution.

    At any point in time you can use the method winfo_pointerx and winfo_pointery to get the x,y coordinates relative to the root window. To convert that to absolute screen coordinates you can get the winfo_pointerx or winfo_pointery , and from that subtract the respective winfo_rootx or winfo_rooty

    root = tk.Tk() . x = root.winfo_pointerx() y = root.winfo_pointery() abs_coord_x = root.winfo_pointerx() - root.winfo_rootx() abs_coord_y = root.winfo_pointery() - root.winfo_rooty() 

    This is handy when you want to fetch the tab_id of a ttk::notebook tab that was clicked on from inside of a toplevel grab (the notebook is external to the toplevel widget).

    I think this is a better solution for making tooltips that will appear after 1 seconds in mouse pointer’s coordinates. Bind solution gets the first coordinates of mouse when moved and waits 1 seconds. Even if mouse was moved to somewhere else, tooltip is appearing in first position.

    I would like to improve Bryan’s answer, as that only works if you have 1 monitor, but if you have multiple monitors, it will always use your coordinates relative to your main monitor. in order to find it relative to both monitors, and get the accurate position, then use vroot , instead of root , like this

    root = tk.Tk() . x = root.winfo_pointerx() y = root.winfo_pointery() abs_coord_x = root.winfo_pointerx() - root.winfo_vrootx() abs_coord_y = root.winfo_pointery() - root.winfo_vrooty() 

    I don’t know if it’s that I don’t have a second monitor, but .winfo_vrootx() and .winfo_vrooty() both report 0, no matter where my mouse is. Should I combine this with .winfo_rootx() and .winfo_rootx() ?

    Источник

    Оцените статью