Python tkinter滚动条/图形缩放减慢滚动速度

时间:2014-01-05 20:10:06

标签: python tkinter

我一直在为我的数据图上放一个滚动条。我有它在那里滚动数据,但它也滚动屏幕右侧的比例(数据值)。今天早上我已经玩弄了两个单独的窗口,一个用于数据图,一个用于比例。与你通常看到的相比,它看起来很不寻常,但是当我这样做时,我确实注意到了一件事。使用数据图表上的比例,一个gui,只要比例仍然保留在屏幕上,滚动就会非常慢。一旦比例从屏幕移开,滚动速度就会达到我通常所期望的速度。当我将刻度移动到一个完全独立的gui时,滚动速度始终保持良好状态。我该如何克服这个问题?

我不确定为什么刻度会对滚动速度产生任何影响。它只不过是:

self.DrawArea.create_line((1298, 12), (1300, 12), fill = "white")
self.DrawArea.create_line((1290, 25), (1300, 25), fill = "white")
self.DrawArea.create_line((1298, 37), (1300, 37), fill = "white")
self.DrawArea.create_text((1320, 25), text = "5.0", fill = 'white')
self.DrawArea.create_text((1320, 50), text = "4.5", fill = 'white')
self.DrawArea.create_text((1320, 75), text = "4.0", fill = 'white')

沿着屏幕走下去(每隔.125标记为5到-5 ...每隔.5标记一次。)

将比例和图形数据放在同一个gui上并保持滚动速度是可行的。我没有更改字体,无论是大小还是类型,因为我不知道怎么做,因为在tkinter文档中没有真正指出。

还有一种方法可以限制图形数据的显示位置。有一个gui,我有1350x615的图形设置(600,底部15是滚动条)。 1300应该是显示数据,其他50是比例。现在我有一个问题,即数据在规模下面绘制(规模明显放在最后)。有什么方法可以限制它,所以数据只显示0-1300而标尺显示1301-1350?我今天早上一直在玩Frames,但到目前为止我还没有解决这个问题。

编辑: 当我尝试使用键盘进行滚动时,我使用的是.move()命令,但当我更改为使用滚动条时,我根本没有使用键盘而只是使用滚动条。当我在同一个gui上同时拥有图形和比例时,只要比例在屏幕上(尚未滚动),图形在屏幕上移动的速度非常慢。一旦它离开屏幕,速度就会提升并移动,好像我根本没有屏幕上的比例。当我用两个独立的窗口测试时,它的方式是一样的。主图表上的比例减慢了向下滚动。

将刻度移动到另一个gui仍然无助于显示图形的加载速度或放大/缩小速度。

1 个答案:

答案 0 :(得分:0)

如果您想使用滚动条滚动而没有缩放滚动,则应该使用两个单独的窗口。我不确定你的意思和#34;与你通常看到的相比不寻常"。如果你将两个画布并排放置,它们之间没有空格并且背景颜色相同,那么用户将无法知道你同时使用两个画布小部件。

tkinter画布可以在它开始变得迟钝之前滚动数千个项目,所以很难说没有看到你的实际代码。

这是一个绘制10,000点的示例,其中比例位于单独的画布中:

import Tkinter as tk
from random import randrange

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

        self.DrawArea = tk.Canvas(self, width=1000, height=600, background="black",
                                  borderwidth=0, highlightthickness=0)
        self.scale = tk.Canvas(self, width=30, height=600, background="black",
                               borderwidth=0, highlightthickness=0)
        self.hsb = tk.Scrollbar(self, orient="horizontal", command=self.DrawArea.xview)
        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.DrawArea.yview)
        self.DrawArea.configure(yscrollcommand=self.vsb.set, xscrollcommand=self.hsb.set)

        self.DrawArea.grid(row=0, column=0, sticky="nsew")
        self.scale.grid(row=0, column=1, sticky="nsew")
        self.vsb.grid(row=0, column=2, sticky="ns")
        self.hsb.grid(row=1, column=0, columnspan=2,sticky="ew")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.draw_scale()
        self.draw_points()

    def draw_scale(self):
        value = 5.0
        for y in range(25, 600, 25):
            self.scale.create_text((25, y), text=str(value), fill="white", anchor="ne")
            value -= 0.5

    def draw_points(self):
        import math
        for x in range(5,10000):
            y = randrange(600)
            color = "green" if (300 > y > 200) else "red"
            self.DrawArea.create_rectangle(x-2,y-2,x+2,y+2, fill=color)
        self.DrawArea.configure(scrollregion = self.DrawArea.bbox("all"))

root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
相关问题