首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在frame tkinter中添加滚动条(Python)

如何在frame tkinter中添加滚动条(Python)
EN

Stack Overflow用户
提问于 2021-11-11 20:21:57
回答 1查看 50关注 0票数 0

你好,我一直在尝试使用tkinterpython创建我的小项目,但我已经尝试了所有的方法来在frame中添加scrollbar,但不幸的是我无法做到。

有人能帮我吗?

代码语言:javascript
复制
from tkinter import *
from tkinter import messagebox
import urllib.error, urllib.parse ,urllib.request
from bs4 import BeautifulSoup 

b="#0c1231"

root = Tk()
root.title("Stock World")
root.geometry("1350x722+5+5")
root.configure(bg=b)

fr  = Frame(root)
fr.configure(bg=b)
fr.place(relx=0.01,rely=0.11,width=1310,height=635)

我一直试图获得一个网站的股票访问和不同的页面在一个单一的点击。

代码语言:javascript
复制
def get_web_result():
    for i in range(1,2):
        try:
            lnk="https://www.moneycontrol.com/broker-research/latestResearchReport/"+str(i)
            url = urllib.request.urlopen(lnk)
        except:
            messagebox.showwarning("Notification","Check your internet connection and try again later !!!")

        bs = BeautifulSoup(url,"html.parser")
        tg = bs('tbody')
        
        for line in tg:
            lne = line.text
            fopen = open("stock.txt","w")
            f = fopen.writelines(lne.strip())

    i=i+1

    fopen = open("stock.txt","r")
    fopen = fopen.readlines()
    x=0.01
    y=0.02
    a=1
    for l in fopen:
        if len(l)>0:
            if a==1: #date
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.005,rely=y)

            elif a==2: #company
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.09,rely=y)

            elif a==3: #broker
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.20,rely=y)

            elif a==4: #buy or sell
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.31,rely=y)

            elif a==5: #report price
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.38,rely=y)

            elif a==6: #cmp
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.475,rely=y)

            elif a==7: #target price
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.56,rely=y)

            elif a==8: #profit
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.62,rely=y)

            elif a==9: #realized return
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.70,rely=y)

            elif a==10: #sensex return
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.81,rely=y)

            elif a==11:  #
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.98,rely=y)

            elif a==12:  #
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.99,rely=y)

            elif a==13:  #
                lb = Label(fr,text=l, font=("arial",10),fg="white",bg=b)
                lb.place(relx=0.99,rely=y)


        else:
            pass

        a=a+1
        if a == 14:
            y=y+0.03
            a=1

上面的代码在tkinter窗口中显示输出。

代码语言:javascript
复制
lf = "{Arial} 13 bold"

money_ctrl = Button(root,text = "Get Result....!!!",font=("Bahnschrift",13,"bold"),fg="white",bg="#363ddb",command = get_web_result)
money_ctrl.place(relx=0.01,rely=0.01,width=490)

date_lb =Label(root,text="Date",font=lf ,fg="#ffc202",bg=b)
date_lb.place(relx=0.03,rely=0.075)

stockname_lb =Label(root,text="Company",font=lf ,fg="#ffc202",bg=b)
stockname_lb.place(relx=0.10,rely=0.075)

broker_lb =Label(root,text="Broker",font=lf ,fg="#ffc202",bg=b)
broker_lb.place(relx=0.21,rely=0.075)

bors_lb =Label(root,text="Buy/Sell",font=lf ,fg="#ffc202",bg=b)
bors_lb.place(relx=0.30,rely=0.075)

prs_lb =Label(root,text="Report Price",font=lf ,fg="#ffc202",bg=b)
prs_lb.place(relx=0.37,rely=0.075)

cmpp_lb =Label(root,text="CMP",font=lf ,fg="#ffc202",bg=b)
cmpp_lb.place(relx=0.47,rely=0.075)

tgt_lb =Label(root,text="Target price",font=lf ,fg="#ffc202",bg=b)
tgt_lb.place(relx=0.53,rely=0.075)

pf_lb =Label(root,text="Profit %",font=lf ,fg="#ffc202",bg=b)
pf_lb.place(relx=0.62,rely=0.075)

rr_lb =Label(root,text="Realized Return",font=lf ,fg="#ffc202",bg=b)
rr_lb.place(relx=0.68,rely=0.075)

ss =Label(root,text="Sensex Return",font=lf ,fg="#ffc202",bg=b)
ss.place(relx=0.79,rely=0.075)

root.mainloop()

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-11-12 01:17:26

不能使用Scrollbar滚动Frame

您可以将ScrollbarCanvasListboxText一起使用。

你也可以把Frame放在CanvasText上,这样你就可以把Frame放在CanvasText上,滚动CanvasText,它就会滚动Frame

但是有一个更简单的方法。您可以将Frame放在ScrolledText上,而不必添加Scrollbar

要将微件放在ScrolledText (或Canvas)上,必须使用window_create()而不是widget

我还在ScrolledText中设置了state='disable',这样就不能在ScrolledText中编辑和删除文本和小部件,也不能意外删除Frame

代码语言:javascript
复制
import tkinter as tk
from tkinter.scrolledtext import ScrolledText

root = tk.Tk()

text = ScrolledText(root, state='disable')
text.pack(fill='both', expand=True)

frame = tk.Frame(text)
text.window_create('1.0', window=frame)

for number in range(30):
    l = tk.Label(frame, text='Input:', bg='red')
    l.grid(row=number, column=0, sticky='we')
    l = tk.Label(frame, text=number, bg='green')
    l.grid(row=number, column=1, sticky='we')
    
root.mainloop()  

编辑:

从页面读取数据的版本

代码语言:javascript
复制
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
import urllib.request
from bs4 import BeautifulSoup
import csv

# --- classes ---

#class MyWidget(tk.Frame):
#    pass

# --- functions ---

def get_data(pages=3):

    data = []

    for page in range(1, pages+1):
        print('--- page:', page, '---')
        
        try:
            url = f"https://www.moneycontrol.com/broker-research/latestResearchReport/{page}"
            response = urllib.request.urlopen(url)
        except Exception as ex:
            print('ex:', ex)
            messagebox.showwarning("Notification", "Check your internet connection and try again later !!!")

        soup = BeautifulSoup(response.read(), "html.parser")
        all_rows = soup.find('tbody').find_all('tr')
        for number, row in enumerate(all_rows, 1):
            print('row:', number)
            all_cells = row.find_all('td')
            all_cells = [x.get_text(strip=True) for x in all_cells]
            data.append(all_cells)

    return data

# --- main ---

data = get_data()

header = ['Date', 'Company', 'Broker', 'Reco', 'Price on Report dt.', 'CMP', 'Target Price', 'Profit Ptial %', 'Realized Return', 'Sensex Return', 'PDF']

with open('output.csv', 'w') as fh:
    csv_writer = csv.writer(fh)
    csv_writer.writerow(header)
    csv_writer.writerows(data)

root = tk.Tk()

text = ScrolledText(root, state='disable')
text.pack(fill='both', expand=True)

frame = tk.Frame(text)
text.window_create('1.0', window=frame)

for row_number, row in enumerate(data):
    for col_number, (name, color) in enumerate([('Date', 'red'), ('Company', 'green'), ('Broker', 'yellow')]):
        value = row[col_number]
        l = tk.Label(frame, text=f'{name}: {value}', bg=color)
        l.grid(row=row_number, column=col_number, sticky='we')
    
root.mainloop()

结果:

我在考虑创建自己的小部件MyWidget来显示单行数据-然后我可以显示多个MyWidget -但我跳过了这个想法。

如果你想做一些计算,最好将它保存为pandas.DataFrame,然后你可以将它显示为表pandastable,也许它可以更快地显示它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69934460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档