【问题标题】:How to add a scrollbar to my tkinter window? [duplicate]如何在我的 tkinter 窗口中添加滚动条? [复制]
【发布时间】:2020-01-20 08:03:53
【问题描述】:

我想将创建 csv 文件的 Yahoo 收入日历页面 scraper 转换为 GUI,但我注意到如果当天报告的公司太多,tkinter 窗口就这么大显示设定的金额。我想知道是否有办法在我的窗口中实现滚动条。感谢任何帮助!

from tkinter import *
from tkinter.tix import *
import csv
from datetime import date
import yahooFinanceToCSV

root = Tk()

# open file
with open(r'earnings_{}.csv'.format(date.today()), newline = "") as file:
   reader = csv.reader(file)

   # r and c tell us where to grid the labels
   r = 0
   for col in reader:
      c = 0
      for row in col:
         # i've added some styling
         label = tkinter.Label(root, width = 35, height = 2, \
                               text = row, relief = tkinter.RIDGE)
         label.grid(row = r, column = c)
         c += 1
      r += 1

root.mainloop()

我的雅虎收入scraper代码

import pandas as pd
from datetime import date

# Forcing Pandas to display max rows and columns.
pd.option_context('display.max_rows', None, 'display.max_columns', None)
# Reading the earnings calendar table on yahoo finance website.
# earnings = pd.read_html('https://finance.yahoo.com/calendar/earnings')[0]
earnings = pd.read_html("https://finance.yahoo.com/calendar/earnings?from=2020-01-19&to=2020-01-25&day=2020-01-21")[0]
# Writing to a CSV file.
earnings.to_csv(r'earnings_{}.csv'.format(date.today()), index=None)

注意:由于有 40 多家公司报告,HTML 被强制发布到 2020 年 1 月 21 日。通常我每天运行代码以获得当天的收入,但 2020 年 1 月 21 日有助于重现需要解决的问题。

【问题讨论】:

    标签: python python-3.x tkinter scrollbar


    【解决方案1】:

    由于TkFrame 不支持Scrollbar,您需要使用CanvasScrollbarFrame 小部件模拟ScrolledFrame

    def ScrolledFrame(parent):
      def on_resize(event):
        bbox = canvas.bbox('all')
        canvas.config(width=bbox[2], scrollregion=bbox)
    
      def on_mouse_wheel(event):
        # better checking whether event happens inside frame
        canvas.yview_scroll(event.delta//-30, 'units')
    
      # note: Canvas is the outer container
      canvas = tkinter.Canvas(parent)
      # *** modify the below line to suit your layout manager
      canvas.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=1)
    
      sb = tkinter.Scrollbar(parent, orient=tkinter.VERTICAL, command=canvas.yview)
      # *** modify the below line to use same layout manager as canavas
      sb.pack(side=tkinter.RIGHT, fill=tkinter.Y)
    
      canvas.config(yscrollcommand=sb.set)
    
      frame = tkinter.Frame(canvas)
      canvas.create_window(0, 0, window=frame, anchor='nw')
      frame.bind('<Configure>', on_resize)
      # use bind_all() to make sure mouse wheel events can be triggered
      # even the canvas is filled with labels on top 
      canvas.bind_all('<MouseWheel>', on_mouse_wheel)
    
      return frame
    

    然后创建ScrolledFrame:

    frame = ScrolledFrame(root)
    # *** don't call any layout manager function, e.g. frame.pack() or frame.grid()
    

    并在ScrolledFrame内创建所有标签:

    label = tkinter.Label(frame, ...)
    label.grid(...)
    

    您可以根据需要修改ScrolledFrame()函数。

    【讨论】:

    • 你太棒了!感谢您的帮助!
    • 你知道如何让滚动条根据鼠标滚轮移动吗?目前我必须使用左键按住+拖动才能使用滚动条。
    • 当光标在滚动条内时,您是否尝试过鼠标滚轮?
    • 我想这是一种方法,但我更希望能够在框架中滚动
    • 更新结果以支持鼠标滚轮滚动。
    【解决方案2】:

    有一种方法可以在你的窗口上创建滚动条:

    from Tkinter import * 
    root = Tk() 
    scrollbar = Scrollbar(root) 
    scrollbar.pack( side = RIGHT, fill = Y )
    

    【讨论】:

    • 仅仅添加一个滚动条小部件是行不通的 首先,你永远不会定义滚动条的命令。另一方面,滚动条不能滚动框架中的小部件。
    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2019-07-19
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多