我正试图在python (tkinter)中创建一个GUI。我已经成功地创建了这个应用程序,这样我就可以用POV射线渲染一个场景.我按下“向左移动”按钮,这将改变相机在.pov文件中的位置,重新呈现场景并在图形用户界面中显示它(同样用于旋转和放大)。
但我想做的是互动。也就是说,使用鼠标与场景完全交互,就像一个matplotlib 3D图形,但用于光线渲染。
如何着手解决这个问题?
场景的位置值为
Img_1位置<0,0,-10>
Img_2位置<0,-10,-10>
Img_3位置<25,0,-10>
PS
我并不试图在GUI中导入matplotlib图。这只是供参考,分享我想要实现的与我渲染的场景。
[
[img11]
[
[img22]
[
[img33.]
发布于 2020-01-10 16:46:28
您可以使用鼠标事件<Motion>
和<Button-1>
(以及其他)来运行将更改窗口中内容的函数。
编辑:示例演示如何在使用鼠标时使用bind()
运行函数,以及如何计算diff_x
、diff_y
以移动对象。您必须使用自己的函数与bind()
,这将使用diff_x
,diff_y
移动POVRay相机和渲染新的图像。然后你必须替换画布上的图像。但是我将使用画布对象而不是POVRay来展示鼠标移动时它是如何改变的。
此示例在移动鼠标时移动矩形,并在单击按钮时更改颜色。
但是您可以运行移动、缩放或旋转呈现图像的函数。
import tkinter as tk
# --- functions ---
def move_item(event):
canvas.coords(item, event.x-50, event.y-50, event.x+50, event.y+50)
def change_item(event):
if canvas.itemcget(item, 'fill') == 'red':
canvas.itemconfig(item, fill='blue')
else:
canvas.itemconfig(item, fill='red')
# --- main ---
root = tk.Tk()
canvas = tk.Canvas(root, width=500, height=300)
canvas.pack()
item = canvas.create_rectangle(0, 0, 100, 100, fill='red')
canvas.bind("<Button-1>", change_item)
canvas.bind("<Motion>", move_item)
root.mainloop()
编辑:使用<B1-Motion>
、<Shift-B1-Motion>
、<Control-B1-Motion>
移动对象的示例:
left mouse button
),Shift
+ left mouse button
)Control
+ left mouse button
)。代码:
import tkinter as tk
# --- functions ---
def move_item(event):
global old_x
global old_y
diff_x = event.x - old_x
diff_y = event.y - old_y
for item in items:
canvas.move(item, diff_x, diff_y)
old_x = event.x
old_y = event.y
def move_horizontal(event):
global old_x
diff_x = event.x - old_x
for item in items:
canvas.move(item, diff_x, 0)
old_x = event.x
def move_vertical(event):
global old_y
diff_y = event.y - old_y
for item in items:
canvas.move(item, 0, diff_y)
old_y = event.y
def save_position(event):
global old_x
global old_y
old_x = event.x
old_y = event.y
# --- main ---
old_x = 0
old_y = 0
# init
root = tk.Tk()
# create canvas
canvas = tk.Canvas(root, width=500, height=300)
canvas.pack()
# create objects
items = [
canvas.create_rectangle(100, 100, 130, 130, fill='red'),
canvas.create_rectangle(200, 100, 230, 130, fill='blue'),
canvas.create_rectangle(100, 200, 130, 230, fill='yellow'),
]
canvas.bind("<Button-1>", save_position)
canvas.bind("<B1-Motion>", move_item)
canvas.bind("<Shift-B1-Motion>", move_horizontal)
canvas.bind("<Control-B1-Motion>", move_vertical)
# start program
root.mainloop()
https://stackoverflow.com/questions/59685562
复制相似问题