7

重複マーカーの場合:このmatplotlibような質問が にいくつかあることは承知しています。私の質問はnotについてです。Tkintermatplotlib

私は今、レナをPythonにインポートし、彼女の帽子に緑色の点を描いています

In [72]: from PIL import Image
   ....: import matplotlib.pylab as plt
   ....: im = Image.open('lena.jpg')
   ....: fig = plt.figure()
   ....: axes = fig.add_axes([0.1, 0.1, 0.8, 0.8])
   ....: axes.imshow(im)
   ....: axes.scatter(50, 50, marker='s', color='green')
Out[72]: <matplotlib.collections.PathCollection at 0xb3e2ef0>

(赤い点は無視してください)

ここに画像の説明を入力

緑の点(50, 50)をレナの帽子に残しておきたいのですが、緑の点を左上隅ではなく左下隅にも描きたいと思います。

私は次のようなものを期待しています:

ここに画像の説明を入力

matplotlibご覧のとおり、 1行追加するだけでこれを簡単に行うことができました。

axes.invert_yaxis()

質問

でキャンバスに描いていますTkinter。どうすれば同じ効果を得ることができますか?


アップデート

レナは単に私の目的を説明するためのものです。私の本当の問題では、何もインポートしていませんTkinter空のキャンバスに絵を描いているだけです。データを変更するのは気が進まないので、図面を上下逆にしたいだけです。私のレナのイラストのように、座標はまだ(50, 50). 違いは、上隅ではなく左下にあることです。

4

3 に答える 3

2

角度は次のように使用できます。

image = Image.open("lena.jpg")
angle = 180
tkimage = ImageTk.PhotoImage(image.rotate(angle))
...

絵を描いて、逆の座標を使用することも可能です (したがって、キャンバスのサイズがわかっている場合は、 と言う代わり50x50(max-50)x(max-50).

axes.imshowを扱えるかが問題ImageTk.PhotoImage。繰り返しになりますが、代わりに Tkinter キャンバスでこれが必要かどうかは完全にはわかりません。

canvas_obj = self.canvas.create_image(250, 250, image=tkimage)
于 2013-10-27T09:26:34.697 に答える
1

これは、次のようなコードで簡単になるように思えます。

import Tkinter
#Set up a basic canvas
top = Tkinter.Tk()
canv = Tkinter.Canvas(top, bg="brown", height=250, width=300)

#Replace with what ever values you want
x = 50
y = 50

#Draw the first dot
line1 = canv.create_line(x, y, x - 2, y - 2, fill="green", width=3)
#This next line is pretty much all it takes to find the Y inverse
y = canv.winfo_reqheight() - y
#Draw the second dot
line2 = canv.create_line(x, y, x - 2, y - 2, fill="green", width = 3)

canv.pack()
top.mainloop()

これは以下を返します。

反転した Y 軸

基本的に、キャンバスの高さ (250) を取得し、そこから前の Y 値 (50) を減算すると、Y 逆数 (200) が返されました。正確には組み込み関数ではありませんが、実際の反転部分は非常に単純でした。それがあなたが探していたものであることを願っています...頑張ってください!

于 2013-11-03T04:06:36.443 に答える
0

あなたが求めているように見えるのは、2D ワールドからビューポートへの変換です。

「世界座標」で定義された領域 (たとえば、10 メートル x 10 メートル) を取り、それをキャンバス座標で定義された領域にマップします。

例えば。

from tkinter import *

xmin,ymin,xmax,ymax = 0,0,10,10   # world
umin,vmin,umax,vmax = 0,480,640,0 # viewport (note: y reversed)

points = [(2,2), (4,4), (7,7), (8,8)]  # some "world" points

def world_to_viewport(worldpoint):
    x,y = worldpoint
    u = (x - xmin)*((umax - umin)/(xmax - xmin)) + umin
    v = (y - ymin)*((vmax - vmin)/(ymax - ymin)) + vmin
    return u,v

def pixel_to_world(pixel):
    u,v = pixel
    x = (u - umin)*((xmax - xmin)/(umax - umin)) + xmin
    y = (v - vmin)*((ymax - ymin)/(vmax - vmin)) + ymin
    return x,y

root = Tk()
canvas = Canvas(root, width=640, height=480, bd=0, highlightthickness=0)
canvas.pack()

def on_click(event):
    root.title('%s,%s' %(pixel_to_world((event.x,event.y))))

canvas.bind('<ButtonPress-1>', on_click)

r = 5
for point in points:
    cx,cy = world_to_viewport(point)
    canvas.create_oval(cx-r,cy-r,cx+r,cy+r,fill='red')

root.mainloop()
于 2013-10-27T22:23:13.970 に答える