Python 实时三维视图pov光线和tkinter

Python 实时三维视图pov光线和tkinter,python,python-3.x,tkinter,povray,Python,Python 3.x,Tkinter,Povray,我正在尝试用python tkinter制作GUI。我已经成功地创建了应用程序,这样我就有了一个由POV光线渲染的场景。我按下“向左移动”按钮,这会更改.pov文件中的摄影机位置,重新渲染场景并以相同的方式显示,以便进行旋转和放大/缩小 但我想让大家互动一下。i、 e使用鼠标与场景完全交互,就像matplotlib 3D图形一样,但用于光线渲染 如何着手解决这个问题 场景的位置值如下所示 Img_1位置 Img_2位置 Img_3位置 PS 我没有尝试在GUI中导入matplotlib plot

我正在尝试用python tkinter制作GUI。我已经成功地创建了应用程序,这样我就有了一个由POV光线渲染的场景。我按下“向左移动”按钮,这会更改.pov文件中的摄影机位置,重新渲染场景并以相同的方式显示,以便进行旋转和放大/缩小

但我想让大家互动一下。i、 e使用鼠标与场景完全交互,就像matplotlib 3D图形一样,但用于光线渲染

如何着手解决这个问题

场景的位置值如下所示

Img_1位置

Img_2位置

Img_3位置

PS

我没有尝试在GUI中导入matplotlib plot。仅供参考,分享我希望通过渲染场景实现的效果

[]img1

[]img2

[]img3

您可以使用鼠标事件和,以及其他来运行函数,这些函数将更改窗口中的内容

编辑:示例演示如何在使用鼠标时使用绑定运行函数,以及如何计算diff_x、diff_y来移动对象。您必须使用自己的绑定函数,该函数将使用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()

root.bind,function\u name在按下鼠标按钮时运行函数。感谢您的详细回复,但不幸的是,这在我的情况下不起作用,因为我正在移动渲染的POV光线图像的相机。我已经编辑了这个问题,也许这将有助于澄清我的goalit演示如何在使用鼠标时使用bind to run函数-您必须使用bind自己的函数,它将使用不同的相机位置渲染图像。它还显示了如何计算diff_x,diff_y,您可以使用它在POV光线中移动相机。我理解这一点,但如何为3D添加z轴在上述情况下,您可以使用它来更改x和y以及更改z轴。然后你可以渲染它。我从不检查它,但使用,你可以使用鼠标滚轮来改变值-也就是说,你可以改变你的z。
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()