Python - minimál grafika

 ( harlequin | 2019. május 22., szerda - 10:44 )

Van egy full szöveges python script, amibe egy funkciót kellene beletolni: a script megjelenít egy png-t, a user rákattint, a script pedig megkapja a kattintás koordinátáit.

Jó volna ezt csak pythonban megoldani, hatalmas, exotikus és os-függő dolgok (QT, GTK, egyéb ágyúval verébre megoldások) nélkül. Van erre valami iszonyatosan primitív megoldás?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Talán ez segít: (A klikkentős rész.) A TkInter tudtommal minden Python telepítés része. Kicsit fapados, de működik.

https://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

+1 Erre a feladatra szerintem is jó választás.

A PIL modul telepítését el lehet kerülni közvetlen tk-hívásokkal. Készítünk egy PhotoImage-et, majd tk-hívásokkal lekérdezzük a kép méretét. Ez lesz a canvas mérete is, amihez a wroot "kinyújtózik", és aminek az átméretezését letiltjuk.

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

fnimage="flower.png"
picname="virag"

def clicked(event):
    #print(event.x, event.y)
    wroot.title(f"Last click: {event.x},{event.y}")

wroot=tk.Tk()

pic=tk.PhotoImage(file=fnimage, name=picname)   # parameters passed tk
# direct tk calls:
#print(wroot.tk.call('eval',"image names"))
picwidth= wroot.tk.call('eval',"image width "+picname)
picheight= wroot.tk.call('eval',"image height "+picname)
#print(picwidth,picheight)

can=tk.Canvas(width=picwidth, height=picheight)
can.create_image(picwidth/2, picheight/2,image=pic)

can.bind('<Button-1>', clicked)
can.grid()

wroot.resizable(False,False) # resizing not allowed

wroot.title("Click On Image")
wroot.mainloop()

Szerk.: Módosítottam az eseménykezelőt
--
eutlantis

Végül ezt használtam, köszönöm.

Meg persze a többieknek is.

Szívesen:-)
--
eutlantis

[Feliratkozás]

PyGame
https://www.pygame.org/docs/
https://www.pygame.org/wiki/tutorials
telepítés: pip3 pygame

kép fájl betöltése, kattintás koordinátájának kiírása - pont amit akarsz:

#!/usr/bin/env python3
import os
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "defined"  # https://stackoverflow.com/a/55769463
import pygame
 
pygame.init()

myimg = pygame.image.load("myimage.jpg")
width, height = myimg.get_size()

screen = pygame.display.set_mode( (width, height) )
pygame.display.set_caption('Window title')

screen.blit(myimg, (0, 0))
pygame.display.flip()
 
while (True):
    event = pygame.event.wait()
    if event.type == pygame.QUIT:
        break
    elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
        x, y = event.pos
        print('clicked at', x, y)
pygame.quit()

Png megjelenitesre meg egy lehetoseg (kattintast nem kerestem):
https://matplotlib.org/users/image_tutorial.html
Ugy emlekszem, hogy tobb backendet tud hasznalni, kb. mindenhol megy, es - tudtommal - nativ hivasokat hasznal.

Egyebkent milyen scriptet irsz?

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

A script egy másik gépet irányít VNC-n keresztül (vncdotools, ezt is le kellene valami pure python dologra cserelni idovel), egy előre meghatározott szekvenciát kattintgat végig (tesztelésre, demózásra készült).
Ehhez szeretnék olyat, hogy egy klikk helyét valahogy interaktívabban is be lehessen adni, ehhez kell a kep a vnc-n keresztül (ami megvan) ezt megmutatni a usernek, és megkérdezni, hogy hová kell kattintani, és megjegyezné a kapott koordinátákat, és elmentené a szekvenciába.

Sub