【问题标题】:Python tkinter scrollbar/graph scale slowing down scrollingPython tkinter滚动条/图形比例减慢滚动
【发布时间】:2014-01-05 20:10:06
【问题描述】:

我一直在玩弄我的数据图上的滚动条。我有它,它滚动数据,但它也滚动屏幕右侧的比例(数据值)。今天早上我玩弄了创建两个独立窗口的想法,一个用于数据图,一个用于比例尺。与您通常看到的相比,它看起来很不寻常,但是当我这样做时,我确实特别注意到一件事。使用数据图上的比例,一个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')

沿着屏幕向下(是的,每 0.125 标记一次 5 到 -5...每 0.5 标记一次)。

在同一个gui上的比例和图形数据仍然保持滚动速度是可行的。我没有更改字体,无论是大小还是类型,因为我不确定如何更改,因为 tkinter 文档中没有真正说明任何内容。

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

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

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

【问题讨论】:

  • 当您说“将比例移动到另一个 gui”时没有意义。在这种情况下,什么是“gui”? Toplevel的实例?
  • 我所做的是:root = Tk(), root2 = Tk()。这就是我所说的另一个gui的意思。我对此很陌生,所以我的术语不是最好的:)
  • 你不能在一个程序中拥有两个Tk 实例——这会导致各种意想不到的问题。

标签: python tkinter


【解决方案1】:

如果你想用滚动条滚动而不用缩放滚动,你应该使用两个单独的窗口。我不确定您所说的“与您通常看到的不同”是什么意思。如果您将两个画布并排放置,它们之间没有空间并且具有相同的背景颜色,则用户将无法知道您同时使用了两个画布小部件。

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()

【讨论】:

  • 我更新了原始帖子以添加一些额外的细节。
  • 感谢您的更新。过段时间我回家试试。我要到明天才能发帖,但我确实看到了.grid 所指的内容。我还没有玩够 Tkinter 的不同功能,但我已经看够了 .grid 了。奇怪的是,在我使用 2 个 Tk 实例的程序的早期版本中,它从来没有给我带来任何麻烦。我只是停止使用它来尝试缩短代码(在两个实例中创建了两次相同的布局,这个想法可能会更好)并且我想扩展主 Tk 高度,所以我丢失了第二个 Tk 实例。
  • 谢谢,除了我发现的一个小问题外,它工作得很好。我不确定这是框架打嗝还是什么。很奇怪。我将在一个完全独立的问题中处理它,因为我不太确定它可能不是 Frame 的问题。如果程序中没有 Frame 语句,我从来没有遇到过问题,但我现在遇到了问题。 stackoverflow.com/questions/20957625/…>
猜你喜欢
  • 1970-01-01
  • 2015-04-03
  • 2016-07-07
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
相关资源
最近更新 更多