Tkinter'滚动条'可行

时间:2017-03-25 16:13:04

标签: python tkinter

我有一个我今天早上玩的基础程序,几年前我写了。它只有水平滚动和缩放。我设法得到它所以我可以滚动(一次一个轴)并放大两个轴。我想要创建一个程序,允许我同时在x和y方向上移动屏幕(例如Google Earth,你可以同时按住向下和向左键移动到左下角)。如果没有屏幕上的滚动条,这样做会很好。我不想来回前进并单击相应的滚动条以便能够在该轴上滚动。目前要更改我正在滚动的轴,我必须单击相反的轴。

我在[http://www.tkdocs.com/tutorial/canvas.html#scrolling][1]尝试了该程序,但我已经有能力做到这一点。它不允许我同时滚动两个方向,如果我想改变我滚动的方向而不必点击相反的轴。

有没有办法做我正在尝试用Tkinter做的事情,或者我应该去别处看看,如果有的话,在哪里?

感谢。

编辑:

使用下面的代码Bryan,我在下面的代码中添加了尝试使用键盘而不是鼠标来完成两项工作。我希望能够使用光标键来移动图像而不是鼠标。我在这台计算机上有一个触摸敏感的鼠标,它有自己的想法,因此我想坚持使用键盘。另外,考虑到这个项目的本质,我必须保持所有选项的开放,否则我知道在整个项目完成之前的某个时候我会后悔。

self.canvas.bind("<Left>", self.on_press)
self.canvas.bind("<Right>", self.on_press)

我也尝试将它指向self.on_motion,并且都没有接受光标键。

1 个答案:

答案 0 :(得分:2)

是的,这是可能的。没有什么能阻止您直接使用您想要的任何参数调用画布xviewyview方法。

首先需要创建跟踪鼠标单击和运动的绑定。在绑定函数中,您可以计算鼠标移动的方向,然后使用结果同时调用窗口小部件的xviewyview方法。

以下是一个例子:

import tkinter as tk
import random

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.canvas = tk.Canvas(self, background="bisque", width=400, height=400)
        self.canvas.pack(fill="both", expand=True)
        self.canvas.configure(scrollregion=(-1000, -1000, 1000, 1000))

        self.canvas.bind("<ButtonPress-1>", self.on_press)
        self.canvas.bind("<B1-Motion>", self.on_motion)

        # the following two values cause the canvas to scroll
        # one pixel at a time
        self.canvas.configure(xscrollincrement=1, yscrollincrement=1)

        # finally, draw something on the canvas so we can watch it move
        for i in range(1000):
            x = random.randint(-1000, 1000)
            y = random.randint(-1000, 1000)
            color = random.choice(("red", "orange", "green", "blue", "violet"))
            self.canvas.create_oval(x, y, x+20, y+20, fill=color)

    def on_press(self, event):
        self.last_x = event.x
        self.last_y = event.y

    def on_motion(self, event):
        delta_x = event.x - self.last_x
        delta_y = event.y - self.last_y
        self.last_x = event.x
        self.last_y = event.y

        self.canvas.xview_scroll(-delta_x, "units")
        self.canvas.yview_scroll(-delta_y, "units")

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()