簡體   English   中英

將 Tkinter 滾動條跳轉到某個小部件

[英]Jump a Tkinter scrollbar to a certain widget

我已經像這樣在我的 Tkinter GUI 中添加了一些滾動條功能

self.canvas = tk.Canvas(self.baseframe)
self.scrollbar = tk.Scrollbar(self.baseframe, orient="vertical", command=self.canvas.yview)
self.scrollable = tk.Frame(self.canvas)
self.scrollable.bind("<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))
self.canvas.create_window((0, 0), window=self.scrollable, anchor="n")
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.canvas.bind_all("<MouseWheel>", self._mousescroll)

我已將_mousecroll()定義為

    def _mousescroll(self, event):
        """mouse wheel scroll callback"""
        # Divide the event.delta by some value to effect the scrolling speed
        self.canvas.yview_scroll(int(-1*(event.delta/120)), "units")

這是很好的工作。

然后我將一些tkLabelFrame小部件添加到滾動區域(它們本身包含顯示內容的小部件 - 與此問題無關)。 整個滾動功能非常有效。

在我的 GUI 的其他部分,我希望用戶能夠通過單擊按鈕“跳轉”到滾動區域中的特定點。 實際上會自動將滾動區域滾動到這一點。 這可能嗎? 我可以完全控制 GUI 代碼,因此我可以將標簽添加到 tkLabelFrames 列表中,將它們存儲在某種列表/字典中,以便可以輕松查找它們......類似的東西?

注意:添加到滾動區域的tkLabelFrames的數量是動態的,因此某種絕對的“跳轉到這么多像素”可能不起作用。 我希望可能有某種“滾動到具有此標簽/屬性等的小部件”功能。 任何幫助表示贊賞。 謝謝。

對於我的特定場景,可滾動區域內的小部件的高度都相同,因此我能夠使用簡單的分數滾動到正確的位置。

添加一個按鈕,對這樣的方法進行回調對我有用:

def scrollto(self, idx):
    # Where self.frames is the list of tkLabelFrame objects.
    fraction = float(idx/len(self.frames))

    # self.canvas is my scrollable canvas
    self.canvas.yview_moveto(fraction)

我正在恢復它,因為它是谷歌中的第一個結果,並不是每個人的小部件都具有相同的高度(根據當前接受的答案的解決方案的要求)。


使用一些 .winfo 函數,我們可以做一些快速的數學運算來找到我們想要跳轉到的小部件在“self.scrollable”中的確切位置。

注意:在調用跳轉函數之前,您可能需要在 tkinter 實例上調用 .update() ,否則 winfo 值可能不正確。


我們將使用以下內容:

  • .winfo_height() - 獲取此小部件的高度,以像素為單位。 如果窗口不是由幾何管理器管理,將返回 1

  • .winfo_rooty() - 獲取小部件上邊緣相對於屏幕左上角的像素坐標。

  • .yview_moveto(fraction) - 將視圖移動到位置。 0 為頂部,1 為底部


以下函數將跳轉到給定的小部件,將其放置在可視區域(self.canvas)的頂部。

 def jump_to_widget_top(self, widget):
      if self.scrollable.winfo_height() > self.canvas.winfo_height():
           pos = widget.winfo_rooty() - self.scrollable.winfo_rooty()
           height = self.scrollable.winfo_height()
           self.canvas.yview_moveto(pos / height)

首先我們檢查容器(self.scrollable)實際上是否大於查看區域。 如果所有內容都已顯示,則無需跳轉。

我們找到所需小部件的絕對位置(相對於屏幕),然后減去容器頂部(self.scrollable)到屏幕頂部的距離。 這為我們提供了相對於容器位置的小部件位置。

找到小部件的位置后,將其除以容器的高度(self.scrollable),我們得到小部件的小數位置,如 .yview_moveto() 所要求的。


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM